直接SQL报表如何实现数据授权功能?
问题描述:
直接SQL报表如何实现数据授权?例如需要根据当前登录用户进行核算项目的数据权限控制怎么实现?
解决方案:
【第一步】:
根据核算项目类别ID,查询到对应核算项目的数据授权表及查看、修改、删除的权限字段名和权限掩码
例如查出客户的数据授权表为Access_t_Organization 几乎所有的核算项目的查看、修改、删除的权限字段名和权限掩码都是以下这样:
--FDataAccessView:1 FDataAccessEdit:4194304 FDataAccessDelete:65536
--此SQL脚本示例以检查核算项目的查看权限(FDataAccessView)为例
select FAccessTable,* from t_AccessRowData where fclassid=1
【第二步】:
根据用户ID获取二进制位权限信息(FAccessUUID)
Select top 1 t1.FUserID,t1.FAccessUUID from t_User t1 where t1.FUserID=16501
and t1.FAccessUUID>0
Union
Select t2.FUserID,t2.FAccessUUID from t_Group t1 left join t_User t2 on
t1.FGroupID=t2.FUserID where t1.FGroupID<>0 and t1.FUserID=16501
and t2.FAccessUUID>0
【第三步】
根据上两步查出来的数据权限表(Access_t_Organization)和权限字段名(FDataAccessView)
以及用户的二进制权限位(FAccessUUID值为:108)
按照固定的算法,拼接出数据权限关键过滤条件Substring...
DECLARE @ByteNum AS INT
DECLARE @Comp AS INT
DECLARE @AccessUUID AS INT
SET @AccessUUID=108 --此变量值为第二步查出来用户的二进制权限位(FAccessUUID)
SET @ByteNum = floor(@AccessUUID / 8) + 1
SET @Comp = power(2,(7 - ((@AccessUUID + 7) Mod 8)))
Substring(Access_t_Organization.FDataAccessView,@ByteNum,1) & @Comp & <>0
--如果@AccessUUID=108,则计算出来的过滤条件结果为:
Substring(Access_t_Organization.FDataAccessView,14,1) & 16 & <>0
【第四步】:
将核算项目物理表(t_Organization)左连接上核算项目数据权限表(Access_t_Organization),
再拼接上第三步计算出来的关键过滤条件(Substring(Access_t_Organization.FDataAccessView,14,1) & 16 & <>0)
由于表连接时用了表别名,注意替换过滤条件中的表名(Access_t_Organization)为SQL中使用的表别名(Access_t_Organization1)
最终形成的数据权限过滤的SQL如下,此SQL查询出的结果即为用户16501具有查看权限的核算项目数据记录:
SELECT t1.FItemID FROM t_Item t1 with(index (uk_Item2))
LEFT JOIN t_Organization x2 ON t1.FItemID = x2.FItemID
Left join Access_t_Organization as Access_t_Organization1 on Access_t_Organization1.FItemID=t1.FItemID
WHERE FItemClassID = 1 --核算项目类别ID
AND t1.FDeleteD=0 --排除掉禁用的核算项目
and ((Substring(Access_t_Organization1.FDataAccessView,14,1) & 16<>0)--过滤出用户16501具有查看权限的记录
or (isnull(t1.FItemID,0)=0)) --没有关联上数据权限表的核算项目默认拥有权限
ORDER BY t1.FNumber
以上示例为怎么查询出用户16501具有核算项目“客户”查看权限的数据
而实际编写直接SQL报表时,可把以上语句中的用户16501,直接替换成当前登录用户的关键字:#GetInnerVariable(UserID)#
另外不同的核算项目,类别ID、核算项目物理表、核算项目数据权限表,需要做相应替换。
直接SQL报表如何实现数据授权功能?
本文2024-09-22 16:41:08发表“k3wise知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3wise-89524.html