我如何为所有模式中的所有表授予权限

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)

我们已经碎片化,使得表了一把publicshard123shard124一切有一个表my_table,并public.my_table为双方的父母shard123.my_tableshard124.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%'吗?

dez*_*zso 4

如果您只需执行一次此操作,最快的方法可能是以下。

通过查询找到您想要触及的所有架构,例如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。由于您在这里需要的东西并不罕见,因此我预计此功能迟早会出现。
  • 只是强调一下,上面的命令将对已经存在的表起作用。未来的表需要默认权限(您为给定角色设置的权限)。