2016-07-16 22 views
0

我已经配置了行级安全性,然后我想根据此创建sql视图来支持我的自定义报告。Acumatica:基于行级安全的Sql视图

更新,下面是我的看法

SELECT 
     s.CompanyID 
     , DistributorID = s.BranchID 
     , s.SiteID 
     , s.SiteCD 
     , s.Descr 
     , s.Active 
     , IsDefault = s.UsrIsDefault 
     , u.Username 
    FROM 
     dbo.INSite s 
     FULL JOIN dbo.Users u ON u.CompanyID = s.CompanyID 
    WHERE 
     SUBSTRING(s.GroupMask, 1, 4) = '' 
     OR (0 = SUBSTRING(s.GroupMask, 1, 4) & (SELECT SUM(CONVERT(BIGINT, rg.GroupMask & -1)) 
              FROM dbo.RelationGroup rg 
              WHERE rg.CompanyID = s.CompanyID AND rg.Active = 1 AND rg.SpecificType = 'PX.Objects.IN.INSite') 
     OR 0 <> SUBSTRING(s.GroupMask, 1, 4) & CONVERT(BIGINT, u.GroupMask)) 

但是,这并不正确

+0

那么你的问题是什么,你有什么尝试? – Hybridzz

+0

我更新如上 –

+0

您是否在尝试打印行级安全信息? – Hybridzz

回答

0

看来你对限制组的计算是不正确的:

我想与大家分享如何做这行得通。 对于每个组的系统分配一个字节:

  • 组1 - 为0x8000 = 1000 0000 0000 0000
  • 组2 - 0x4000的= 0100 0000 0000 0000
  • 第3族 - 为0x2000 = 0010 0000 0000 0000
  • 第4组 - 0×1000 = 0001 0000 0000 0000
  • 组5 - 为0x0800 = 0000 1000 0000 0000
  • 第6组 - 的0x0400 = 0000 0100 0000 0000
  • .... 。

当分配给它实际上是设置标志组中的掩模的任何组中的项目: 让我们假设供应商属于组3和组6中,比掩模将是:

0010 0100 0000 0000 = 0x2400

您可以在每个支持的表格上看到完全相同的组掩码。

用户也属于同一规则组。比系统搜索截取,到什么组属于用户和实体并计算评估权。 另外不要忘记,有不同类型的组可以计算不同的(组A,B,A反向,B反向)

在你的情况下,你加入所有的实体给用户是不正确的。 我认为你需要编写一些程序/功能,以获得可用的实体和用户组,并通过该条件加入。 可能你只需要找到用户和实体在同一位置至少有一个相同位 - 这意味着实体和用户属于同一组 - 但这只适用于组A.复杂性在于SQL Server不支持2个二进制文件(https://msdn.microsoft.com/en-us/library/ms176122.aspx)之间的按位操作,因此您必须将其转换为int。为了避免溢出,你只需要获得一部分字符串并逐个比较。 我更喜欢尝试从实体和用户获取组,并逐位执行按位操作以确保没有溢出。

希望它有帮助。