Почему этот каскадный аннулирующий триггер не работает на SQL Server 2000 - PullRequest
1 голос
/ 08 марта 2012

У меня есть таблицы A и B. В таблице B есть ограничение внешнего ключа, ссылающееся на таблицу B. Но поскольку SQL Server 2000 поддерживает только каскадное удаление, а не аннулирование, я решил исправить это с помощью триггера.

Проблема: приведенный ниже триггер не работает:

CREATE TRIGGER dbo.TR_A_B_CascadingNullify ON dbo.A
FOR DELETE
AS
    UPDATE dbo.B
    SET idA = NULL
    WHERE idA IN (SELECT id FROM DELETED)
;

При удалении строки в A, на которую нет ссылок, все работает.Но когда ссылка на строку удаляется, она перестает работать с ограничением внешнего ключа сообщением DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_B_A'. The conflict occurred in database 'x', table 'B', column 'idA'.

И, наконец, при установке параметра Enforce Foreign Key Constraint на No триггер работает, идля столбца в таблице B установлено значение NULL.

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Ваш триггер срабатывает после УДАЛЕНИЯ, т.е. после того, как все проверки ссылок были выполнены.Из документации CREATE TRIGGER;

AFTER is the default when FOR is the only keyword specified.

Ваш единственный вариант afaik - использовать триггер INSTEAD OF .

2 голосов
/ 08 марта 2012

Самым простым решением, вероятно, является использование триггера INSTEAD OF, а не триггера AFTER. Тогда сама операция DELETE никогда не произойдет; вместо этого будет работать любая логика, которую вы вставите в триггер.

И как стандартный комментарий, SQL 2000 больше не поддерживается Microsoft, поэтому вам следует как можно скорее перейти на более новую версию.

...