雪花 ...Alter 表在雪花中的托管模式中不起作用

Posted

技术标签:

【中文标题】雪花 ...Alter 表在雪花中的托管模式中不起作用【英文标题】:Snowflake ...Alter table is not working in managed schema in snowflake 【发布时间】:2021-05-12 19:37:09 【问题描述】:

应用;雪花 数据库:test_dev_db schema : test_dev_sch --> 这是托管模式 架构所有者:dataadmin 表所有者:dba

DBA 角色已在模式 TEST_dev_db.TEST_DEV_SCH 中创建表 TEST(所有者角色为 DATAADMIN),由于这是一个托管模式,因此表的所有者应该是 DATAADMIN,但所有者显示为 DBA。 现在 DBA 想要更改表,它不允许 DBA 更改表,也不允许 DATAADMIN 说 SQL访问控制错误:权限不足,无法对表进行操作

【问题讨论】:

你有我们可以用来复制的脚本吗? 您为什么不检查 information_schema.table 以查看所有权并检查该角色的显示授权以验证操作角色是否已授予他们更改授权。如果不是,则将alter或all grant授予对表进行操作的角色。 【参考方案1】:

让我纠正一个误解:

由于这是一个托管模式,因此表的所有者应该是 DATAADMIN 但所有者显示为 DBA。

不,这是不正确的。在您的情况下,所有者应该是角色 DBA。常规模式和托管模式之间的区别在于对象的权限是如何管理的:

在常规模式中,对象的所有者(即拥有 OWNERSHIP 权限)可以授予更多权限 他们的对象到其他角色。在托管模式中,模式所有者 管理对象的所有权限授予,包括未来授予 架构。对象所有者保留 OWNERSHIP 权限 物体;但是,只有模式所有者可以管理权限授予 对象。

https://docs.snowflake.com/en/sql-reference/sql/create-schema.html#optional-parameters

因此,角色 DBA 将是表的所有者,但它无法管理表的权限。另一方面,角色 DBA 可以更改表。

我试图重现该问题,但正如我所见,一切都按预期工作:

use role accountadmin;
create database test_dev_db;
create schema TEST_DEV_SCH with MANAGED ACCESS;
create role dataadmin;
create role dba;
create role test_role; -- dummy role for testing

-- required grants for accessing DB
grant usage on database test_dev_db to dataadmin;
grant ownership on schema TEST_DEV_SCH to role dataadmin;

-- required grants for creating table, and accessing the schema
grant usage on database test_dev_db to dba;
grant usage, CREATE TABLE on schema TEST_DEV_SCH to dba;

-- required grants to switch these users
grant role dba to user gokhan;
grant role dataadmin to user gokhan;

现在我切换到角色 DBA,创建一个新表,然后添加一个新列(用于测试我们是否可以更改表):

use role dba;

create table TEST ( id number);

alter table TEST add column v variant; -- successful

虽然我仍在使用角色 DBA,但我会尝试将 SELECT 权限授予角色 TEST_ROLE:

grant select on TEST to role TEST_ROLE; -- failed

SQL 执行错误:未在托管访问架构中授权。使用架构所有者角色或具有 MANAGE GRANTS 权限的角色。

它按预期失败。所以我切换到角色 DATAADMIN(托管模式的所有者),并尝试更改表,然后将 SELECT 权限授予角色 TEST_ROLE:

use role dataadmin;

alter table TEST add column v2 variant; -- failed

SQL 访问控制错误:权限不足,无法对表“TEST”进行操作

同样,正如预期的那样,模式的所有者不能更改表,但我们可以将 SELECT 权限授予另一个角色,因为我们是表的所有者:

grant select on TEST to role TEST_ROLE; -- successful

show grants on table TEST; 

+-----------+--------------+--------------+------------+
| privilege | grantee_name | grant_option | granted_by |
+-----------+--------------+--------------+------------+
| OWNERSHIP | DBA          | true         | DBA        |
| SELECT    | TEST_ROLE    | false        | DBA        |
+-----------+--------------+--------------+------------+

虽然 SELECT 权限已由角色 DATAADMIN 授予,但显示为“DBA”。

【讨论】:

【参考方案2】:

感谢您非常详细的回复。正如你所说,那是我的误解。我想更改表列的默认值,并认为托管架构和权限是问题所在。

我后来意识到,使用雪花你不能更改列的默认值。您只能将其更改为序列。

再次感谢大家的帮助。

【讨论】:

以上是关于雪花 ...Alter 表在雪花中的托管模式中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

雪花声明在程序中不起作用

Snowflake METADATA$FILENAME 关键字在 snowsql(Unix 命令提示符)中不起作用,但在雪花 UI 中起作用

雪花 - 检查模式并返回该模式中的子字符串

厉害了,美女同事用单例模式实现了雪花算法!

雪花中不支持的子查询

雪花数据库中的公共模式