存储用户帐户权限的最佳方法?

存储用户帐户权限的最佳方法?,第1张

存储用户帐户权限的最佳方法?

这可以在SQL本身中完成,这可能比处理代码中的数据更有效。

随着数据的一个问题是

State
City
Building
列必须逆转置,然后被变成了逗号分隔的列表。

由于使用的是SQL 2008,因此可以访问所需的功能。

查询是:http :
//sqlfiddle.com/#!18/0f4f7/1

; WITH cte AS (  SELECt      AccountID, AccessType, AccessLevel      , CASE AccessLevel          WHEN 'S' THEN State          WHEN 'C' THEN City          WHEN 'B' THEN Building        END AS Permissions  FROM Permissions  WHERe AccountID =     <cfqueryparam cfsqltype="cf_sql_integer" value="#session.AccountID#">     )SELECt DISTINCT AccountID, AccessType, AccessLevel  , CASE       WHEN AccessLevel = 'S' THEN Permissions       ELSE LEFt(ca.pl, COALESCE(LEN(ca.pl),0)-1)    END AS PermissionListFROM cteCROSS APPLY (  SELECt p.Permissions + ', '  FROM cte p  WHERe p.AccountID = cte.AccountID    AND p.AccessType = cte.AccessType    AND p.AccessLevel = cte.AccessLevel  FOR XML PATH('')) ca (pl)     ;

我先从CTE开始,以建立

Permissions
基于的“不可透视的”列表
AccessLevel
。如果可以将其放在SQL视图中,则可以在
WHERe
此处省略该语句,并在调用视图时调用它。如果可以将View放入数据库,则将是我的首选。

之后,我有CTE,我只是选择了基列(

AccountID
AccessType
AccessLevel
,然后我
CROSSAPPLY
一个逗号分隔的列表
Permissions
。我用
FOR XML PATH('')
构建一个逗号分隔的列表。

如果能够将其转换为视图,那将是一个简单的过程

<cfquery name="qryUserPerm" datasource="#Application.dsn#">    SELECt AccessType, AccessLevel, PermissionList    FROM myPermissionsView    WHERe AccountID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(session.AccountID)#"></cfquery>

如果不是,则必须尝试在

cfquery
标记内运行上述完整查询。

这应该给您返回一个数据集,例如:

| AccessType | AccessLevel |         PermissionList ||------------|-------------|------------------------||          F |B | 8010, 5412, 6103, 3106 |

您只有一个结果可以使用,而不必循环。

================================================== ====================

如果您想采用代码内方法,我仍然建议您尝试使用它

cfscript
来构建结构。但是,如果您可以有多个AccessLevel,则结果可能与您认为的不一样。您必须仔细检查您的数据。

  local.permissionType = q2.AccessType ;  local.permissionLevel = q2.AccessLevel ;  switch( q2.AccessLevel ) {    case "S" :  local.permissionList = q2.State ;      break ;    case "C" :  local.permissionList = ListRemoveDuplicates(ValueList(q2.City)) ;      break ;    case "B" :  local.permissionList = ListRemoveDuplicates(ValueList(q2.Building)) ;      break ;  }

https://trycf.com/gist/e811ec86f0d5a52fd9ce703f897cb5aa/acf2016?theme=monokai



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5649762.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存