gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:49:20 26 4
gpt4 key购买 nike

我正在尝试实现一种在 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com