如何将数据库中某些表的所有权从 postgres 更改为另一个用户?

cmk*_*res 1 sql django postgresql psql django-migrations

我有一个包含大量表的数据库。一些表归 postgres 用户所有,而不是我创建的。我想将此类表的所有权转移到我创建的表中,因为在执行 django-migrations 时,您只能为 psql 连接设置一个用户和密码,而该用户无权访问 postgres 用户拥有的表,因此迁移未完成。

到目前为止,谷歌搜索没有帮助,因为他们建议使用ALTER或REASSIGN OWNED 更改数据库或表的所有权。但问题是这些不能更改某些表的所有权,因为它们必须由postgres. 我可以通过逐个选择每个表来手动更改所有权,但是在尝试完全执行时,我收到一条错误消息

"ERROR: cannot reassign ownership of objects owned by role postgres because they are required by the database system".

手动更改一百多个表不是一种选择。有没有人对此问题有任何解决方法?

Jim*_*nes 5

你有没有试过anonymous code block?下面的代码块从架构中选择public属于用户的所有表postgres并将所有权设置为用户user:

DO $$
DECLARE row RECORD;
BEGIN
  FOR row IN SELECT * FROM pg_tables 
    WHERE schemaname = 'public' AND tableowner = 'postgres'
    LOOP EXECUTE 'ALTER TABLE ' || row.tablename || ' OWNER TO user';
  END LOOP;
END;
$$;
Run Code Online (Sandbox Code Playgroud)

请记住,此操作将修改架构中属于给定用户的所有表的所有权。显然,您可以通过更改pg_tables循环中的查询来进一步过滤这些表。看一眼:

SELECT * FROM pg_tables WHERE schemaname = 'public' AND tableowner = 'postgres';
Run Code Online (Sandbox Code Playgroud)

小心使用!

编辑:要从上面的选择中过滤掉一些表,请添加一个NOT IN,例如:

SELECT * FROM pg_tables 
WHERE schemaname = 'public' AND tableowner = 'postgres'
AND tablename NOT IN ('table1','table2','table3')
Run Code Online (Sandbox Code Playgroud)