2010-06-11 152 views

回答

84

如何

DROP USER <username> 

這實際上是DROP ROLE的別名。

您必須明確地刪除與該用戶關聯的所有特權,並將其所有權移至其他角色(或刪除該對象)。

這最好通過

REASSIGN OWNED BY <olduser> TO <newuser> 

DROP OWNED BY <olduser> 

後者實現將刪除授予該用戶的任何特權。

查看本文的DROP ROLEthe more detailed description的postgres文檔。


增加:

顯然,試圖通過這裏提到的命令,如果您正在執行他們,而被連接到原來的贈款,由相同的數據庫才起作用刪除用戶,這裏討論:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local

+9

正在操作: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo所有者postgres; CREATE USER testuser; GRANT ALL foo TO testuser; DROP USER testuser' 給出了錯誤消息:'錯誤:角色「testuser」不能被刪除,因爲一些對象依賴於它。細節:訪問表foo'。 但是,'testopenned by testuser'完成了這個伎倆,顯然Postgres認爲授予是可丟棄的對象。 – millimoose 2010-06-14 10:39:09

+1

請澄清一下@Tim Kane和millimoose:如果我選擇FOO給TESTUSER,然後DROP OWNED BY TESTUSER,我真的不希望原始表被刪除。我想你說的是DROP OWNED BY只是放棄了贈款,但不會放棄授予的目標。正確? – 2014-12-01 13:53:36

+1

Andrew,最好閱讀說明文檔。 DROP OWNED BY *將*刪除該用戶擁有的表。 REASSIGN OWNED BY會將這些表格重新分配給不同的用戶。選一個。 – 2015-02-09 09:16:53

8

另外請注意,如果您已明確授予:

CONNECT ON DATABASE xxx TO GROUP

,你將需要從DROP歸單獨撤銷這一點,使用:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

-9

我面臨同樣的問題,現在找到了一種方法來解決它。 首先你必須刪除你想刪除的用戶的數據庫。然後用戶可以很容易地刪除。

我創建了一個名爲「msf」的用戶,並掙扎了一段時間來刪除用戶並重新創建它。我遵循以下步驟,併成功。

1)刪除數據庫

dropdb msf 

2)刪除用戶

dropuser msf 

現在,我得到了用戶成功刪除。

+1

這是一種令人難以置信的斜線和刻錄方法,因爲它會要求我爲每次迭代工作重新創建數據庫模式。 (其中涉及對現有數據庫模式具有精細權限;即最好如果數據庫模式保持不變)。 – millimoose 2015-12-09 22:54:08

1

接受的答案在嘗試重新分配所有權或所有權時會導致錯誤。以下爲我工作:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username; 
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username; 
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username; 
DROP USER username; 

用戶可以在其他模式的特權,在這種情況下,你必須運行與「公」用正確的模式替換適當REVOKE線。要顯示所有的模式和特權類型的用戶,我編輯\ DP命令,使這個查詢:

SELECT 
    n.nspname as "Schema", 
    CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
    END as "Type" 
FROM pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%'; 

我不知道哪些權限類型對應撤銷對錶,序列,或功能,但我認爲它們都屬於三者之一。

相關問題