2023年5月31日 星期三

PostgreSQL 刪除帳號 - 相依物件處理方法

在資料庫管理上,會因為一些人員異動或規劃設計調整有刪除帳號的需求,為了避免有資料庫遺失,我們需要將該帳號所擁有的物件皆轉給其他帳號再安全的刪除,避免透過 CASCADE 方式以免發生誤刪狀況。


在 PostgreSQL 刪除帳號指令如下

DROP USER user_a ;

DROP USER user_a  CASCADE;  -- 除非有把握不然不建議,可能會誤刪除


當有遇到相依問題時,則會報錯如下,如果沒有顯示物件名稱代表可能有多個資料庫要去其他資料庫檢查。

edb=# create user user_a;
CREATE ROLE
Time: 26.105 ms
edb=# grant USAGE on SCHEMA monitor TO user_a ;
GRANT
Time: 26.957 ms
edb=# drop user user_a;
ERROR:  role "user_a" cannot be dropped because some objects depend on it
DETAIL:  privileges for schema monitor
Time: 0.792 ms
edb=#


主要會有兩種相依性卡到:

1. 物件擁有者

2. 物件的使用權限 (GRANT 給該帳號對個別物件存取的權限,如上面示範)


除了透過上面顯示錯誤訊息一個個處理以外,可以透過以下兩個指令快速處理相依性問題

-- 將該帳號擁有的物件擁有者改成另一個使用者
REASSIGN OWNED BY user_A TO user_B ;
-- 移除該帳號擁有的權限
DROP OWNED BY user_A ; 

要注意執行的順序 !!!

先執行 REASSIGN 把物件都轉移後,才執行刪除,此處 DROP OWNED BY 僅會移除權限,不會移除物件。

在所有資料庫執行完以上兩個指令後,就可以正常的把該帳號移除了~


* 以上主要是針對一般使用者,如果有做群組管理 ( GRANT user_a TO user_b) ,不會有相依性問題影響刪除,但是群組關係會直接被移除掉,可能要在注意,雖然一般可能不太會有這種情境