是否可以在数据库中的所有模式上使用?


13

我想要给GRANT USAGE定数据库的用户/角色。该数据库具有许多架构。

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

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

Answers:


18

您至少有两个选择。

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

SELECT nspname
  FROM pg_namespace;

WHERE如果要限制范围,可以添加一个子句。复制输出并进行修改,这样您将获得许多GRANT USAGE ON SCHEMA ... TO your_role;命令。然后将其输入psql,例如:

psql -f multigrant.sql

通常的变体可能是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$;

注意事项

  • 与表,序列,函数和类型不同,不能为模式设置默认特权(从9.4开始)。您将必须为任何新添加的架构手动授予此特权。
  • 在这里,我在建立动态查询时使用美元报价。这使我可以使用“常规”语法,而不是例如与单引号相乘(在此示例中不存在)。这样,大多数编辑器都会很好地突出显示语句。
  • 我还format()%I格式说明符一起使用,以便在必要时正确引用对象名称。这种方法比使用字符串常量和一些quote_ident()调用的连接构建查询要容易得多。
  • pg_namespace可以在pg_catalog模式中找到。检查那里的其他对象-它们存储模式,表等的各个方面。

1
我想知道您是否可以通过使用为新模式自动运行的事件触发器来模拟新创建的模式的默认特权grant usage
a_horse_with_no_name 2015年

@a_horse_with_no_name在考虑它,我认为目前没有理由无法完成它。
dezso 2015年

0

您也可以使用。

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 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 backup_user $$, 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$;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.