sql-server - 使用 SSAS 表格中的动态行过滤器进行动态数据屏蔽

标签 sql-server dax ssas-tabular

我正在尝试实现一种在 SSAS 表格导入上使用动态数据屏蔽的方法。默认情况下,这在 SQL Server Analysis Services 2016 上不受支持(据我所知)。我想我已经找到了一种使用动态行级安全性来实现这一点的方法。但是,我的结果并不像预期的那样。
我的案例是一个员工表。它包含大约 2000 行,我的测试用户被授权查看大约 50 行。
我已经导入了员工表,添加了一个安全表(员工 key ,用户名)并在员工表上设置了一个行过滤器。或多或少与 the sample from Microsoft 相同.
此外,我添加了一个名为 EmployeeMask 的表,它包含相同的 2000 行,具有相同的 EmployeeKeys 和相同的列。但是,我已经“屏蔽”了其余列的值。
使用模拟为我的测试用户的 MDX 查询,我从我的 Employee 表中检索了 50 名员工,并从我的 EmployeeMask 表中检索了 2000 名员工。到现在为止还挺好。现在到了我认为我很聪明的部分。我将我的 Employee 表重命名为 EmployeeAuthorized 并添加了一个计算表 Employee ,如下所示:

=UNION(
    EmployeeAuthorized; 
    FILTER(
        EmployeeMask; 
        LOOKUPVALUE(EmployeeAuthorized[EmployeeKey]; EmployeeAuthorized[EmployeeKey]; EmployeeMask[EmployeeKey]) 
            = BLANK()
    )
)
但是,对我的新计算表 Employee 使用 MDX 查询,我取消了所有 2000 行。我的猜测是预先处理了计算表,而我认为 DAX 公式将根据请求执行。我的猜测对吗?有什么办法可以满足我的要求吗?
样本数据:
CREATE TABLE [dbo].[Employee] (--Renamed this to EmployeeAuthorized
    [EmployeeKey] INT NOT NULL,
    [EmployeeName] VARCHAR(50) NOT NULL
);

INSERT INTO [dbo].[Employee] VALUES
    (1, 'A A'), (2, 'B B'), (3, 'C C');

CREATE TABLE [dbo].[Fact] (
    [EmployeeKey] INT NOT NULL,
    [Value] INT NOT NULL
);

INSERT INTO [dbo].[Fact] VALUES
    (1, 1), (2, 2), (3, 5), (3, 8);

CREATE TABLE [dbo].[Security] (
    [EmployeeKey] INT NOT NULL,
    [UserName] VARCHAR(50) NOT NULL
);

INSERT INTO [dbo].[Security] VALUES
    (1, 'domain\u1'), (2, 'domain\u1'), (3, 'domain\u1'),
    (1, 'domain\u2');
如果需要:
CREATE TABLE [dbo].[EmployeeMask] (
    [EmployeeKey] INT NOT NULL,
    [EmployeeName] VARCHAR(50) NOT NULL
);

INSERT INTO [dbo].[EmployeeMask] VALUES
    (1, 'masked'), (2, 'masked'), (3, 'masked');
我正在尝试完成以下工作:
pivot tables

最佳答案

  • UNION它会忽略过滤器上下文和您的 RLS。使用 LOOKUPVALUE确保用户可以访问 EmployeeMasked 上的行基于如果他们的 EmployeeKey存在于 EmployeeAuthorized
  • 编辑您的 EmployeeAuthorized表所以它包含一个 ADUsername柱子。对于每个 EmployeeKey,存储将从 dax 函数返回的 ADUsername 值 USERNAME()
  • 编辑您创建的角色并转到 行过滤器 标签。
  • 查找 EmployeeMask 表
  • 添加以下 DAX 过滤器,以便角色强制属于该角色的用户只能在 EmployeeMask 上查看行,前提是他们的 EmployeeKey/ADUsername 在 EmployeeAuthorizedy 中有相应的查找授权记录。
  •       =EmployeeMask[EmployeeKey]
            =LOOKUPVALUE(
                EmployeeAuthorizedy[EmployeeKey],
                EmployeeAuthorized[EmployeeKey], EmployeeMask[EmployeeKey],
                EmployeeAuthorized[ADUsername], USERNAME()
            )
    
    

    关于sql-server - 使用 SSAS 表格中的动态行过滤器进行动态数据屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63700511/

    相关文章:

    asp.net - 我应该如何在数据库中存储用户输入数据的本地化版本?

    powerbi - Power BI DAX 的 AVG 平均值

    azure - Analysis Service 表格多维数据集刷新状态检查

    visual-studio - 从 Visual Studio CLI 构建 SSAS 2016

    python - 为连接字符串属性指定的值无效

    sql-server - 从 SQL 中的字符串中删除 SSN(社会安全号码)

    sql-server - 是否可以向 sql server 中现有的聚集索引添加列?

    powerbi - Power BI 中的 MAX 函数和 Group BY

    powerbi - 如何使用关键字列表过滤 Power BI 表(在其他表的列中)

    excel - DAX 中半加和的平均值