我想要给GRANT USAGE
定数据库的用户/角色。该数据库具有许多架构。
我知道有一个ON ALL TABLES IN SCHEMA
,但是我想要“所有模式”。我试过了GRANT USAGE .. ON DATABASE
,但这显然是错误的(实际上并不存在)。
这是针对Postgres 9.3或9.4,它恰好是在AWS RDS上的服务器。
我想要给GRANT USAGE
定数据库的用户/角色。该数据库具有许多架构。
我知道有一个ON ALL TABLES IN SCHEMA
,但是我想要“所有模式”。我试过了GRANT USAGE .. ON DATABASE
,但这显然是错误的(实际上并不存在)。
这是针对Postgres 9.3或9.4,它恰好是在AWS RDS上的服务器。
Answers:
您至少有两个选择。
第一个利用一个小的查询和一个文本编辑器。我们必须收集我们感兴趣的模式:
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$;
注意事项:
format()
与%I
格式说明符一起使用,以便在必要时正确引用对象名称。这种方法比使用字符串常量和一些quote_ident()
调用的连接构建查询要容易得多。pg_namespace
可以在pg_catalog
模式中找到。检查那里的其他对象-它们存储模式,表等的各个方面。您也可以使用。
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$;
grant usage
。