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

Azure Synapse SQL池基于列值与Azure AD身份实现RLS的方法

在Azure Synapse专用SQL池中实现基于Azure AD身份的行级安全(RLS)

首先明确:Azure Synapse无服务器SQL池目前不支持行级安全(RLS),仅专用SQL池支持该功能,以下实现步骤基于专用SQL池。

前提准备

  • 将Azure AD组A、组B,以及用户A、用户B添加为专用SQL池的数据库用户:
-- 创建AD组A对应的数据库用户
CREATE USER [AzureAD\组A名称] FROM EXTERNAL PROVIDER;
-- 创建AD组B对应的数据库用户
CREATE USER [AzureAD\组B名称] FROM EXTERNAL PROVIDER;
-- 若需单独对用户A、B设置权限,可创建对应数据库用户
CREATE USER [AzureAD\用户A名称] FROM EXTERNAL PROVIDER;
CREATE USER [AzureAD\用户B名称] FROM EXTERNAL PROVIDER;
  • 确保目标表(假设表名为user_data)已存在并包含指定数据:
CREATE TABLE user_data (
    name VARCHAR(50),
    visibility VARCHAR(20)
);
INSERT INTO user_data VALUES ('Bob', 'public'), ('Andrew', 'hide');

步骤1:创建RLS谓词函数

该函数会根据当前登录的Azure AD身份,返回允许访问的行过滤条件:

CREATE FUNCTION dbo.fn_security_predicate()
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT 1 AS is_allowed
WHERE
    -- 组B/用户B可查看所有行
    IS_MEMBER('AzureAD\组B名称') = 1
    OR SUSER_SNAME() = 'AzureAD\用户B名称'
    -- 组A/用户A仅能查看visibility为public的行
    OR (
        (IS_MEMBER('AzureAD\组A名称') = 1 OR SUSER_SNAME() = 'AzureAD\用户A名称')
        AND visibility = 'public'
    );

说明:

  • IS_MEMBER()用于校验当前用户是否属于指定的数据库用户(对应Azure AD组)
  • SUSER_SNAME()返回当前登录的Azure AD用户完整标识(格式为AzureAD\用户UPN或名称)

步骤2:创建行级安全策略

将谓词函数绑定到目标表,启用行级过滤:

CREATE SECURITY POLICY dbo.user_data_security_policy
ADD FILTER PREDICATE dbo.fn_security_predicate()
ON dbo.user_data
WITH (STATE = ON);

验证效果

  • 当AD组A/用户A登录查询时,仅返回visibility='public'的行:
SELECT * FROM user_data;
-- 结果仅包含Bob的记录
  • 当AD组B/用户B登录查询时,返回所有行:
SELECT * FROM user_data;
-- 结果包含Bob和Andrew的记录

注意事项

  • 若Azure AD组名称包含特殊字符,需用方括号包裹,例如[AzureAD\组B名称(含空格)]
  • 执行上述操作的账号需具备ALTER ANY SECURITY POLICY和CREATE FUNCTION权限
  • 如需修改访问规则,更新谓词函数后重新启用安全策略即可

内容的提问来源于stack exchange,提问作者Sri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:10:06