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操作,保证不会溢出。
希望对您有所帮助。
我已经配置了行级安全性,然后我想基于此创建 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操作,保证不会溢出。
希望对您有所帮助。