如何在Snowflake中创建表,但防止在相同角色下将其删除?

问题描述

我们已经构建了一个流传输管道,当在源系统中创建表时,该流水线有权在雪花中创建新表(以PROD_EL_ROLE角色运行)

即使我们启用了“用于备份” 的时间旅行,我还是要防止PROD_EL_ROLE本身能够“偶然地” DROP表。 AFAIK,这不能直接完成,因为雪花中的表的创建者也是所有者,因此也可以删除

我另外尝试的是将所有者转移到RBAC层次结构(PROD_SYSADMIN_ROLE)中另一个更高的角色。不幸的是,只能通过使用REVOKE GRANTS来工作,这不是我们想要的,因为在PROD_EL_ROLE下创建表时,各种FUTURE GRANTS会自动创建各种特权。而且我们显然不想删除它们。

如果我使用copY GRANTS,则由于PROD_EL_ROLE没有MANAGE GRANTS权限而无法使用。这显然是我们不想给予的赠款给PROD_EL_ROLE ... 我只想防止表被PROD_EL_ROLE删除

有什么解决方法吗?

解决方法

要遵循DAC的概念,您拥有创建的对象,然后可以自定义授予它的权限,因此除非在同一RBAC层次结构中更高的角色要求所有权,并回授该对象的某些或全部特权,否则无法防止丢弃它扮演那个角色。

因此,根据您的要求,另一个单独的进程/用户需要使用PROD_SYSADMIN_ROLE声明对象所有权,并将该对象上的所有特权回授给角色PROD_EL_ROLE

USE ROLE PROD_SYSADMIN_ROLE;
grant ownership on ALL TABLES in SCHEMA TESTDB.TESTSCHEMA
    TO ROLE PROD_SYSADMIN_ROLE;
grant ALL PRIVILEGES on ALL TABLES in SCHEMA TESTDB.TESTSCHEMA
    TO ROLE PROD_EL_ROLE;

现在,角色PROD_EL_ROLE可以执行所有DML操作,但不能再对其执行DDL操作(删除/修改对象的定义)。