Способ проверки на рекурсивные внешние ключи - PullRequest
1 голос
/ 24 мая 2011

Скажем, у меня есть таблица с именем EMPLOYEE, а в таблице есть поле с именем ManagerID. Это поле является FK для другой записи таблицы EMPLOYEE о том, кто является их менеджером. Каков идеальный способ убедиться, что циклическая ссылка отсутствует (рекурсивные внешние ключи)?

РЕДАКТИРОВАТЬ - Позвольте мне добавить, что каждому сотруднику НЕ нужен менеджер. Будут некоторые записи сотрудников, для которых не установлено поле ManagerID.

* Пример: Пользователь 123 имеет пользователя 345 в качестве своего менеджера. Пользователь 345 имеет пользователя 567 в качестве своего менеджера. По какой-то безумной причине пользователь 567 имеет пользователя 123 в качестве своего менеджера.

Я хочу проверить, есть ли у пользователя 345 круговая ссылка. *

Как лучше всего это выяснить? Простой запрос? Код бизнес-логики (C # / VB.NET)?

Что сделали другие люди?

Пример схемы таблицы -

-- Employee Table --
UserID (int - PK)
ManagerID (int - FK to another UserID; can be null)

Ответы [ 2 ]

1 голос
/ 18 июня 2018

Если вы имеете дело с сервером SQL, вот решение, которое соответствует вашим требованиям;Вам нужно написать CTE для поиска циклических ссылок;

В приведенном ниже запросе вы получите идентификаторы пользователей с циклической ссылкой

WITH TRACKER AS
(


SELECT U.id,U.manager_id,CAST(','+cast(U.id as varchar(36))+',' as varchar(max)) as Path,0 as Cycle FROM User_table AS U
    UNION ALL
    SELECT U.id,U.manager_id, TRACKER.Path + CAST(U.id AS varchar(36))+',', case WHEN TRACKER.Path LIKE '%,'+CAST(U.id AS VARCHAR(36)) + ',%' then 1 else 0 end   FROM User_table AS U

 INNER JOIN TRACKER ON U.manager_id = TRACKER.id WHERE TRACKER.Cycle=0 
)

SELECT TRACKER.id from TRACKER where Cycle= 1;
1 голос
/ 25 мая 2011

Вот несколько стартеров - они используют либо рекурсивные CTE, либо курсоры:

http://blogs.msdn.com/b/sqlazure/archive/2010/07/01/10033575.aspx

http://social.msdn.microsoft.com/Forums/en-ZA/transactsql/thread/50a0bd26-87c8-4197-84f9-5fb1dfd792b6

...