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

Visual Studio 2022表格模型行级安全(RLS)失效问题排查求助

问题描述

我正在使用Visual Studio为表格模型添加行级安全(RLS),数据将在Azure中处理存储并在Excel中分析。因Azure组件特性,USERNAME()需匹配邮箱地址而非NTID。

我参照其他已实现正常RLS的表格模型搭建了本模型的表结构、关系与角色,但通过Windows身份验证连接Excel查看模型时,仍能看到所有记录,而非应被限制的范围。

相关表结构SQL

-- Fact table.
CREATE TABLE dbo.facts (
  [RecordID] INT,
  [AccessGroupID] INT,
  [facts] VARCHAR(200)
);

INSERT INTO dbo.facts
VALUES (1, 1, 'lorem ipsum'),
       (2, 1, 'dolor sit amet'),
       (3, 2, 'lorem ipsum');

-- Bridge table prevents many-to-many relationship.
SELECT DISTINCT [AccessGroupID]
INTO dbo.bridge
FROM dbo.facts;

-- Security table maps user to facts. 
CREATE TABLE dbo.security(
  [UserID] CHAR(1),
  [Email] VARCHAR(50),
  [AccessGroupID] INT,
);

INSERT INTO dbo.security
VALUES ('a', 'a@z.com', 1),
       ('a', 'a@z.com', 2),
       ('b', 'b@z.com', 1),
       ('c', 'c@z.com', 2);

表关系

  • dbo.bridge与dbo.facts是一对多关系
  • dbo.bridge与dbo.security是一对多关系

当前RLS配置的DAX逻辑

dbo.security = FALSE();

dbo.bridge = 
  dbo.bridge[AccessGroupID] =
    LOOKUPVALUE(
      dbo.security[AccessGroupID],
      dbo.security[EMAIL], USERNAME(),
      dbo.security[AccessGroupID], dbo.bridge[AccessGroupID]
    )

预期权限

  • UserID 'a'可查看全部3条事实记录
  • UserID 'b'可查看RecordID 1、2的记录
  • UserID 'c'可查看RecordID 3的记录

但实际所有用户都能看到全部3条记录,请问遗漏了什么?原因是什么?


问题分析与修正方案

你的RLS失效核心是配置逻辑错误,具体问题和修正方法如下:

1. LOOKUPVALUE函数用法错误

当前DAX中LOOKUPVALUE的逻辑完全无效:你把当前行的dbo.bridge[AccessGroupID]作为默认返回值,导致无论用户身份如何,都会匹配当前行的ID,等于没有过滤。

正确逻辑应该是筛选出当前用户拥有的所有AccessGroupID,再匹配bridge表的对应值,改用IN配合CALCULATETABLE实现:

dbo.bridge = 
dbo.bridge[AccessGroupID] IN 
    CALCULATETABLE(
        VALUES(dbo.security[AccessGroupID]),
        dbo.security[Email] = USERNAME()
    )

2. dbo.security表的筛选规则错误

设置dbo.security = FALSE()会让角色无法读取任何安全表数据,RLS失去了权限判断的依据。应该删除这条规则,或者设置为仅允许访问当前用户的记录:

dbo.security = dbo.security[Email] = USERNAME()

3. 验证USERNAME()返回值格式

Windows身份验证下,USERNAME()默认返回DOMAIN\NTID格式,而非邮箱。即使在Azure环境,也需要确认表格模型的身份配置是否正确映射到邮箱地址。可以在模型中新建度量值=USERNAME(),测试实际返回值是否与security表的Email字段格式一致。

4. 确认角色应用与测试权限

  • 确保RLS角色已应用到所有相关表
  • 测试时不要使用管理员账户(管理员默认绕过RLS)
  • 先在Visual Studio中使用「模拟角色」功能验证规则是否生效,再到Excel中测试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:12:48