GRANT权限或将OWNER设置为一个查询中的所有pgsql项而不创建函数。
因为我花了很多时间试图找到这样的解决方案。我刚发现几个单独的查询或函数,但没有一次可以完成整个工作的SQL。
也许这会对某人有所帮助。
WHERE s IN(?)
。创建要在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$$;
答案 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);