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)
注意事项:
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)
归档时间: |
|
查看次数: |
27298 次 |
最近记录: |