Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Kак избежать бесконечного цикла в рекурсивной процедуре  [new]
slishnevsky
Member

Откуда:
Сообщений: 242
Имеется рекурсивная процедура которая отслеживает дерево
parent - child - grandchild... по ключам (Parent.PK-Child.FK).

Процедураработает абсолютно корректно за исключением определённого случая когда в очередной раз найденная child таблица имеет PK который связан с FK таблицы найденной ранее.

Например если:
ParentTable.PK -> ChildTable.FK
ChildTable.PK -> ParentTable.FK

Такая ситуация вводит рекурсию в безконечный цикл.
Трогать структуру базы данных нельзя.
Меня интересует можно ли как нибудь обойти эту проблему.

Определение связей происходит через системные таблицы sysxxxxxxxx.

Спасибо.
3 фев 06, 17:58    [2319781]     Ответить | Цитировать Сообщить модератору
 Re: Kак избежать бесконечного цикла в рекурсивной процедуре  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
Добавить проверку parent <> grantchild...
3 фев 06, 18:03    [2319796]     Ответить | Цитировать Сообщить модератору
 Re: Kак избежать бесконечного цикла в рекурсивной процедуре  [new]
vooo
Member

Откуда:
Сообщений: 1316

Определение связей происходит через системные таблицы sysxxxxxxxx.

можно и через
select *
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where constraint_type='PRIMARY KEY' or constraint_type='FOREIGN KEY'
3 фев 06, 18:04    [2319806]     Ответить | Цитировать Сообщить модератору
 Re: Kак избежать бесконечного цикла в рекурсивной процедуре  [new]
Crimean
Member

Откуда:
Сообщений: 13148
любую рекурсию можно переписать циклом
аксиома
3 фев 06, 18:17    [2319866]     Ответить | Цитировать Сообщить модератору
 Re: Kак избежать бесконечного цикла в рекурсивной процедуре  [new]
StalkerS
Member

Откуда: Nowhere
Сообщений: 1343
Crimean
любую рекурсию можно переписать циклом
аксиома

к тому-же, исчезнет потенциально опасная ситуация превысить 32 уровневый порог...
3 фев 06, 18:20    [2319876]     Ответить | Цитировать Сообщить модератору
 Re: Kак избежать бесконечного цикла в рекурсивной процедуре  [new]
slishnevsky
Member

Откуда:
Сообщений: 242
Breakneck
Добавить проверку parent <> grantchild...


Ну это первое что пришло мне в голову.

Однако есть некоторые трудности, например, что если

ParentTable.PK -> ChildTable.FK
ChildTable.PK -> GrandchildTable.FK
GrandchildTable.PK -> ParentTable.FK ?

Как только рекурсия наткнётся на 3-ю строку
"GrandchildTable.PK -> ParentTable.FK" она снова пойдёт по-кругу.

Аналогично мёртвая петля может состоять и из 4-х, и из 5-и таблиц... и т.д
И даже из одной - возможен, например такой вариант:
ParentTable.PK -> ParentTable.FK, когда таблица содержит рекорды, каждый из которых может ссылаться на предудущие как на родительские. И в этом случае рекурсия зациклится на одной таблице в бесконечном вращении ;)
3 фев 06, 18:24    [2319898]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить