Answers:
有一个专门的特权命令可以执行此操作RESASSIGN OWNED
。这将重新分配所有对象,而不仅仅是特定架构中的对象。
您可以ALTER TABLE
使用以下命令生成命令,
SELECT format(
'ALTER TABLE %I.%I.%I OWNER TO %I;',
table_catalog,
table_schema,
table_name,
current_user -- or another just put it in quotes
)
FROM information_schema.tables
WHERE table_schema = 'mySchema';
在psql中,您可以通过以下命令立即运行它们 \gexec
我不知道有任何方法可以完全通过psql完成此操作,但是使用bash,可以使用以下命令列出数据库$ DB中的表:
psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}
所有权可以通过以下方式转移到$ OWNER:
psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB}
将其串在一起将为您提供:
$ for table in `psql -tc "select tablename from pg_tables where schemaname = '${SCHEMA}';" ${DB}` ; do psql -c "alter table ${SCHEMA}.${table} owner to ${OWNER}" ${DB} ; done
$ DB,$ SCHEMA和$ OWNER分别代表数据库,模式(通常为“ public”)和新所有者的名称。
如果可以查询架构中的表名,则可以生成查询以更改表所有权。
例如:
select 'ALTER TABLE ' || t.tablename || ' OWNER TO new_owner;'
from pg_tables t
where t.tableowner != 'rdsadmin';
将返回查询以更改所有表的所有权:
ALTER TABLE schema_version OWNER TO ali;
ALTER TABLE users OWNER TO ali;
ALTER TABLE company OWNER TO ali;
ALTER TABLE books OWNER TO ali;
...
那么你可以运行这些:)
这个脚本可以解决问题。
sh change_owner.sh -n new_owner -S schema_name
sh change_owner.sh -n user1 -S public
Summary:
Tables/Sequences/Views : 16
Functions : 43
Aggregates : 1
Type : 2
与上面使用bash相似,但是我必须在文本文件中输出然后输入到psql中:
$ psql -qAt -d mydatabase -c "SELECT 'ALTER TABLE '||schemaname||'.'||tablename||' \
OWNER TO new_owner;' \
FROM pg_tables \
WHERE schemaname = 'myschema'" > data.txt
$ psql < data.txt -d mydatabase
基于此,但添加了数据库:http : //penningpence.blogspot.ca/2014/09/changing-owner-of-multiple-database.html
我使用此函数来更改模式中的表,视图和函数所有权。它快速,干净并且是如何使用游标的一个很好的例子。另外,不需要命令行。
以下将通过plpgsql函数更改权限:
CREATE OR REPLACE FUNCTION YOURSCHEMA.do_changeowner(
newowner text,
pschem text)
RETURNS void AS
$BODY$
declare
tblnames CURSOR FOR
SELECT tablename FROM pg_tables
WHERE schemaname = pschem;
viewnames CURSOR FOR
SELECT viewname FROM pg_views
WHERE schemaname = pschem;
funcnames CURSOR FOR
SELECT p.proname AS name, pg_catalog.pg_get_function_identity_arguments(p.oid) as params
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = pschem;
begin
FOR stmt IN tblnames LOOP
EXECUTE 'alter TABLE ' || pschem || '.' || stmt.tablename || ' owner to ' || newowner || ';';
END LOOP;
FOR stmt IN viewnames LOOP
EXECUTE 'alter VIEW ' || pschem || '.' || stmt.viewname || ' owner to ' || newowner || ';';
END LOOP;
FOR stmt IN funcnames LOOP
EXECUTE 'alter FUNCTION ' || pschem || '.' || stmt.name || '(' || stmt.params || ') owner to ' || newowner || ';';
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;