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

101

如何授予当前用户(“userA”)更改属于另一个用户(“userC”)拥有的对象所有者的权限/技巧?

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

alter table contact owner to userB;

我遇到了这个错误:

ERROR:  must be owner of relation contact

但是用户A通常拥有执行此操作所需的所有权限(“在架构上创建”授权选项应该足够):

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=>
5个回答

175
由于Mike的评论,我重新阅读了文档,并意识到我的当前用户(即已经拥有“创建”权限的userA)不是新所有角色的直接/间接成员...所以解决方案很简单 - 我只需要执行这个授权:
grant userB to userA;

就这样啦;-)


更新:

另一个要求是在更改之前,该对象必须由用户userA拥有...


这个问题出现在我们使用错误的用户执行更新/删除等操作时。我之前遇到了这个问题,因为我使用了错误的用户来执行DML操作。当我选择正确的用户时,问题得到了解决。此外,如果您将DML权限授予当前用户,则可以解决此问题。 - Ankur Srivastava
1
只想提醒一下,如果任何用户区分大小写,应该加引号。例如:grant "UserB" to userA -> 在这种情况下,第一个用户区分大小写,但第二个用户不区分大小写。 - gdvalderrama
这对我有用,与其为所有权做alter table,只需运行此命令即可解决问题。我将此命令理解为grant createUser to alterUser;,其中createUser是创建我的表的人,而alterUser则是试图更改它的人。我遇到了这个问题,因为我们在配置中更改了DB用户,而DB中有一些现有的表格。 - Swapnil Chincholkar
这在进行中。 - Anushka Fernando

25

这解决了我的问题:使用ALTER TABLE语句来更改所有权。

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

6
要更改所有权,您需要是所有者。哈哈 - Guilherme Alencar
2
在我获得超级用户角色之后,我运行了这些命令,使自己成为相应对象的所有者。这使我能够运行修改、删除命令。谢谢! - Shankar Naru

24

来自官方手册.

你必须拥有这张表才能使用 ALTER TABLE 命令。

或者成为数据库超级用户。

ERROR: 必须是关系 contact 的所有者

PostgreSQL 错误信息通常非常准确。这个错误信息也是如此。


5
这份文档更加细致:要使用ALTER TABLE,你必须拥有这张表。如果要修改所有者,你也必须是新所有者角色的直接或间接成员,并且该角色必须对表的模式具有CREATE权限。 在这里,目标用户(即用户B)已经在模式上有了创建权限,但我的当前用户(即用户A)不是新角色的间接成员。 感谢Mike启发我! - gudepier
1
如果我找到了一个RTFM答案! - Michael M
或者你可以这样做:https://dba.stackexchange.com/questions/27380/error-creating-index-on-postgresql-9-1 - Vincent

0
运行以下命令,授予所有表、视图和序列的所有者权限:
# Tables
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" <db_name>` ; do  psql -c "alter table \"$tbl\" owner to <db_user>" <db_name> ; done

# Views 
for tbl in `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" <db_name>` ; do  psql -c "alter view \"$tbl\" owner to <db_user>" <db_name> ; done

# Sequences
for tbl in `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" <db_name>` ; do  psql -c "alter sequence \"$tbl\" owner to <db_user>" <db_name> ; done

0

对我来说,我必须拥有完整数据库的所有权。当我尝试在Django中运行迁移(py manage.py migrate)时,情况就是这样。

我是如何做到的,在PostgreSQL shell中,请运行此命令:

ALTER DATABASE <name> OWNER TO <user>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接