Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / каскадное удаление / 17 сообщений из 17, страница 1 из 1
19.01.2002, 07:49
    #32021037
вова
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
каскадное удаление
каскадное удаление (MS SQL)
Ответьте, пожалуйста, кто-нибудь как осуществлять какскадное удаление
в связанных по внешнему ключу таблицах. Почитав help, обнаружил,
что в триггере удаления этого делать нельзя, поскольку он выполняется
после(!!!) того, как происходит проверка ссылочной целостности, которая и не позволяет удалить строку с первичным ключом, если с ней связаны строки в другой таблице
...
Рейтинг: 0 / 0
19.01.2002, 20:33
    #32021041
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
каскадное удаление
Смотря какая версия сервера. SQL2000 поддерживает каскадные обновления и удаления. Все что ниже - нет. С тригера это обработать действительно не получится - он всегда выполняется после проверки сервером целостности. В этом плане всегда нравилась фича в Interbase - тригеры Before, выполняющиеся до всех операций проверки. К сожалению в MSSQL наверное нам такое не светит - насколько я знаю у Interbase и MSSQL абсолютно разная модель транзакций. Так что если у вас не SQL2000 то выход один - самому удалять дочерние данные.
...
Рейтинг: 0 / 0
20.01.2002, 13:48
    #32021048
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
каскадное удаление
2 вова:
Если у Вас sql2k, используйте ON DELETE CASCADE при определении foreign key. Если все-таки Вам больше подходит триггер, попробуйте instead of trigger. Он срабатывает до (и вместо) удаления/вставки/изменения.
...
Рейтинг: 0 / 0
23.01.2002, 00:36
    #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
23.01.2002, 08:43
    #32021304
каскадное удаление
А можно уточнить, зачем вообще понадобилось каскадное удаление? Ответ на этот вопрос интересен тем, что если каскадное удаление нужно как штатное средство для пользователя, то возникает подозрение о плохой структуре БД (или как минимум неээфективной структуре) или неправильной постановке ТЗ, а если это нужно как единичные административные мероприятия, то вообще смысла не имеет.

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

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

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

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

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

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

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

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

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


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