2014-06-17 3 views
0

Я использую внешний ключ между таблицей A-> B. A-> child B-> parentПринудительный каскадный внешний ключ для активации триггера удаления (mssql)

Когда я удаляю регистр из B, все дети из A удаляются, потому что я создаю ограничение на удаление каскада. Но таблица A имеет триггер в состоянии AFTER DELETE.

Проблема в том, что этот триггер не работает, когда ограничение между A-> B удаляет регистры A.

Могу ли я заставить FK активировать этот триггер удаления?

(MS SQL 2008)

ответ

0

я попробовал тот же сценарий, как вы обсуждали (только имя становится наоборот) выше всего работает, как ожидалось. схема таблицы

CREATE TABLE A(ID INT PRIMARY KEY); 
INSERT INTO A VALUES(1); 
INSERT INTO A VALUES(2); 
INSERT INTO A VALUES(3); 
INSERT INTO A VALUES(4); 
CREATE TABLE B(BID INT FOREIGN KEY(BID) REFERENCES A(ID) ON DELETE CASCADE); 
INSERT INTO B VALUES(1); 
INSERT INTO B VALUES(2); 
INSERT INTO B VALUES(3); 
INSERT INTO B VALUES(4); 

и создал триггер как-

CREATE TRIGGER B_TRIGGER ON B 
AFTER DELETE 
AS 
BEGIN 
    RAISERROR ('TRIGGER IS RUNNING AFTER DELETE OPERATION!', 16, 1);  
END 

и когда я удалить строку из таблицы A (т.е. родительской таблицы) строку, которая имеет тот же идентификатор из таблицы B были удалены автоматически, так как каскадного удаления и триггера также запускается одновременно.

SQL Server Database Error: TRIGGER IS RUNNING AFTER DELETE OPERATION! 9 0 

поэтому, я думаю, что нет необходимости принудительно запускать курок.

+0

Спасибо. Не могли бы вы попробовать даже для DELETE триггера, PLS? – user3168487

+0

@ user3168487 как я знаю. ДЛЯ DELETE не является типом триггера в sql server.it имеет только ПОСЛЕ триггеров, INSTEAD OF Triggers, триггеры CLR. так что вы можете это подтвердить. – Krishna

Смежные вопросы