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

Acumatica: Sql view based on Row Level Security

我已经配置了行级安全性,然后我想基于此创建 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 - 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

您可以在每个支持的 table.

上的组掩码中准确地看到这一点

用户也属于同一规则的组。比系统搜索拦截,用户和实体属于哪个组,并计算评估权限。 也不要忘记有不同类型的组可以不同地计算(Group A, B, A Inverse, B Inverse)

在您的情况下,您将所有实体都加入了不正确的用户。 我认为您需要编写某种 procedure/function 来获得实体和用户的可用组并按该条件加入。 可能您只需要找到哪个用户和实体在同一位置至少有一个相同的位——这意味着实体和用户属于同一组——但这只适用于组 A。

同样复杂的是SQL服务器不支持2个二进制文件(https://msdn.microsoft.com/en-us/library/ms176122.aspx)之间的位运算,所以你必须把它转换成int。为避免溢出,您必须只获取字符串的一部分并逐个比较。 我比较喜欢尝试从entity和user中获取Groups,一点一点的做bitwise操作,保证不会溢出。

希望对您有所帮助。