powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / каскадное удаление
17 сообщений из 17, страница 1 из 1
каскадное удаление
    #32021037
вова
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
каскадное удаление (MS SQL)
Ответьте, пожалуйста, кто-нибудь как осуществлять какскадное удаление
в связанных по внешнему ключу таблицах. Почитав help, обнаружил,
что в триггере удаления этого делать нельзя, поскольку он выполняется
после(!!!) того, как происходит проверка ссылочной целостности, которая и не позволяет удалить строку с первичным ключом, если с ней связаны строки в другой таблице
...
Рейтинг: 0 / 0
каскадное удаление
    #32021041
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотря какая версия сервера. SQL2000 поддерживает каскадные обновления и удаления. Все что ниже - нет. С тригера это обработать действительно не получится - он всегда выполняется после проверки сервером целостности. В этом плане всегда нравилась фича в Interbase - тригеры Before, выполняющиеся до всех операций проверки. К сожалению в MSSQL наверное нам такое не светит - насколько я знаю у Interbase и MSSQL абсолютно разная модель транзакций. Так что если у вас не SQL2000 то выход один - самому удалять дочерние данные.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021048
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 вова:
Если у Вас sql2k, используйте ON DELETE CASCADE при определении foreign key. Если все-таки Вам больше подходит триггер, попробуйте instead of trigger. Он срабатывает до (и вместо) удаления/вставки/изменения.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021264
VadikVR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каскадное удаление в MSSQL 70

Alter TRIGGER "tblNameUnit_DTrig" ON tblNameUnit FOR DELETE AS
SET NOCOUNT ON
/* * КАСКАДНЫЕ УДАЛЕНИЯ В 'tblUnit' */
DELETE tblUnit FROM deleted, tblUnit WHERE deleted.IdName = tblUnit.IdName

Таблица tblNameUnit на стороне Один, триггер к этой же таблице, ключ - IdName. Все прекрасно работает.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021304
А можно уточнить, зачем вообще понадобилось каскадное удаление? Ответ на этот вопрос интересен тем, что если каскадное удаление нужно как штатное средство для пользователя, то возникает подозрение о плохой структуре БД (или как минимум неээфективной структуре) или неправильной постановке ТЗ, а если это нужно как единичные административные мероприятия, то вообще смысла не имеет.

Желающих поспорить отсылаю к здавому смыслу, подправленному наблюдением: нужды каскадного удаления-обновления требуются исключительно людям с маленьким опытом создания БД.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021305
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Глеб Уфимцев

>Желающих поспорить отсылаю к здавому смыслу, подправленному наблюдением: нужды каскадного удаления-обновления требуются исключительно людям с маленьким опытом создания БД.

Не согласен я однако, простой пример - необходимость удалить внесенный в базу заказ, это то с чем я сталкивался, вообще то могут быть еще примеры.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021309
Еугене
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во-во, и целостность хочется блюсти на сервере (мсскл7.0) и каскадное удаление. Так что фраза про плохое проектирование непонятна. Хочется при удалении шапки документа удалять и строки его содержимого, однака
...
Рейтинг: 0 / 0
каскадное удаление
    #32021310
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух ты, что-то стоящее,- настоящий спор.

2 Глеб Уфимцев:
Банковское приложение. Покупка/продажа валюты порождает какое-то количество бухгалтерских проводок + аналитика. Удаление заявки подчищает бухгалтерию. И все автоматически, вместо ручного "программирования" в delete триггере.
Что тут не так?
...
Рейтинг: 0 / 0
каскадное удаление
    #32021316
SergD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Когда я учился RDBMS у меня сложилось впечатление, что автоматическое каскадное удаление это зло,как бы одно из положительных свойств форинкея перечеркивает (невозможность удаления объекта при существовании ссылок на него) и отсутствие такой возможности в MS SQL, я воспринимал как должное и то, что это есть даже в accsess'е меня не растраивало (видел, кстати, как использование этой возможности приносило проблемы), теперь я несколько изменил мнение, считаю, что каскадное удаление бывает полезно, но пользоваться этой фичей нужно как можно осторожней, чтобы не возникало таких ситуаций как например грохнули клиента и вмести с ним грохнулись все его заказы контакты и прочее и одни из этих заказов как раз обрабатывал Вася Пупкин.

С уважением, Сергей.
з.ы. сам правда каскадным удалением не пользуюсь
...
Рейтинг: 0 / 0
каскадное удаление
    #32021321
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>что каскадное удаление бывает полезно, но пользоваться этой фичей нужно как можно осторожней
Абсолютно согласен.
Что касается семерки, то просто нужно решить как его реализовать либо процедурой и оставить DRI, либо триггерами и в триггерах же реализовывать ссылочную целостность.
Я бы выбрал процедуры в том случае если нужно организовать какскад на нескольких таблицах, а не на всех, а вот вариант с каскадом по всей базе я как то не могу себе представить, так что в этом смысле могу с Глебом согласиться.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021335
По поводу удаления документа (master) и его содержимого (detail) - есть такие возражения:
1. Документ был (факт имел место), значит его отражение в БД не должно удаляться, а помечаться признаком "отклонено" или что-то подобное. Впоследствии это даст возможность иметь информацию, если таковой разговор возникнет, или маркетинговой статистики.
2. Если уж очень надо удалить, то в чем проблема написать процедуру DeleteDocument, которая в одной транзакции сперва удалит detail-информацию, а затем master-информацию. Такая процедура гораздо полезнее в плане организации прав, а также дальнейшего изменения структуры базы (достаточно будет подправить процедуру без перекомпиляции приложения).
...
Рейтинг: 0 / 0
каскадное удаление
    #32021336
...тем более, что такая процедура (а-ля DeleteZakazz) уже, как правило, имеется в приличной системе.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021347
MadDog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Глеб Уфимцев:

1. "отражение в БД не должно удаляться, а помечаться признаком "отклонено""
Отражение не удаляется "насмерть", все переписывается в таблицу(ы) аудита. В боевых таблицах чистые данные, не надо спотыкаться обо всякие признаки.

2. "проблема написать процедуру DeleteDocument"
Проблемы нет, процедура есть, только она проще, нет ручного программирования по удалению "сперва" и "затем", все удаляется автоматически, в соответствии со схемой данных.

Все-таки не понятно, чем ручное удаление лучше автоматического? Кроме совместимости, конечно.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021385
Как раз потому, что большой разницы нет, каскадные операции большой ценности не представляют.
Зато, отсутствие каскадных возможностей:
1. Тренирует мозги в плане вработке правильного и эффективного решения.
2. Обучает девелопера понимать физику явления, так как все что делают автоматически каскады - пройдет через ручки девелопера.
3. Позволяет не допустить ошибочных катастрофических изменений.

А уже только после полного просветления этих моментов рутинным опытом, введение каскадов дает ощущение полета.
...
Рейтинг: 0 / 0
каскадное удаление
    #32021953
Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, каскадное удаление (и обновление тоже) в MsSql2K несколько ограничено: во многих случаях он начинает ругаться, что возможна циклическая ссылка - и до свиданья. Хотя я уверен, что этого не произойдет.
Может как-то это ограничение можно обойти?
...
Рейтинг: 0 / 0
каскадное удаление
    #32022004
Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Абсолютно согласен с MadDog, нафига хранить записи о людях, с которыми ты работать уже не будешь. В боевых таблицах нечего делать "левым" данным.
...
Рейтинг: 0 / 0
каскадное удаление
    #32022048
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Абсолютно согласен с MadDog, нафига хранить записи о людях, с которыми ты работать уже не будешь. В боевых таблицах нечего делать "левым" данным
А кто решил, что ты с этими людьми уже не будешь работать (может злая бабка-уборщица или твой злой коллега, имеющие такие же права)?
С SQL работаем около 2-х лет и вопрос о каскадном удалении конечно же вставал, но не в коем случае об автомате (или вернее какая разница, что рисовать схему, что SP, что Trigger). На мой взгляд это не принципиальный вопрос, в отличии, скажем от вопроса: "В каких таблицах хранить данные" и т.п.
Прошу заметить это лишь мое мнение, темболее, что я не причисляю себя к профи
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / каскадное удаление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]