He escrito una expresión CTE muy simple que recupera una lista de todos los grupos de los que un usuario es miembro.TSQL CTE: ¿Cómo evitar el recorrido circular?
Las reglas son así, un usuario puede estar en múltiples grupos y los grupos pueden anidarse para que un grupo pueda ser miembro de otro grupo, y además, los grupos pueden ser miembros mutuos de otro, entonces el Grupo A es un miembro del Grupo B y Grupo B es también un miembro del Grupo A.
Mi CTE es el siguiente y, obviamente, se produce una recursión infinita:
;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
)
no puedo encontrar una solución fácil a Back rastrear esos grupos que ya he grabado.
Estaba pensando en usar un parámetro varchar adicional en el CTE para registrar una lista de todos los grupos que he visitado, pero usar varchar es demasiado crudo, ¿no?
¿Hay una manera mejor?
¿Estás seguro de que es recurrente para siempre? El servidor predeterminado es 100 iteraciones. Intente leer la sugerencia de 'MAXRECURSION' en [MSDN] (http://msdn.microsoft.com/en-us/library/ms175972.aspx). – Bridge
Primero preocúpese por la eficacia, * luego * preocúpese por la crudeza, si el tiempo lo permite :) – AakashM
no se repite para siempre porque arroja un error después de 100 llamadas recursivas. Perdona mi redacción. – Haoest