我编写了一个非常简单的 CTE 表达式,它检索用户所属的所有组的列表。
规则是这样的,一个用户可以在多个组中,组可以嵌套,一个组可以是另一个组的成员,而且组可以是另一个组的成员,所以组A是组的成员B 组和 B 组也是 A 组的成员。
我的 CTE 是这样的,显然它会产生无限递归:
;WITH GetMembershipInfo(entityId) AS( -- entity can be a user or group
SELECT k.ID as entityId FROM entities k WHERE k.id = @userId
UNION ALL
SELECT k.id FROM entities k
JOIN Xrelationships kc on kc.entityId = k.entityId
JOIN GetMembershipInfo m on m.entityId = kc.ChildID
)
我找不到一个简单的解决方案来回溯我已经录制的那些组。
我正在考虑在 CTE 中使用一个额外的 varchar 参数来记录我访问过的所有组的列表,但是使用 varchar 太粗糙了,不是吗?
有没有更好的办法?