GRANT中的Redshift子查询

时间:2017-10-12 13:05:09

标签: sql amazon-redshift

我正在编写一个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进行迁移,如果有任何帮助的话。

3 个答案:

答案 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)

显然,Redshift没有处理语句中子查询的机制。由于Redshift是PostgreSQL 8.0.2的一个分支,因此它在以后的PostgreSQL版本中都没有DO blocks功能。

更好的方法是为临时和生产环境建立一个完全独立的集群,而不是拥有单独的数据库和用户。这将消除在SQL迁移语句中使用“if logic”的需要,并将避免在不同环境中共享同一群集的其他缺点。

有关如何降低登台/测试环境成本的有用提示,请参阅this发布。