PostgreSQL如何不使用动态SQL给当前schema下所有对象赋权
原生静态SQL语法不支持直接在GRANT语句的SCHEMA子句中传入current_schema()这类动态返回的标识符,所以无法直接用你尝试的那三种写法实现需求,但可以通过数据库自带的工具/机制实现,不需要手动编写动态SQL拼接逻辑,下面是两种常用方案:
方案1:psql元命令实现(PostgreSQL适用)
如果你的CI脚本通过psql执行,可借助\gexec元命令自动执行拼接好的赋权语句,全程不需要手动处理转义、拼接逻辑:
SELECT format('GRANT SELECT ON ALL TABLES IN SCHEMA %I TO "my_dev_group";', current_schema()) \gexec
\gexec会将上一条查询返回的字符串结果直接作为SQL语句执行,完美适配运行时动态获取的schema名称。
方案2:配置默认权限+固定赋权语句
你可以在脚本开头先设置当前搜索路径为目标schema,再执行固定的赋权语句即可:
-- 脚本运行开头先指定当前操作的schema,替换为你运行时拿到的schema名称 SET search_path TO <运行时获取的schema名称>; -- 针对当前schema下所有已存在的表赋权 GRANT SELECT ON ALL TABLES IN SCHEMA current_schema TO "my_dev_group"; -- 可选配置:后续该schema下新建的表也会自动继承查询权限,不需要重复赋权 ALTER DEFAULT PRIVILEGES IN SCHEMA current_schema GRANT SELECT ON TABLES TO "my_dev_group";
如果需要同时给序列、函数开放对应权限,可以追加以下语句:
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA current_schema TO "my_dev_group"; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA current_schema TO "my_dev_group";
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

