Postgresql:更改所有者对象时出现错误“必须是关系的所有者”

Posted

技术标签:

【中文标题】Postgresql:更改所有者对象时出现错误“必须是关系的所有者”【英文标题】:Postgresql: error "must be owner of relation" when changing a owner object 【发布时间】:2015-04-19 12:21:12 【问题描述】:

什么是grant 选项/技巧我需要给当前用户(“userA”)以允许他更改属于另一个用户的对象的所有者(“用户C")?

更准确地说,contact 表由 userC 拥有,当我执行以下查询以将所有者更改为 userB 时,与 userA 连接:

alter table contact owner to userB;

我收到此错误:

ERROR:  must be owner of relation contact

userA 拥有正常执行此操作所需的所有权限(“create on schema”授权选项应该足够了):

grant select,insert,update,delete on all tables in schema public to userA; 
grant select,usage,update on all sequences in schema public to userA;
grant execute on all functions in schema public to userA;
grant references, trigger on all tables in schema public to userA;
grant create on schema public to userA;
grant usage on schema public to userA;

感谢


命令行输出:

root@server:~# psql -U userA myDatabase
myDataBase=>\dt contact
    List of relations
Schema |  Name   |   Type   |  Owner
-------+---------+----------+---------
public | contact | table    | userC
(1 row)
myDataBase=>
myDataBase=>alter table contact owner to userB;
ERROR:  must be owner of relation public.contact
myDataBase=>

【问题讨论】:

【参考方案1】:

感谢 Mike 的评论,我重新阅读了该文档,我意识到我当前的用户(即已经拥有 create 权限的 userA)不是 direct /新拥有角色的间接成员...

所以解决方案非常简单——我刚刚完成了这项拨款:

grant userB to userA;

这就是所有人;-)


更新:

另一个要求是对象必须由用户 userA 拥有,然后才能对其进行更改...

【讨论】:

当我们使用错误的用户执行更新/删除等操作时出现此问题。我正面临此问题,因为我使用错误的用户执行 DML。当我选择正确的用户时,问题已解决.另外,如果您将DML权限授予当前用户,这个问题将得到解决。 只想提一下,如果任何用户区分大小写,则应将其引用。例如:将“UserB”授予 userA -> 在这种情况下,第一个用户区分大小写,但第二个用户不区分 这对我有用,而不是为所有权做alter table ,只需运行它就可以了。我只是将此命令读为grant createUser to alterUser;,其中createUser 是创建我的表的人,alterUser 是尝试改变它的人。我遇到了这个问题,我们在配置中更改了 DB 用户,而 DB 现有的表很少。【参考方案2】:

来自the fine manual。

您必须拥有该表才能使用 ALTER TABLE。

或者是数据库超级用户。

错误:必须是关系联系人的所有者

PostgreSQL 错误消息通常会出现。这个很到位。

【讨论】:

文档更加细致入微:您*必须拥有该表*才能使用 ALTER TABLE。 [...] 要更改所有者,您*还必须是新拥有角色的直接或间接成员*,并且该角色必须对表的架构具有 CREATE 权限。 => 目标用户(又名.userB) 已经拥有创建权限。在架构上,但我当前的用户(又名 userA)不是新角色的间接成员。感谢 Mike 启发了我! 一个 RTFM 答案,如果我找到了! 或者你可以这样做:dba.stackexchange.com/questions/27380/…【参考方案3】:

这解决了我的问题:更改所有权的示例 alter table 语句。

ALTER TABLE databasechangelog OWNER TO arwin_ash;
ALTER TABLE databasechangeloglock OWNER TO arwin_ash;

【讨论】:

请在您的回答中添加一些解释。 要更改所有权,您需要成为所有者哈哈 拥有超级用户角色后,我运行这些命令以使自己成为相应对象的所有者。这让我可以运行 alter、delete 命令。谢谢!

以上是关于Postgresql:更改所有者对象时出现错误“必须是关系的所有者”的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 PostgreSQL 中创建生成的列时出现错误?

42501:在 Postgresql 中查询时出现特权不足错误

尝试插入长数组时出现 Postgresql 错误

将 oracle 转换为 PostgreSQL 时出现数字溢出

尝试使用 if 语句创建函数时出现 Postgresql 语法错误

尝试从节点应用程序连接时出现 PostgreSQL 错误