Egi*_*idi 10 postgresql permissions dynamic-sql ddl postgresql-9.3
我有 100 多个名为 public.test_* 的表
我怎样才能轻松地一次GRANT ALL访问所有这些表的用户测试?
我试过:
GRANT ALL ON TABLE public.test_* TO test;
Run Code Online (Sandbox Code Playgroud)
但它不起作用......
GRANT 在表标识符中不使用通配符。
您可以使用ON ALL TABLES IN SCHEMA,但这需要一个单一的架构名称。
如果您想使用通配符模式表名称进行操作,则需要EXECUTE format(...)在DO块中使用 PL/PgSQL来循环information_schema.tables视图。在 DBA.se 和 Stack Overflow 上查看有关 PL/PgSQL 中动态 DDL 的许多相关答案。
未经测试的粗略例子给你的想法:
DO
$$
DECLARE
t record;
BEGIN
FOR t IN
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name LIKE 'test\_%'
LOOP
EXECUTE format('GRANT ALL ON TABLE %I.%I TO test;', table_schema, table_name);
END LOOP;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
对于什么%I意思,请参阅format函数的参考。如果你没有一个format函数,你的 PostgreSQL 已经过时了,你应该计划升级;您可以同时使用quote_ident和字符串连接。
什么@Craig已经解释。
另外,由于GRANT可以一次授予多个对象的权限,因此您可以使用单个语句而无需循环:
DO
$$
BEGIN
EXECUTE (
SELECT 'GRANT ALL ON TABLE '
|| string_agg (format('%I.%I', table_schema, table_name), ',')
|| ' TO test'
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_name LIKE 'test\_%'
);
END
$$;
Run Code Online (Sandbox Code Playgroud)
有关的:
| 归档时间: |
|
| 查看次数: |
6578 次 |
| 最近记录: |