PostgreSQL在一个查询中更改所有项目(TABLE,SEQ,FUNC,VIEW)GRANT / OWNER

时间:2013-09-10 15:16:29

标签: postgresql

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';

  3. 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$$;
    

1 个答案:

答案 0 :(得分: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);