Помощь по триггеру SQL Server - PullRequest
2 голосов
/ 05 июня 2011

Предположим, у меня есть 3 таблицы

t1

Nid   name
1    aaa
2    bbb
3    ccc

delT1

Nid    name

t2

Sid    Nid     value
1      1       AAA
2      1       BAC
3      2       CSA

В таблице t1 Nid - это первичный ключ, который является внешним ключом для t2

Теперь я хочу, чтобы при удалении значения из t1 он автоматически удалял все значения из t2, где t1.Nid=t2.Nid и значение удаленного t1 вставляется в delT1

Как создать триггер для этого типа задачи?

Пожалуйста, помогите мне, так как я новичок в SQL

Ответы [ 3 ]

4 голосов
/ 05 июня 2011

Обычный триггер не сработает: внешний ключ выдаст ошибку до запуска кода.

Что вы можете сделать, это установить CASCADE на свой внешний ключ, чтобы удаление в T1 автоматически удаляло из T2.

Лично я бы использовал сохраненную процедуру и транзакцию для удаления сначала из T2, а затем из T1.

2 голосов
/ 05 июня 2011

Измените FK в T2 на ON DELETE CASCADE:

ALTER TABLE T2 DROP CONSTRAINT FK_T1_Nid; <-- your constraint name here
ALTER TABLE T2 ADD CONSTRAINT FK_T1_Nid FOREIGN KEY (Nid)
   REFERENCES T1 (Nid) ON DELETE CASCADE;

Затем создайте триггер на T1 для передачи информации в delT1:

CREATE TRIGGER TR_T1_D ON T1 FOR DELETE
AS
SET NOCOUNT ON;
INSERT delT1
SELECT Nid, Name
FROM Deleted;

Обратите внимание, что этот триггер не позволяет использовать предложение OUTPUT в DELETE для T1. BOL говорит :

Если предложение OUTPUT указано без указания ключевого слова INTO, для цели операции DML не может быть определен какой-либо включенный триггер для данного действия DML. Например, если предложение OUTPUT определено в операторе UPDATE, в целевой таблице не должно быть никаких включенных триггеров UPDATE.

2 голосов
/ 05 июня 2011

@ gbn имеет предпочтительный путь.Поскольку вы запросили триггер, вы можете сделать это для сравнения:

CREATE TRIGGER t1_Delete ON t1
INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON;
  INSERT INTO delT1 (Nid, name)
  SELECT Nid, name
  FROM DELETED;

  DELETE FROM t2
  WHERE t2.Nid IN (SELECT Nid FROM DELETED);

  DELETE FROM t1
  WHERE t1.Nid IN (SELECT Nid FROM DELETED);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...