在不创建函数的情况下对一个查询中的所有 pgsql 项目授予权限或设置 OWNER。
- 观点
- 职能
- 表格
- 序列
因为我花了很多时间试图找到这样的解决方案。我只发现了几个单独的查询或函数,但没有 sql 可以一次完成整个工作。
也许这对某人有帮助。
- 用您需要的方案填写
WHERE s IN(?)
。 在
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/