PostgreSQL CREATE TABLE 创建的所有者不正确

Gil*_*mas 6 postgresql permissions postgresql-9.2

我正在使用 PostgreSQL 9.2.4。当我在非超级用户拥有的数据库中以非超级用户身份创建表时,它归postgres用户所有,因此除非我明确授予自己权限,否则我无法将任何数据放入其中。

我创建了这样的非超级用户:

admin_user=# create role "test1" NOINHERIT LOGIN ENCRYPTED PASSWORD 'wibble' CONNECTION LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个test1像这样拥有的数据库:

admin_user=# create database "test1$db1" with owner "test1";
Run Code Online (Sandbox Code Playgroud)

然后我以 user 身份启动了一个新的 psql test1,并创建了一个表:

test1$db1=> create table test_table (column_name varchar(50));
Run Code Online (Sandbox Code Playgroud)

但我无法插入其中:

test1$db1=> insert into test_table values ('some data');                                                                                                    
ERROR:  permission denied for relation test_table
Run Code Online (Sandbox Code Playgroud)

检查权限显示该表归postgres用户所有:

test1$db1=> \dt
             List of relations
 Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
 public | test_table     | table | postgres
Run Code Online (Sandbox Code Playgroud)

但是,我可以授予自己权限并执行以下操作:

test1$db1=> grant insert, select on test_table to test1;                                                                                                    
GRANT
test1$db1=> insert into test_table values ('some data'); 
INSERT 0 1
test1$db1=> select * from test_table;
 column_name 
-------------
 some data
(1 row)
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我很确定这曾经有效。CREATE TABLEPostgreSQL 文档

CREATE TABLE 将在当前数据库中创建一个新的、初始为空的表。该表将由发出命令的用户拥有。

必须在我自己的表上授予我自己的权限听起来不像是我应该做的。

非常感谢任何帮助!

[更新]

看起来这可能是由http://apt.postgresql.org/pub/repos/apt/上的 PostgreSQL 包的某种更改引起的

我们有三个机器映像,所有这些映像都从该源安装了 PostgreSQL:

  • 在 2013 年 7 月 23 日 18:47 UTC 安装 -- 正确的表所有权
  • 在 2013 年 7 月 23 日 19:39 UTC 安装 -- 正确的表所有权
  • 在 2013 年 7 月 24 日 13:16 UTC 安装 -- 错误

因此,也许包装中发生了一些变化。我会在邮件列表中添加一行。

Erw*_*ter 5

原来你的新桌子的主人postgres是个很奇怪的人

无论哪种方式,默认情况下,您都可以使用以下命令使 Postgres 授予或撤销任何角色的任何权限ALTER DEFAULT PRIVILEGES

ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT INSERT, UPDATE, DELETE ON TABLES TO test1;
Run Code Online (Sandbox Code Playgroud)


Gil*_*mas 5

好的,感谢大家的帮助。

但正如经常发生的非常奇怪的事情一样,结果证明这是一个我完全忘记的额外因素。我们使用 Dimitri Fontaine 的PostgreSQL 扩展白名单模块——我们是一个共享托管环境,需要稍微锁定一些东西。看起来这是在 7 月 23 日更新的,我们已经确认,如果没有扩展,这个问题就不存在,并且确实存在。我将为 Dimitri 制作一个最小的重现并提交错误报告。

抱歉占用您的时间!