雪花 ...Alter 表在雪花的托管架构中不起作用

时间:2021-05-12 19:37:09

标签: snowflake-cloud-data-platform roles

申请;雪花 数据库:test_dev_db 架构:test_dev_sch --> 这是托管架构 架构所有者:数据管理员 表所有者:dba

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

2 个答案:

答案 0 :(得分:0)

让我纠正一个误解:

<块引用>

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

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

<块引用>

在常规模式中,对象的所有者(即具有 对象的 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,但我将尝试向角色 TEST_ROLE 授予 SELECT 权限:

grant select on TEST to role TEST_ROLE; -- failed

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

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

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”。

答案 1 :(得分:0)

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

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

再次感谢大家的帮助。