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

标签 postgresql

在不创建函数的情况下对一个查询中的所有 pgsql 项目授予权限或设置 OWNER。

  • 观点
  • 职能
  • 表格
  • 序列

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

也许这对某人有帮助。

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

    执行“改变” || tbl.o || ' ' || tbl.sn || 'OWNER TO admin';

    EXECUTE 'GRANT ALL ON' || tbl.o || ' ' || tbl.sn || '致管理员';

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

最佳答案

您必须使用 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);

关于PostgreSQL 在一个查询中更改所有项目(TABLE、SEQ、FUNC、VIEW)GRANT/OWNER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18722755/

相关文章:

database - 何时创建新的 RDS 实例与新数据库?

postgresql - 如何重置表的存储参数

postgresql - 在 postgres 中,如何找到一个范围内的记录,然后在两侧找到范围外的单个记录?

PostgreSQL,在不使用辅助键的情况下查询两个(或更多)表

mysql - 通过映射表(Sql)获取映射列名

java - 带有随机插入的 PostgreSQL 循环

Django Memcached - 如何检查是否使用了 memcached?

Python,Cygwin - 导入错误 : No module named _psycopg

sql - 将一个查询的 X 个结果附加到另一个查询的 X 个结果(没有外键连接)

sql - 选择行数,按 PostgreSQL 中时间间隔的动态范围排序