1

GRANT 权限或在一个查询中将 OWNER 设置为所有 pgsql 项,而不创建函数。

  • 意见
  • 功能
  • 序列

因为我花了很多时间试图找到这样的解决方案。我只是发现几个单独的查询或函数,但没有 sql 可以一次完成整个工作。

也许这对某人有帮助。

  1. 填写WHERE s IN(?)您需要的方案。
  2. 创建要对LOOP块中的所有对象执行的查询,类似于:

    EXECUTE 'ALTER ' || tbl.o || ' ' || tbl.sn || ' OWNER TO admin';或者

    EXECUTE 'GRANT ALL ON ' || tbl.o || ' ' || tbl.sn || ' TO admin';

SQL查询:

DO $$DECLARE tbl record;
BEGIN
    FOR tbl IN 
        SELECT o, s || '.' || n sn
        FROM (
            SELECT 'FUNCTION' o, nspname s, proname || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ')' n
            FROM pg_catalog.pg_namespace n 
            JOIN pg_catalog.pg_proc p ON pronamespace = n.oid

            UNION

            SELECT 'TABLE' o, nspname s, relname n
            FROM pg_class c
            JOIN pg_namespace n ON (c.relnamespace = n.oid) 
            WHERE   nspname NOT LIKE E'pg\\_%' AND 
                nspname <> 'information_schema' AND 
                relkind IN ('r','S','v')
            ) tbl
        WHERE s IN('public')
    LOOP
        EXECUTE 'ALTER ' || tbl.o || ' ' || tbl.sn || ' OWNER TO admin';
        -- EXECUTE 'GRANT ALL ON ' || tbl.o || ' ' || tbl.sn || ' TO admin';
    END LOOP;
END$$;
4

1 回答 1

3

您必须使用 pl/pgsql 因为ALTER TABLE语句是计划外的。

不过,您应该为您的代码做一件关键的事情,那就是您需要在ALTER TABLE语句中转义 args。从概念上讲,您要更改:

    EXECUTE 'ALTER ' || tbl.o || ' ' || tbl.sn || ' OWNER TO admin';

    EXECUTE 'ALTER ' || tbl.o || ' ' || quote_ident(tbl.sn) || ' OWNER TO admin';

但这会在桌子上,所以你真的需要将 quote_ident 添加到你的顶级函数中。因此,与其改变,不如改变:

SELECT 'FUNCTION' o, nspname s, proname || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ')' n

 SELECT 'FUNCTION' o, nspname s, quote_ident(proname) || '(' || pg_catalog.pg_get_function_identity_arguments(p.oid) || ')' n

 SELECT 'TABLE' o, nspname s, relname n

 SELECT 'TABLE' o, nspname s, quote_ident(relname) n

否则,如果有人这样做,你会得到一个有趣的惊喜:

 CREATE TABLE "pg_autid owner to postgres; drop schema public cascade; --"(foo int);
于 2013-11-14T07:47:48.883 回答