对数据库中的所有模式授予使用权?

ted*_*r42 19 postgresql postgresql-9.3 amazon-rds

我想要GRANT USAGE一个给定数据库的用户/角色。数据库有许多模式。

我知道有一个ON ALL TABLES IN SCHEMA,但我想要“所有模式”。我试过了GRANT USAGE .. ON DATABASE,但这显然是错误的(它实际上并不存在)。

这是针对 Postgres 9.3 或 9.4,它恰好是 AWS RDS 上的服务器。

dez*_*zso 22

你至少有两个选择。

第一个使用小查询和文本编辑器。我们必须收集我们感兴趣的模式:

SELECT nspname
  FROM pg_namespace;
Run Code Online (Sandbox Code Playgroud)

WHERE如果要限制范围,可以添加子句。复制输出并修改它,这样你就会得到一些GRANT USAGE ON SCHEMA ... TO your_role;命令。然后只需将其提供给psql,例如:

psql -f multigrant.sql
Run Code Online (Sandbox Code Playgroud)

一个通常的变体可能是一个 shell 脚本,它循环收集的名称和调用psql,将构造的GRANT语句传递给-c选项。

另一种解决方案在一个 pl/pgsql 块中基本相同,构建动态查询。核心是一样的——我们必须收集模式。然后我们遍历所有这些,通过架构授予权限架构:

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
    END LOOP;
END;
$do$;
Run Code Online (Sandbox Code Playgroud)

注意事项

  • 与表、序列、函数和类型不同,不能为模式设置默认权限(从 9.4 开始)。您必须手动为任何新添加的架构授予此权限。
  • 在这里,我在构建动态查询时使用美元引用。例如,这允许我使用“普通”语法,而不是乘以单引号(本示例中不存在)。这样,大多数编辑将很好地突出显示语句。
  • 我也使用format()%I格式说明有必要时对象名称正确引用。这种方法比用字符串常量和一些quote_ident()调用的串联构建查询更具可读性。
  • pg_namespace可以在pg_catalog架构中找到。查看那里的其他对象 - 它们存储您的模式、表等的各个方面。


小智 5

你也可以使用。

DO $do$
DECLARE
    sch text;
BEGIN
    FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' 
    and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1'
    and nspname != 'pg_statistic' and nspname != 'pg_catalog'
    and nspname != 'information_schema'
    LOOP
        EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch);
        EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO your_role $$, sch);

        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch);
        EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch);
    END LOOP;
END;
$do$;
Run Code Online (Sandbox Code Playgroud)