我有一个包含大量表的数据库。有些表归 postgres 用户所有,而不是我创建的表。我想将此类表的所有权转移到我创建的表上,因为在进行 django 迁移时,您只能为 psql 连接设置一个用户和密码,并且该用户无权访问 postgres 用户拥有的表,因此迁移未完成。
到目前为止,谷歌搜索并没有帮助,因为他们建议使用ALTER
或REASSIGN OWNED
来更改数据库或表的所有权。但问题是这些不能改变某些表的所有权,因为它们需要由postgres
拥有。我可以通过逐个选择每个表来手动更改所有权,但是当尝试完全这样做时,我收到一个错误说
"ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system"
.
手动更改一百多个表不是一种选择。有没有人对这个问题有任何解决方法?
你试过anonymous code block
吗?下面的代码块从属于用户postgres
的架构public
中选择所有表,并将所有权设置为用户user
:
DO $$
DECLARE row RECORD;
BEGIN
FOR row IN SELECT * FROM pg_tables
WHERE schemaname = 'public' AND tableowner = 'postgres' LOOP
EXECUTE FORMAT('ALTER TABLE %I.%I OWNER TO user',row.schemaname,row.tablename);
END LOOP;
END;
$$;
请记住,此操作将修改架构中属于给定用户的所有表的所有权。显然,您可以通过更改循环中的pg_tables
查询来进一步过滤这些表。看看:
SELECT * FROM pg_tables WHERE schemaname = 'public' AND tableowner = 'postgres';
小心使用它!
编辑:要从上面的选择中过滤掉几个表,请添加一个NOT IN
,例如:
SELECT * FROM pg_tables
WHERE schemaname = 'public' AND tableowner = 'postgres'
AND tablename NOT IN ('table1','table2','table3')