这是交易:我有 postgresql 数据库(GCP Cloud SQL 部署,我不关心版本)并且我想强制执行表的所有权。
具体来说,应用程序mydb
通过 GCP IAM 帐户登录数据库,该帐户已分配role_admin
. 应用程序需要创建一个mytable
由role_mydb_admin
. 所以它需要先调用SET ROLE role_mydb_admin;
然后继续创建表。以下是所有权的样子:
Role | Member of
----------------------+-----------------
[email protected] | 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
角色:现在
"[email protected]"
(奇怪的名字)是 的成员role_mydb_admin
,但不从该角色继承权限。然后更改架构,使其只有
role_mydb_admin
特权CREATE
。之后,"[email protected]"
必须使用能够创建一个表,并且表的所有权是应该的。
但是请注意,没有任何东西可以让
"[email protected]"
FROM 运行在稍后的某个时间点。但我猜你只是想建立合理的默认权限。