共享数据库应用data masking policy时报错的问题咨询
问题根因
Snowflake入站共享数据库(其他账号共享给你的数据库)属于只读对象,消费者账号默认没有权限在共享数据库内部创建任何对象(包括脱敏策略),也不能修改共享表的列属性,即使给当前账号授予共享库的常规权限也无法生效,因为共享库本身不对外开放DDL写入权限。
排查验证步骤
- 确认数据库属性:执行
SHOW DATABASES LIKE 'DATABASE_NAME';,查看返回结果的origin字段,如果有值就说明该库是入站共享数据库,不属于你当前账号的本地可写库 - 确认权限范围:执行
SHOW GRANTS ON DATABASE DATABASE_NAME;,可以看到当前账号仅拥有USAGE、SELECT这类只读权限,即使主动申请授予CREATE MASKING POLICY、ALTER TABLE这类DDL权限也会失败,属于共享库的机制限制
解决方法
两种可行方案可按需选择:
方案1:由数据提供者侧配置脱敏策略
共享数据库的所有对象配置操作都需要在提供者侧完成:
- 联系数据提供者在其源数据库中创建对应脱敏策略,绑定到指定表的对应列
- 提供者重新共享完成脱敏配置的表到你的账号,你侧访问共享表时会自动生效脱敏规则
方案2:消费者侧创建本地视图绑定脱敏策略
如果提供者无法配合,可在你账号的本地可写数据库中实现:
- 切换到你自己的可写数据库和Schema,创建脱敏策略:
USE DATABASE YOUR_LOCAL_DB; USE SCHEMA YOUR_LOCAL_SCHEMA; create or replace masking policy Policy_name as (val string) returns string -> case when current_role() in ('SECURITYADMIN') then val else '*********' end;
- 基于共享表创建本地视图,给视图对应列绑定脱敏策略:
-- 创建基于共享表的视图 CREATE OR REPLACE VIEW V_SHARED_TABLE_PHONE AS SELECT * FROM DATABASE_NAME.SHARED_SCHEMA.TABLE_NAME; -- 给视图的手机号列绑定脱敏策略 ALTER VIEW V_SHARED_TABLE_PHONE MODIFY COLUMN PHN_NUMBER SET MASKING POLICY Policy_name;
- 后续所有业务访问都走该本地视图即可实现脱敏效果
内容的提问来源于stack exchange,提问作者Divya
相关产品推荐
相关产品推荐

