2015-07-04 20 views
1

如果我創建一個表與普通用戶帳戶:需要什麼授予(撤銷)來禁止更新表格?

create table test (a text, b text, c text); 

同一用戶可以對錶中的所有動作......

john=# \z test 
          Access privileges 
Schema | Name | Type | Access privileges | Column access privileges 
--------+----------+-------+-------------------+-------------------------- 
public | testtest | table | john=ardDxt/john | 

即使我運行此:

revoke update on test from john; 

用戶仍然可以更新表中的行。可以修改權限,以便用戶不再擁有允許更新的權限?

我甚至試過這樣:

revoke all privileges on test from john; 

而且它清空了約翰= ardDxt,但更新繼續工作(假設這是因爲約翰也是數據庫和/或表的所有者) 。我是從那裏說文檔本身閱讀...

PostgreSQL允許一個對象所有者撤銷自己的普通 特權:比如,一個表所有者可以使表由只讀 自己撤銷他自己的INSERT,UPDATE,DELETE和TRUNCATE 特權。

但我似乎無法做到它所說的,而且這些例子相當稀少。

+1

可以從「CREATE TABLE」開始顯示* full * DDL嗎?還有'\ d +'在桌子上和'\ du + john'。 –

+0

只要您提到\ du +,解決方案就顯而易見了。我使用Postgres.app進行開發,它的默認用戶也是超級用戶。我創建了另一個超級用戶,撤消了john的超級用戶,然後做了正確的授予/撤銷...我可以設置它,以便用戶可以插入/刪除但不更新(或者更具體地說,不能更新某些列)。你解決了它,如果你想把它寫成答案,我會接受它。非常感謝。 –

回答

0

爲未來訪問者解釋:

超級用戶忽略權限檢查。這意味着GRANT是不必要的,REVOKE是無效的。超級用戶還可以禁用觸發器和許多礦石。所以你不能完全阻止超級用戶更新數據。如果要防止更新是必要的,那麼你最好的選擇實際上是引發異常的觸發器(或者簡單地返回NULL,跳過操作)。超級用戶仍然可以禁用觸發器,但需要多一點努力。