強制執行表所有權
這是交易:我有 postgresql 數據庫(GCP Cloud SQL 部署,我不關心版本)並且我想強制執行表的所有權。
具體來說,應用程序
mydb
通過 GCP IAM 帳戶登錄數據庫,該帳戶已分配role_admin
. 應用程序需要創建一個mytable
由role_mydb_admin
. 所以它需要先呼叫SET ROLE role_mydb_admin;
然後繼續創建表。以下是所有權的樣子:Role | Member of ----------------------+----------------- user@gcpprojectid.iam | role_admin role_admin | role_mydb_admin
Name | Owner --------+----------------- mytable | role_mydb_admin
如果由於某種原因,使用者沒有將角色設置為
role_mydb_admin
,則將在role_admin
. 這是我需要避免的問題。解決此問題的一種方法是創建一個函式,該函式將通過事件觸發器攔截 CREATE TABLE 並重新分配錯誤創建的表。這可行但不是一個足夠好的解決方案,因為一些應用程序正在執行大量 DDL 操作作為其工作的一部分,並且它呼叫會過度觸發此功能。其次,我不喜歡。
我想要的是某種策略,它可以確保只能使用
role_mydb_admin
使用者創建表。這樣的事情可能嗎?類似的東西deny create table if owner not equal to role_mydb_admin
。或者,如果我可以擁有一個
role_admin
根本沒有 CREATE 和 ALTER 權限,但具有 SET ROLE 權限role_mydb_admin
(具有這些權限)的權限。
簡單的; 使用中間
NOINHERIT
角色:CREATE ROLE admin_noinherit NOLOGIN NOINHERIT; REVOKE role_mydb_admin FROM "user@gcpprojectid.iam"; GRANT role_mydb_admin TO admin_noinherit; GRANT admin_noinherit TO "user@gcpprojectid.iam";
現在
"user@gcpprojectid.iam"
(奇怪的名字)是 的成員role_mydb_admin
,但不從該角色繼承權限。然後更改架構,使其只有
role_mydb_admin
特權CREATE
。之後,"user@gcpprojectid.iam"
必須使用SET ROLE role_mydb_admin;
能夠創建一個表,並且表的所有權是應該的。
但是請注意,沒有任何東西可以讓
"user@gcpprojectid.iam"
FROM 執行ALTER TABLE myschema.tab SET OWNER TO "user@gcpprojectid.iam";
在稍後的某個時間點。但我猜你只是想建立合理的預設權限。