2012-03-08 1 views
1

У меня есть таблицы A и B. Таблица B имеет ограничение внешнего ключа, ссылающееся на таблицу B. Но поскольку SQL Server 2000 поддерживает только каскадное удаление, а не nullify, я решил исправить это с помощью триггера.Почему этот каскадный триггер спуска не работает на 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) 
; 

При удалении строки в том, что не refered к, все работает. Но когда refered грести будет удален, он не будет работать на ограничение внешнего ключа с сообщением 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

Ваш триггер запускает после DELETE, т.е. после того, как все контрольные проверки выполнены. Из documentation of CREATE TRIGGER;

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

Ваш единственный вариант AFAIK заключается в использовании ВМЕСТО триггера.

+0

Я был введен в заблуждение по документации. Мне не было понятно, что означают варианты, и FOR выглядела как альтернатива AFTER и INSTEAD OF ... В любом случае, сейчас это работает очень хорошо. – doekman

2

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

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

+0

Я знаю, что SQL 2000 больше не поддерживается. Так же MS Access 97. Однако оба активно используются в производственной ситуации, и я ничего не могу с этим поделать. – doekman

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

  • Нет связанных вопросов^_^