Redshift

Can’t DROP GROUP,不能被刪除,因為一些對象依賴它

  • April 26, 2019

RDS 版本:i686-pc-linux-gnu 上的 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.1161 編譯

幾天來我一直在努力解決這個問題,我在這裡找到的所有解決方案和 AWS 論壇都不適合我。

基本上我正在嘗試刪除一個組。該組中沒有使用者(儘管根據 AWS 文件,這無關緊要)。

我已經撤銷了對數據庫、模式、表和函式的所有權限。它們既不是 pg_tables、pg_views、pg_namespace 或 pg_database 中的 ACL 的所有者,也不是 ACL 的一部分。

它們也不是 pg_default_acl 中 ACL 的一部分。

當我執行時,DROP GROUP my_group;我收到以下錯誤:

[Amazon](500310) Invalid operation: group "my_group" cannot be dropped because some objects depend on it Details: privileges for default privileges on new relations belonging to user dwowner in schema changehistory privileges for default privileges on new relations belonging to user dwowner in schema stage privileges for default privileges on new relations belonging to user dwowner in schema public 5 object in database prod;

跑步:

ALTER DEFAULT PRIVILEGES IN SCHEMA stage, public, changehistory, admin REVOKE ALL ON TABLEs FROM GROUP my_group;

不會導致對 pg_default_acl 表的更改(因為它們最初不存在)並且在嘗試刪除組時上述錯誤繼續存在。

幾個問題:

  • dwowner 實際上是這些模式的所有者,但這與 my_group 有什麼關係?
  • 錯誤的結尾引用了 prod 數據庫。我在 dev 中執行了這個查詢。我也在 prod 上執行了相同的撤銷語句。執行DROP GROUP my_group;on prod 會導致類似的錯誤,這次是引用 dev 數據庫。

顯然,我在某處遺漏了一些對象權限關係,但此時我完全不知道

我發現,為了刪除一個組,您必須撤銷該組可能已分配的所有權限。組可以具有預設權限、架構使用和表授權。我使用了以下 5 個語句,然後能夠刪除該組。

--Drop All users from the group
alter group <groupname> drop user <username>;
--REVOKE usage on the group
REVOKE ALL ON SCHEMA <schema1>,<schema2>,<schema3>,<schema4>,<schema5>,public
   FROM group <groupname>;
--REVOKE grants on tables
REVOKE ALL ON ALL TABLES IN SCHEMA <schema1>,<schema2>,<schema3>,<schema4>,<schema5>,public
   FROM group <groupname>;
--REVOKE Default privileges on TABLES
ALTER DEFAULT PRIVILEGES for USER <username> IN SCHEMA <schema1>,<schema2>,<schema3>,<schema4>,<schema5>,public
   REVOKE ALL ON TABLES FROM group <groupname>;
--REVOKE Default privileges on FUNCTIONS if any
ALTER DEFAULT PRIVILEGES for USER <username> IN SCHEMA <schema1>,<schema2>,<schema3>,<schema4>,<schema5>,public
   REVOKE ALL ON FUNCTIONS FROM group <groupname>;
--drop the group finally
drop group <groupname>;

在類似的情況下更改預設權限對我有用

下面的查詢應該有助於辨識依賴關係

SELECT nspname, defaclobjtype, array_to_string(defaclacl, ',')
FROM   pg_default_acl a
        JOIN pg_namespace b ON a.defaclnamespace=b.oid;

alter defaultprivilege 命令也將授予者資訊作為參數。

在執行上述查詢時,您應該能夠辨識依賴關係以及授予該權限的使用者,將該使用者名用作更改預設權限的一部分,如下所示。注意您必須具有超級使用者權限才能執行此操作

ALTER DEFAULT PRIVILEGES
   FOR <USER>
   IN SCHEMA stage, public, changehistory, admin
   REVOKE ALL ON TABLEs FROM GROUP my_group;

希望能幫助到你。:-)

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