Acumatica:基于行级安全性的Sql视图

时间:2016-07-16 05:51:00

标签: 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))

但是,它没有正确

1 个答案:

答案 0 :(得分:1)

似乎您对限制组的计算不正确:

让我与您分享它是如何运作的。 对于每个组系统分配一个字节:

  • 第1组 - 0x8000 = 1000 0000 0000 0000
  • 第2组 - 0x4000 = 0100 0000 0000 0000
  • 第3组 - 0x2000 = 0010 0000 0000 0000
  • 第4组 - 0x1000 = 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。为了避免溢出,您必须只获取字符串的一部分并逐个进行比较。 我更喜欢尝试从实体和用户获取组,并逐位执行逐位操作以确保没有溢出。

希望它有所帮助。