Триггеры

Andrew
Дата: 26.02.2001 13:08:54
Если в некоторых SQL серверах есть возможность создания триггеров типа AFTER DELETE , BEFORE DELETE , то в MS SQL 7.0 , как я понимаю , триггеры выполняются после модификации данных.
Получается так , что нельзя написать триггер ,
который бы при удалении строки из главной таблицы , сперва удалил зависимые строки из подчиненных таблиц ? Или я не прав ? Посоветуйте , как выйти из этой ситуации . Заранее благодарен за ответ .
Genady
Дата: 26.02.2001 13:50:50
Да, Вы не правы, в MSSQL 7 можно удалить записи в зависимых таблицах. Подробно о механизме работы триггеров в MSSQL 7 я бы посоветовал почитать Books online.
В MSSQL 7 есть три типа триггера insert update delete.
Вам нужен delete
Пример:
create trigger td_mytableParent on mytableParent for delete as
begin
declare
@numrows int

select @numrows = @@rowcount
if @numrows = 0
return

/* Delete all children in "mytableChild" */

delete mytableChild
from mytableChild t2, deleted t1
where t2.ID = t1.ID

return
end
go
Genady
Дата: 26.02.2001 13:56:58
Да, вот еще насчет механизма работы триггеров. При удалении, действительно вначале удаляются записи, но операция не будет закончена, если есть триггер. При удалении все удаленные записи помещаются в таблицу deleted, на основании этой таблицы и можно провести каскадное удаление в зависимых таблицах, да и в общем Вы можете запрограммировать любую проверку или обновление на этом этапе.

Удачи
Garya
Дата: 26.02.2001 19:56:47
> Получается так , что нельзя написать триггер , который бы при удалении строки из
> главной таблицы , сперва удалил зависимые строки из подчиненных таблиц ?
Ну почему же? Можно! Нельзя только в том случае, если между этими таблицами задейстовавн механиз поддержки декларативной ссылочной целостности (DRI). Нужно выбрать что-либо одно - либо DRI, либо триггеры.
Примечание. В MS SQL-2000 возможна настройка DRI с каскадным удалением/обновлением записей.