powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу зажечь триггер на удаление
9 сообщений из 9, страница 1 из 1
Не могу зажечь триггер на удаление
    #32022132
Axl_Dead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такая вот ерунда.

Вставил триггер типа INSERT - здесь все нормально.
А вот триггер типа DELETE не может отработать. При попытке удалить строку из таблицы с PRIMARY KEY, CONSTRAIN для FOREIGN KEY запрещает операцию.
Во втором триггере определил установку поля строки со значением внешнего ключа равным удаляемого первичного, в NULL, после этого удаление строки из зависимой таблицы. Строка из таблицы с PRIMARY KEY должно быть удалена в результате самой команды, после отработки триггера, я так понимаю.

Логику со стороны клиента реализовать не могу, INSERT и DELETE выполняет программа, вот и приходится возится с серверными триггерами. Можно конечно отключить ограничения, но что-то не хочется... Помогите советом плиз..
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022139
Dima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сначала выполняются и проверяются все constraints, установленные для таблицы - foreign keys, check, defaults и т.д.и только потом управление передается триггеру. Удаление подчиненных записей перед удалением родительской записи через триггер на удаление невозможно.
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022140
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вам поможет триггер типа
CREATE TRIGGER Table1_TRG ON Table1 INSTEAD OF DELETE AS ...
при этом все удаления надо будет делать внутри триггера в нужной последовательности.
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022141
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если речь идет о SQL2000, то может помочь INSTEAD OF триггер:

create table a(pk int identity(1,1) not null,s nvarchar(10))
create table b(pk int identity(1,1) not null, apk int)
go

alter table a add constraint a_pk primary key clustered (pk)
go
alter table b add constraint b_apk foreign key (apk) references a(pk)
go

CREATE TRIGGER Tr_A_InsteadOfDelete
ON a
INSTEAD OF Delete
AS
BEGIN
Delete b from b inner join deleted d on b.apk=d.pk
Delete a from a inner join deleted d on a.pk=d.pk
END
GO

insert into a(s) values('0001')
insert into a(s) values('0002')
insert into a(s) values('0003')
insert into a(s) values('0004')

insert into b(apk) values(1)
insert into b(apk) values(1)
insert into b(apk) values(1)
insert into b(apk) values(3)
insert into b(apk) values(3)
insert into b(apk) values(3)
GO

Select * from a
Select * from b

delete a where pk=1

Select * from a
Select * from b

delete a where pk=2

Select * from a
Select * from b

delete a where pk=3

Select * from a
Select * from b

delete a where pk=4

Select * from a
Select * from b
GO
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022146
Axl_Dead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно INSTEAD OF и помог бы но у меня SQL 7.0. А в "семерке" про это и не слыхивали.

Я правда не совсем верно проблему осветил, строки в главной таблице обновляются подсистемой репликации. Зависимая таблица навешивается на главную как локальные данные.

Решение должно быть, Е.Мамаев в своей книжке так и говорит, мол используйте триггеры для каскадирования. Только примера не дает.
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022149
Pandre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ON DELETE CASCADE - тоже для SQL 2000.
Есть еще такая вещь при определении Constraint:
NOT FOR REPLICATION
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022150
Axl_Dead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NOT FOR REPLYCATION применяется для репликации сведением, насколько я знаю, а у нас REPLICATION SNAPSHOT. Да и проблема не в этом AFAIK, как триггер отработать если у ему ограничения мешают?
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022157
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, в SQL 7 придется убрать FOREIGN KEY и отслеживать все в триггерах.
...
Рейтинг: 0 / 0
Не могу зажечь триггер на удаление
    #32022161
Axl_Dead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Александр, я пришел к такому же мнению. Более того вот что написано в BOL 7.0

==================================
Because CHECK constraints can reference only the columns on which the column- or table-level constraint has been defined, any cross-table constraints (in this case, business rules) must be defined as triggers.
==================================

Не могу поверить что такая простая операция не была предусмотрена. :-0
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу зажечь триггер на удаление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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