Snowflake启用行访问策略的表能否通过Secure share创建安全视图共享?
行访问策略(Row Access Policy)与安全共享(Secure Share)结合使用时确实存在上下文限制,这是查询返回空结果的核心原因。
核心限制原因
行访问策略的执行逻辑运行在数据提供者(Provider)账户的上下文下,默认无法读取数据消费者(Reader Account)侧的用户、角色、自定义属性等上下文信息。而你原有的行策略是基于Provider侧的region字段和Provider侧的用户身份做的过滤,当Reader Account访问共享的安全视图时,策略校验时无法匹配到有效身份,就会返回空结果。
适配方案
- 方案1:修改基表的行访问策略,增加共享访问场景的放行逻辑
你可以在现有策略的判断条件中,增加对共享访问专属角色SHARE_USAGE的白名单校验,示例策略逻辑参考:
CREATE OR REPLACE ROW ACCESS POLICY region_policy ON my_table AS (region VARCHAR) RETURNS BOOLEAN -> CURRENT_ROLE() = 'SHARE_USAGE' -- 共享访问场景直接放行 OR CURRENT_ROLE() IN ('INTERNAL_ROLE1', 'INTERNAL_ROLE2') AND region = CURRENT_SESSION().region;
如果需要Reader侧也遵循region过滤规则,可以提前在Provider侧维护Reader账户角色和region的映射表,在策略中关联该映射表做判断。
- 方案2:为共享场景单独创建专用安全视图
如果不想修改原表的行访问策略,可以基于原表创建一个绕过行策略的安全视图,注意需要给创建视图的角色赋予BYPASS ROW ACCESS POLICY权限,再将该视图添加到共享中。此方案适合不需要在Reader侧做行过滤的场景。 - 方案3:将行过滤逻辑下沉到安全视图定义中
移除基表的行访问策略,把基于region的过滤逻辑直接写在安全视图的SQL定义里,适配Provider内部访问和Reader共享访问两种场景,不同角色的过滤规则可以通过CURRENT_ROLE()、CURRENT_ACCOUNT()等系统函数做判断。
注意事项
安全视图本身不会绕过基表的行访问策略,所有对基表的访问请求,不管是直接访问还是通过视图访问,都会优先执行基表绑定的行策略校验,这就是未绑定行策略的表共享正常、绑定后查询为空的根本原因。
内容的提问来源于stack exchange,提问作者AMBIKA IYER
相关产品推荐
相关产品推荐

