2015-02-24 56 views
0

PostgreSQL中新關係的權限如何工作?PostgreSQL和特權

步驟:

  1. 創建DB(從用戶postgres的)和連接到它

CREATE DATABASE test; \c test

  • 一些創建用戶站點特權
  • CREATE USER site NOCREATEDB NOINHERIT; GRANT SELECT, UPDATE, INSERT, DELETE, TRUNCATE, REFERENCES ON ALL TABLES IN SCHEMA public TO site; GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO site;

  • 更改默認爲用戶站點特權
  • ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, UPDATE, INSERT, DELETE, TRUNCATE, REFERENCES ON TABLES TO site;

  • 與所有創建用戶遷移特權
  • CREATE USER migration NOCREATEDB NOINHERIT; GRANT ALL PRIVILEGES ON DATABASE test TO migration;

  • 連接到DB從用戶遷移和創建表
  • CREATE TABLE test (id serial);

    從用戶
  • 連接到DB site並從創建表中選擇數據
  • SELECT * FROM test; ERROR: permission denied for relation test

    但是,如果我從用戶postgres創建表,一切正常!

    爲什麼默認權限在這種情況下不起作用?如何爲用戶網站授予新表的權限?

    回答

    1

    ALTER DEFAULT PRIVILEGES隻影響由FOR ROLE子句中指定的用戶創建的對象。如果您省略此條款,則僅適用於運行該命令的用戶(在您的情況下,postgres)。

    您想改爲ALTER DEFAULT PRIVILEGES FOR USER migration ...

    +0

    謝謝!有幫助,但這種變化之後用戶_site_可以改變表模式和drop table: '測試=> SELECT * FROM測試;'' ID'' ----'' (0行)'' 測試=> ALTER TABLE test ADD test_column char(1);' 'ALTER TABLE' 'test => DROP TABLE test;' 'DROP TABLE' – vanchester 2015-02-25 04:56:53

    +0

    'ALTER' /'DROP'權限不能被授予。他們只有桌子所有者(當然還有像_postgres_這樣的超級用戶)。如果允許_site_刪除表,則_site_是創建它的人。我認爲你從錯誤的會話中運行了一部分測試腳本。 – 2015-02-25 10:18:32