首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数据库中某些表的所有权从postgres更改为其他用户?

如何将数据库中某些表的所有权从postgres更改为其他用户?
EN

Stack Overflow用户
提问于 2020-01-17 10:40:59
回答 1查看 4.1K关注 0票数 1

我有一个数据库,其中包含大量的表。有些表是postgres用户拥有的,而不是我创建的表。我希望将这些表的所有权传递给我创建的表,因为在执行django迁移时,只能为psql连接设置一个用户和密码,而且该用户无法访问postgres用户拥有的表,因此迁移没有完成。

到目前为止,googling并没有起到什么作用,因为他们建议使用ALTERREASSIGN OWNED来改变数据库或表的所有权。但问题是,这些不能改变某些表的所有权,因为这些表必须由postgres.拥有。我可以一个一个地选择每个表来手动更改所有权,但是当尝试完全更改时,我会看到一个错误:

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

手动更改100多个表不是一个选项。有人对这个问题有什么解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-17 11:12:45

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

代码语言:javascript
复制
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查询来进一步过滤这些表。看一看:

代码语言:javascript
复制
SELECT * FROM pg_tables WHERE schemaname = 'public' AND tableowner = 'postgres';

小心使用它!

编辑:要从上面的选择中筛选出几个表,添加一个NOT IN,例如:

代码语言:javascript
复制
SELECT * FROM pg_tables 
WHERE schemaname = 'public' AND tableowner = 'postgres'
AND tablename NOT IN ('table1','table2','table3')
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59785733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档