为啥 Snowflake 中的 FUTURE 授权默认需要 AccountAdmin?

Posted

技术标签:

【中文标题】为啥 Snowflake 中的 FUTURE 授权默认需要 AccountAdmin?【英文标题】:Why does a FUTURE grant in Snowflake require AccountAdmin by default?为什么 Snowflake 中的 FUTURE 授权默认需要 AccountAdmin? 【发布时间】:2019-12-23 19:19:45 【问题描述】:

我设置了以下场景:

Demo_DB 归 sysadmin 角色所有。 Demo_Schema 已创建并归 Demo_Developer 角色所有。 Demo_Schema 中的所有对象都由 Demo_Developer 角色拥有和创建。

AccountAdmin 创建了一个名为 Demo_Analyst 的新角色,其目的是将其设置为 Demo_Schema 表的只读用户。 Demo_Developer 成功执行了以下授权(假设因为它是 Demo_Schema 中所有表的所有者):

use role Demo_Developer; 
grant select on all tables in schema Demo_DB.Demo_Schema to role Demo_Analyst;

但是,Demo_Developer 或事件 SysAdmin(属于 Demo_Developer 角色)都不能执行以下操作:

use role sysadmin;
grant select on FUTURE tables in schema Demo_DB.Demo_Schema to role Demo_Analyst;

但是,以上将使用 AccountAdmin 角色执行。起初这对我来说似乎很奇怪,但后来我推断也许我们不知道哪些未来的表将由哪些所有者创建,所以我们需要一个 AccountAdmin 来授予 FUTURE。对吗?

我进行了更多测试并将 Demo_Schema 中的一个表的所有权更改为 Demo_Developer 不属于的完全不同的角色。然后我尝试再次使用该 Demo_Developer 授予对所有表的选择权限(上面的第一条语句),这一次它没有授予所有表,而只是授予 Demo_Developer 是其所有者的表。

所以我想知道为什么对 FUTURE 表的尝试授予不会以相同的方式工作 - 即在未来授予的授予者拥有的未来表上授予选择。

所以我的问题是:为什么我需要 AccountAdmin 来授予对 Future 表的选择权限,但我可以使用所有者角色 (Demo_Developer) 来授予对所有当前表的选择权限?

【问题讨论】:

【参考方案1】:

您在使用说明中看到了吗?

在数据库级别授予或撤销对未来对象的权限需要 MANAGE GRANTS 全局权限。默认情况下,只有 SECURITYADMIN 和 ACCOUNTADMIN 角色具有 MANAGE GRANTS 权限。

【讨论】:

我以为我是在架构级别而不是数据库级别创建 FUTURE 授权。 再看一下 MANAGE GRANTS:MANAGE GRANTS:授予授予或撤销任何对象的权限的能力,就好像调用角色是对象的所有者一样。所以 SECURITYADMIN 和 ACCOUNTADMIN 可以授予任何东西的期货是有道理的。但是由于 Demo_Developer 拥有架构和对象,并且由于我正在对架构(而不是数据库)进行未来授权,所以我认为我能够做到。

以上是关于为啥 Snowflake 中的 FUTURE 授权默认需要 AccountAdmin?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Future.Builder 中的快照从不出错?

为啥 Snowflake 中这两个相似的查询具有非常不同的性能?

在 Snowflake 中,为啥当你同时分配两个变量时,变量有 256 字节的限制?

为啥像 Snowflake 和 Redshift 这样的列式数据库不能更改列顺序?

为啥 Future[Set[Unit]] 不被接受为 Future[Unit]?

为啥 asyncio.Future 与 concurrent.futures.Future 不兼容?