SQL Server如何基于配置表创建行级安全策略过滤用的内联表值函数?
行级安全过滤函数及策略实现方案
以下实现基于SQL Server原生行级安全(RLS)机制,采用内联表值函数实现过滤谓词,性能满足生产环境要求。
实现步骤
1. 创建内联表值过滤函数
该函数为RLS策略的核心判断逻辑,完全匹配你提出的过滤规则:
CREATE FUNCTION dbo.fn_customers_row_filter(@typ_customer VARCHAR(10)) RETURNS TABLE WITH SCHEMABINDING -- 行级安全策略要求函数必须绑定架构 AS RETURN ( SELECT 1 AS is_visible WHERE -- 规则1:当前用户对应部门为sidney时,仅返回typ_customer=A的行 ( EXISTS( SELECT 1 FROM dbo.conf_table WHERE user_id = CAST(SESSION_CONTEXT(N'user_id') AS VARCHAR(50)) AND department = 'sidney' ) AND @typ_customer = 'A' ) -- 规则2:其他场景仅返回typ_customer=B的行 OR ( NOT EXISTS( SELECT 1 FROM dbo.conf_table WHERE user_id = CAST(SESSION_CONTEXT(N'user_id') AS VARCHAR(50)) AND department = 'sidney' ) AND @typ_customer = 'B' ) );
说明:
SESSION_CONTEXT用于存储中间层传入的当前登录用户user_id,是数据库连接池场景下传递会话级参数的标准方案。
2. 创建并启用行级安全策略
将过滤函数绑定到customers表,启用行级过滤:
CREATE SECURITY POLICY dbo.customers_rls_policy ADD FILTER PREDICATE dbo.fn_customers_row_filter(typ_customer) ON dbo.customers WITH (STATE = ON);
3. 中间层调用规范
中间层应用每次从连接池获取数据库连接后、执行业务查询前,需要先执行以下语句设置当前会话的用户标识:
EXEC sp_set_session_context @key = N'user_id', @value = N'当前登录用户的实际user_id';
效果验证
- 当传入
user_id为toto时:匹配conf_table中department='sidney'的规则,查询customers仅返回typ_customer=A的行(对应示例中customer_no=0001的记录) - 当传入其他
user_id、user_id不在conf_table中、或对应部门不是sidney时:查询customers仅返回typ_customer=B的行(对应示例中customer_no=0002的记录)
内容的提问来源于stack exchange,提问作者trk15
相关产品推荐
相关产品推荐

