我已经配置了行级安全性,然后我想基于此创建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 :(得分:1)
似乎您对限制组的计算不正确:
让我与您分享它是如何运作的。 对于每个组系统分配一个字节:
当您将项目分配给任何组时,它实际上会在组掩码中设置标志: 让我们假设供应商属于第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。为了避免溢出,您必须只获取字符串的一部分并逐个进行比较。 我更喜欢尝试从实体和用户获取组,并逐位执行逐位操作以确保没有溢出。
希望它有所帮助。