Postgresql

PostgreSQL CREATE TABLE 使用不正確的所有者創建

  • July 31, 2013

我正在使用 PostgreSQL 9.2.4。當我在非超級使用者擁有的數據庫中以非超級使用者的身份創建表時,它歸postgres使用者所有,因此除非我明確授予自己權限,否則我不能將任何數據放入其中。

我這樣創建了非超級使用者:

admin_user=# create role "test1" NOINHERIT LOGIN ENCRYPTED PASSWORD 'wibble' CONNECTION LIMIT 10;

然後我創建了一個test1這樣擁有的數據庫:

admin_user=# create database "test1$db1" with owner "test1";

然後我以 user 身份啟動了一個新的 psql test1,並創建了一個表:

test1$db1=> create table test_table (column_name varchar(50));

但我無法插入它:

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

檢查權限顯示該表歸postgres使用者所有:

test1$db1=> \dt
            List of relations
Schema |      Name      | Type  |  Owner   
--------+----------------+-------+----------
public | test_table     | table | postgres

但是,我可以授予自己權限並做一些事情:

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)

這是怎麼回事?我很確定這曾經有效。CREATE TABLE的PostgreSQL 文件

CREATE TABLE 將在目前數據庫中創建一個新的、最初為空的表。該表將歸發出命令的使用者所有。

必須在我自己的表上授予自己權限聽起來不像是我應該做的。

非常感謝任何幫助!

$$ UPDATE $$

看起來這可能是由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 安裝 – 錯誤

因此,包裝中可能發生了一些變化。我會為此在郵件列表中寫一行。

好的,謝謝大家的幫助。

但是就像經常遇到非常奇怪的東西一樣,它原來是一個我完全忘記的額外因素。我們使用 Dimitri Fontaine 的PostgreSQL Extension Whitelist 模組——我們是一個共享託管環境,需要稍微鎖定一些東西。看起來這是在 7 月 23 日更新的,我們已經確認沒有擴展程序不存在問題,並且確實存在問題。我將為 Dimitri 整理一份最小的複製品並送出一份錯誤報告。

很抱歉佔用您的時間!

你的新桌子的主人原來postgres很奇怪

無論哪種方式,您都可以讓 Postgres 預設授予或撤銷任何角色的任何特權ALTER DEFAULT PRIVILEGES

ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT INSERT, UPDATE, DELETE ON TABLES TO test1;

引用自:https://dba.stackexchange.com/questions/47005