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

Откуда: Hamburg
Сообщений: 36
Добрый день,

у меня следующая проблема: имеется N таблиц, связанных между собой с ForeignKeys на несколько уровней вниз. Задача - програмно заменить функциональность CASCADE DELETE (ну вот надо так). Т.е. надо удалять строки из одной таблицы и всех с ней связанных и ещё ниже связанных и т.д...
Есть-ли вариант что бы не делать постонно SELECT, смотреть можно-ли удалить или есть зависимости, делать след. SELECT и т.д.... ?

Константин
26 авг 05, 13:05    [1820324]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Только, разве что, триггерами. Только придется не только каскад поддердивать в триггерах, но и всю логику связей, а их сами убирать.
26 авг 05, 13:09    [1820345]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
Glory
Member

Откуда:
Сообщений: 104760
BigMac
Есть-ли вариант что бы не делать постонно SELECT, смотреть можно-ли удалить или есть зависимости, делать след. SELECT и т.д.... ?


При CASCADE DELETE вроде как раз ничего не проверяется, а все удаляется автоматом.
26 авг 05, 13:10    [1820351]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
BigMac
Member

Откуда: Hamburg
Сообщений: 36
Тригерами тоже не подходит - клиент хочет что-то более независимое от MS-SQL. На самом деле не обязательно что бы это выполнялось динамически. Хватило бы сделать это один раз (в смысле получить все нужные зависимости)
26 авг 05, 13:11    [1820355]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
BigMac
Member

Откуда: Hamburg
Сообщений: 36
Glory
BigMac
Есть-ли вариант что бы не делать постонно SELECT, смотреть можно-ли удалить или есть зависимости, делать след. SELECT и т.д.... ?


При CASCADE DELETE вроде как раз ничего не проверяется, а все удаляется автоматом.


ну вот именно. Т.е. если я хочу это делать "руками" - мне надо самому проверять все зависимости....
26 авг 05, 13:12    [1820362]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
BigMac
Тригерами тоже не подходит - клиент хочет что-то более независимое от MS-SQL.

Ну да, динамическая проверка связей будет более платформо-независима, как же.
автор
Хватило бы сделать это один раз (в смысле получить все нужные зависимости)

Ага. А потом добавится связь-другая, и надо будет получать еще раз. И еще раз. И еще много-много раз.
26 авг 05, 13:24    [1820432]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
BigMac
Member

Откуда: Hamburg
Сообщений: 36
Гавриленко Сергей Алексеевич
BigMac
Тригерами тоже не подходит - клиент хочет что-то более независимое от MS-SQL.

Ну да, динамическая проверка связей будет более платформо-независима, как же.
автор
Хватило бы сделать это один раз (в смысле получить все нужные зависимости)

Ага. А потом добавится связь-другая, и надо будет получать еще раз. И еще раз. И еще много-много раз.


На самом деле связи будут добавляться очень редко - можно сказать уже никогда ;-) Поэтому вполне подошло бы одноразовое решение........
26 авг 05, 13:27    [1820445]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Непонятно, какое в итоге решение вы хотите получить.

1. Использовать CASCADE DELETE, который есть в MSSQL. Вы его не хотите, вычеркиваем.

2. Иметь FOREIGN KEY и одновременно триггер, который бы обеспечивал каскадность. Низзя. Технически невозможно, потому что сначала проверяются все констрейнты, потом только выполняются триггера. До "каскадного" триггера дело не дойдет, вывалится ошибка.

3. Перенести всю логику связей в триггеры: и реализацию, аналогичную FOREIGN KEY, и реализацию каскадности.

4. Перенести все на уровень выше по архитектуре - в клиента, или в промежуточный уровень, если таковой имеется.
---------------

Как я понимаю, вас устраивает только п.3. Какие вопросы по нему есть? Как получить список связей программно? Или что непонятно?
26 авг 05, 16:15    [1821433]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
GreenSunrise
Как я понимаю, вас устраивает только п.3. Какие вопросы по нему есть? Как получить список связей программно? Или что непонятно?

Не устраивает пунк три его, ибо
BigMac
Тригерами тоже не подходит - клиент хочет что-то более независимое от MS-SQL.

гемора ему охота.
26 авг 05, 16:24    [1821489]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Ааа. Ну тады только п.4

Вопрос "что вам непонятно?" все равно остался обращенным к автору.
26 авг 05, 16:39    [1821574]     Ответить | Цитировать Сообщить модератору
 Re: Как выполнять свой CASCADE DELETE?  [new]
BigMac
Member

Откуда: Hamburg
Сообщений: 36
Спасибо, пришлось остановиться на п.4. Геммора мне не хочется, но деваться некуда...
29 авг 05, 13:41    [1825211]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить