Snowflake新建TEST_ROLE无显式权限却能查询数据表?
Snowflake新建角色可查询表的原因解释
核心原因:默认权限继承机制
Snowflake的权限体系存在两个关键默认行为,导致你遇到的现象:
PUBLIC角色的默认对象权限
创建数据库、模式、表时,Snowflake会默认将以下权限授予PUBLIC角色(除非创建时显式使用WITH MANAGE GRANTS参数修改默认规则):- 数据库:
USAGE权限(允许访问数据库) - 模式:
USAGE权限(允许访问模式下的对象) - 表:
SELECT权限(允许查询表数据)
你看到SHOW GRANTS TO ROLE PUBLIC仅显示部分权限,是因为该命令默认只展示直接授予的账户级权限,需用更精准的命令查看对象级权限:
-- 查看PUBLIC对目标数据库的权限 SHOW GRANTS ON DATABASE RESTRICTED_DB_TEST TO ROLE PUBLIC; -- 查看PUBLIC对目标模式的权限 SHOW GRANTS ON SCHEMA RESTRICTED_DB_TEST.TEST_SCHEMA TO ROLE PUBLIC; -- 查看PUBLIC对目标表的权限 SHOW GRANTS ON TABLE RESTRICTED_DB_TEST.TEST_SCHEMA.TEST_TBL TO ROLE PUBLIC;执行后会确认
PUBLIC确实拥有上述对象的必要权限。- 数据库:
所有新建角色默认继承PUBLIC权限
Snowflake中,所有自定义角色都是PUBLIC角色的子角色,默认会继承PUBLIC的全部权限。SHOW GRANTS TO ROLE TEST_ROLE仅显示直接授予该角色的权限,不会展示从父角色(PUBLIC)继承的权限,因此返回空结果,但角色实际拥有继承的查询权限。
补充说明
无论使用ACCOUNTADMIN还是SYSADMIN创建对象,只要未修改默认权限规则,都会触发上述默认授权行为,因此新建角色和PUBLIC角色都能查询目标表。若要限制访问,需在创建对象时添加WITH MANAGE GRANTS,或事后撤销PUBLIC对数据库、模式、表的对应权限。
内容的提问来源于stack exchange,提问作者nimgwfc
相关产品推荐
相关产品推荐

