Mar*_*tin 5 permissions postgresql-9.2
我想要
GRANT SELECT
ON ALL TABLES
TO foo;
Run Code Online (Sandbox Code Playgroud)
但是 postgres 告诉我“TO”有一个语法错误。它期望像这样的 GRANT:
GRANT SELECT
ON ALL TABLES
IN SCHEMA public
TO foo;
Run Code Online (Sandbox Code Playgroud)
我们已经碎片化,使得表了一把public,shard123和shard124一切有一个表my_table,并public.my_table为双方的父母shard123.my_table和shard124.my_table。对于公共模式,我已将 SELECT 授予 foo,但 foo 没有任何分片模式的权限。
我也做过:
ALTER DEFAULT PRIVILEGES
FOR ROLE dba
GRANT SELECT
ON TABLES
TO foo;
Run Code Online (Sandbox Code Playgroud)
...它应该自动授予从现在开始创建的任何新表和模式。
有 1000 < n < 10000 个分片/模式,因此为每个分片/模式单独授予是不切实际的。
如何为所有现有模式(所有分片)中的所有现有表授予角色?
或者更好的是,我可以为所有模式 GRANTLIKE 'shard%'吗?
如果您只需执行一次此操作,最快的方法可能是以下。
通过查询找到您想要触及的所有架构,例如pg_namespace系统目录:
SELECT nspname
FROM pg_namespace
WHERE nspname LIKE 'shard%'; -- tweak this to your needs
Run Code Online (Sandbox Code Playgroud)
然后我们可以将查询输出扩展为GRANT语句:
SELECT 'GRANT SELECT ON ALL TABLES IN SCHEMA ' || nspname || ' TO foo;'
FROM pg_namespace
WHERE nspname LIKE 'shard%';
Run Code Online (Sandbox Code Playgroud)
这将为您提供大量语句,您只需复制并运行即可。由于您有大量模式,最简单的可能是以下内容(在 中运行psql):
\copy (SELECT 'GRANT ...' ...) TO some_local_file.sql
\i some_local_file.sql
Run Code Online (Sandbox Code Playgroud)
当然,如果您愿意,也可以使用动态 SQL 来完成此操作 - 我发现上述解决方案稍好一些,因为它会留下一个包含所采取操作的文件,然后可以在版本控制下签入该文件。
如果您碰巧使用psql版本 9.6(或更高版本),则还有另一种可能使用\gexec:
SELECT 'GRANT SELECT ...'
... -- you can even omit the semicolon here
\gexec
Run Code Online (Sandbox Code Playgroud)
笔记:
GRANT。由于您在这里需要的东西并不罕见,因此我预计此功能迟早会出现。| 归档时间: |
|
| 查看次数: |
5343 次 |
| 最近记录: |