【问题标题】:How to alter the ownership of some tables inside a database from postgres to another user?如何将数据库中某些表的所有权从 postgres 更改为另一个用户?
【发布时间】:2020-05-04 05:54:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • 首先确保原始所有者仍然有权访问它们(因此添加权限)。
  • 您不能更改系统对象的所有权,因此您应该只更改您的项目表的所有权。
  • 您不需要更改所有权,并且如上所述不能对系统对象进行更改。但所有者可以向您的用户授予必要的访问权限。

标签: sql django postgresql psql django-migrations


【解决方案1】:

你试过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 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')

【讨论】:

  • 您好,感谢您的回答。但我无法将所有所有权更改给用户。 postgres 要求某些表由 postgres 用户本身拥有。有解决办法吗?
  • @cmkishores 用户postgres 需要保留多少表?如果它们不是很多,我们可以手动将它们从选择中排除。如果它们很多,我们需要找到一种模式来自动过滤掉它们
  • 如果 LOOP 行如下,脚本会更通用:LOOP EXECUTE 'ALTER TABLE ' || row.schemaname || '.' || row.tablename || ' OWNER TO user';
  • @sleepy012 非常感谢您的提示。我相信在 2020 年 1 月,我要么没有太在意,要么只是不太了解:D 我只是编辑了答案以适应模式名称。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2023-03-22
  • 2018-06-12
  • 2017-04-02
相关资源
最近更新 更多