You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:24:03