我正在编写一个Redshift迁移,它将在暂存数据库和生产数据库上运行。我希望此迁移授予用户访问权限,并且用户的名称取决于要迁移的数据库。
例如,如果当前数据库是“staging_db”,我希望迁移授予“staging_user”权限;如果当前数据库是“prod_db”,我希望迁移到“prod_user”。
天真的实现看起来像这样:
GRANT SELECT
ON TABLE my_table
TO (SELECT CASE current_database()
WHEN 'staging_db' THEN 'staging_user'
WHEN 'prod_db' THEN 'db_user'
END);
虽然,这个错误告诉我GRANT语句中不允许SELECT子查询:
ERROR: syntax error at or near "("
LINE 3: TO (SELECT CASE current_database()
在Redshift中执行此操作的首选方法是什么?
修改:我正在Clojure中使用Migratus进行迁移,如果有任何帮助的话。
答案 0 :(得分:0)
使用群组(CREATE GROUP),以便您可以将权限分配给群组。
然后您唯一的问题是需要的ALTER GROUP,可以提前完成。因此,迁移脚本可以进行硬编码:
GRANT SELECT ON TABLE my_table TO MyGroup;
评论后更新
on prod(反向进行分期)
ALTER GROUP MyGroup ADD USER db_user; ALTER GROUP MyGroup DROP USER staging_user;
不要忘记GRANT USAGE ON SCHEMA
答案 1 :(得分:0)
使用migratus
,您可以运行EDN
次迁移,以便从Clojure获得完全可编程的查询。
你应该能够在那里实现那个子查询的逻辑!
答案 2 :(得分:0)