PostgreSQL GRANT ALL 在多个表上使用 LIKE

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)

但它不起作用......

Cra*_*ger 9

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和字符串连接。


Erw*_*ter 6

什么@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)

有关的: