首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Snowflake ...Alter表在snowflake的托管架构中不起作用

Snowflake ...Alter表在snowflake的托管架构中不起作用
EN

Stack Overflow用户
提问于 2021-05-13 03:37:10
回答 2查看 336关注 0票数 0

应用程序;SNowflake数据库: test_dev_db架构: test_dev_sch -->这是托管架构架构所有者: dataadmin表所有者: dba

数据库管理员角色已在架构TEST_dev_db.TEST_DEV_SCH中创建了表TEST (所有者角色为DATAADMIN),因为这是一个托管架构,因此该表的所有者应为DATAADMIN,但所有者显示为数据库管理员。现在DBA想要更改表,但它不允许DBA更改表,也不允许DATAADMIN说SQL访问控制错误:没有足够的权限对表进行操作

EN

回答 2

Stack Overflow用户

发布于 2021-05-13 23:12:41

让我纠正一个误解:

DATAADMIN因为这是一个托管模式,所以表的所有者应该是

,但是所有者被显示为数据库管理员。

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

在常规模式中,对象的所有者(即对对象具有所有权特权的角色)可以将其对象的进一步特权授予其他角色。在托管架构中,架构所有者管理架构中对象的所有权限授予,包括将来的授予。对象所有者保留对象的所有权特权;但是,只有架构所有者可以管理对象的特权授予。

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

因此,预期角色DBA将是表的所有者,但它将不能管理表的特权。另一方面,角色DBA可以更改该表。

我试图重现这个问题,但正如我所看到的,一切都如预期的那样工作:

代码语言:javascript
复制
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角色,创建一个新表,然后添加一个新列(用于测试我们是否可以更改表):

代码语言:javascript
复制
use role dba;

create table TEST ( id number);

alter table TEST add column v variant; -- successful

当我仍在使用角色DBA时,我将尝试向角色TEST_ROLE授予SELECT权限:

代码语言:javascript
复制
grant select on TEST to role TEST_ROLE; -- failed

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

不出所料,它失败了。因此,我切换到角色DATAADMIN (托管架构的所有者),并尝试修改该表,然后向角色TEST_ROLE授予SELECT权限:

代码语言:javascript
复制
use role dataadmin;

alter table TEST add column v2 variant; -- failed

SQL访问控制错误:权限不足,无法在表'TEST‘上操作

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

代码语言:javascript
复制
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“。

票数 0
EN

Stack Overflow用户

发布于 2021-05-14 14:54:45

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

后来我意识到,对于snowflake,您不能更改列的默认值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67510015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档