如何在以Snowflake为数据源的SSRS中实现经理仅看下属数据的RLS
Snowflake + SSRS 实现经理级行级安全性(RLS)
一、先在Snowflake端搞定行级安全规则
SSRS最终是查Snowflake取数,数据源层面先做好RLS最靠谱,不用在报表里写一堆冗余逻辑。
1. 准备员工层级关系数据
得有一张记录员工和直属经理关系的表,比如叫EMPLOYEE_HIERARCHY,至少包含这些字段:
EMP_ID:员工IDEMP_NAME:员工姓名MANAGER_ID:直属经理的IDMANAGER_NAME:经理姓名
要是你的业务表(比如EMPLOYEE_PERFORMANCE)本身就带经理字段,直接用业务表关联就行,不用单独建这张表。
2. 创建行访问策略
用Snowflake的Row Access Policy定义规则,让登录用户只能看到自己下属的数据。假设业务表是EMPLOYEE_PERFORMANCE,包含EMP_ID、PERFORMANCE_SCORE这些业务字段:
-- 创建行访问策略 CREATE OR REPLACE ROW ACCESS POLICY manager_rls_policy ON EMPLOYEE_PERFORMANCE AS (EMP_ID VARCHAR) RETURNS BOOLEAN -> EXISTS ( SELECT 1 FROM EMPLOYEE_HIERARCHY eh START WITH eh.MANAGER_ID = CURRENT_USER() -- 这里假设Snowflake用户名和经理ID是对应的 CONNECT BY PRIOR eh.EMP_ID = eh.MANAGER_ID WHERE eh.EMP_ID = EMPLOYEE_PERFORMANCE.EMP_ID ) OR CURRENT_USER() = 'ADMIN_USER'; -- 给管理员开全权限,方便排查问题
注意:如果Snowflake用户名和经理ID不对应,得调整匹配逻辑,比如建个用户映射表,或者用Snowflake的用户属性来关联员工ID。
3. 把策略绑到业务表
-- 将策略绑定到业务表,生效RLS规则 ALTER TABLE EMPLOYEE_PERFORMANCE ADD ROW ACCESS POLICY manager_rls_policy ON (EMP_ID);
二、SSRS端配置集成
1. 数据源身份验证设置
在SSRS的数据源配置里,选Windows身份验证或者Snowflake原生身份验证,确保报表运行时用的是当前登录用户的身份访问Snowflake。如果用Windows AD身份,得先搞定AD用户和Snowflake用户的映射关系。
2. 调整报表数据集查询
不用在报表里加额外过滤逻辑,直接查业务表就行,Snowflake的RLS会自动帮你过滤:
SELECT EMP_ID, EMP_NAME, PERFORMANCE_SCORE, DEPARTMENT FROM EMPLOYEE_PERFORMANCE;
要是报表需要做员工参数筛选,也可以用递归查询获取当前用户能看的员工列表:
SELECT EMP_ID, EMP_NAME FROM EMPLOYEE_HIERARCHY START WITH MANAGER_ID = CURRENT_USER() CONNECT BY PRIOR EMP_ID = MANAGER_ID UNION ALL SELECT CURRENT_USER(), (SELECT EMP_NAME FROM EMPLOYEE_HIERARCHY WHERE EMP_ID = CURRENT_USER()); -- 把经理自己的数据也加上
3. 测试权限
用不同经理的账号登录SSRS看报表,确认只能看到自己的下属(包括自己)的数据,管理员账号能看全量数据。
三、一些优化点
- 要是员工层级有多层(比如总监→经理→员工),Snowflake的
CONNECT BY递归查询会自动处理多层下属,不用改规则。 - 可以用Snowflake的
SESSION_USER或者角色来关联员工ID,比直接用CURRENT_USER()更灵活,适合复杂的权限场景。 - 如果SSRS用的是共享数据源账户,就得在报表里传当前登录用户ID当参数,然后在Snowflake查询里用这个参数过滤,注意要做参数校验,防止SQL注入。
内容的提问来源于stack exchange,提问作者Ajeet Verma
相关产品推荐
相关产品推荐

