SQL Server: повлияет ли триггер INSTEAD OF на проверку ссылочной целостности? - PullRequest
1 голос
/ 30 июня 2011

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

Будет ли триггер INSTEAD OF заставлять меня писать все проверки целостности?

Поскольку триггеры не могут изменить вставленную таблицу и данные не могут существовать в целевой таблице из-за ссылочной целостности, есть ли способ обнулить эти внешние ключи, чтобы записи могли сохранять?

РЕДАКТИРОВАТЬ: Самая большая ошибка, которую я сделал, это не знать, что база данных не будет вносить никаких изменений, если существует триггер INSTEAD OF. Триггер должен внести изменения в саму таблицу.

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Как указывает @Catcall, ссылочное действие ON DELETE SET NULL делает то, что вам нужно.

Тем не менее, вы можете написать триггер INSTEAD OF, чтобы сделать то же самое (или варианттема) без необходимости заботиться обо всех ограничениях ссылочной целостности самостоятельно.Вот краткий пример:

Таблицы и тестовые данные:

CREATE TABLE T1 (ID INTEGER NOT NULL UNIQUE);
CREATE TABLE T2 (ID INTEGER REFERENCES T1 (ID));

INSERT INTO T1 VALUES (1), (2), (3);
INSERT INTO T2 VALUES (1), (2), (3), (2), (3), (3);

Триггер:

-- 'CREATE TRIGGER' must be the first statement in a batch.
CREATE TRIGGER tr__T1__instead_of_delete
ON T1
INSTEAD OF DELETE
AS
BEGIN;

UPDATE T2
   SET ID = NULL
 WHERE EXISTS (
               SELECT * 
                  FROM deleted
                 WHERE deleted.ID = T2.ID
              );

DELETE
  FROM T1
 WHERE EXISTS (
               SELECT * 
                  FROM deleted
                 WHERE deleted.ID = T1.ID
              );

END;

Проверка триггера:

DELETE 
  FROM T1 
 WHERE ID = 3;
1 голос
/ 30 июня 2011

Если внешний ключ обнуляется, вы можете использовать ON DELETE SET NULL, который обновит внешний ключ до NULL, если строка, на которую есть ссылка, будет удалена.

ON DELETE SET DEFAULT - это еще одна возможность, в зависимости от вашего приложения.

...