Сработает ли триггер FOR INSERT после того, как триггер INSTEAD OF INSERT выполнил вставку? - PullRequest
0 голосов
/ 11 марта 2011

Название в значительной степени говорит обо всем ... У меня есть таблица с триггером INSTEAD OF INSERT, которая проверяет определенные вещи и выполняет фактическую вставку, если все в порядке.Он также имеет триггер FOR INSERT, UPDATE, который обновляет значения в других таблицах на основе значений во вновь вставленной строке.

Я подозреваю, что триггер FOR INSERT, UPDATE не срабатывает.С чего бы это?

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

, который обновляет значения в других таблицах на основе значений во вновь вставленной строке.

Таблица «вставлена» в триггере FOR INSERT будет содержать значения, вставленные вашим INSTEAD OFтриггер, НЕ ваш оператор вставки.Например, рассмотрим следующий сценарий:

CREATE TABLE Test (
    id int IDENTITY NOT NULL,
    value varchar(20) NOT NULL,
    forTriggerValue char(1)  NULL
)
GO

CREATE TRIGGER forTrigger
ON Test
AFTER UPDATE 
AS 
    IF EXISTS (SELECT * FROM inserted WHERE value = 'MyNewValue')
    BEGIN
        UPDATE Test SET 
            forTriggerValue = 'A'
        FROM    inserted
        WHERE   Test.id IN (SELECT id FROM inserted)
    END
    ELSE IF EXISTS (SELECT * FROM inserted WHERE value = 'InsteadOfValue')
    BEGIN
        UPDATE Test SET 
            forTriggerValue = 'B'
        FROM    inserted
        WHERE   Test.id IN (SELECT id FROM inserted)
    END
    ELSE 
    BEGIN
        UPDATE Test SET 
            forTriggerValue = 'C'
        FROM    inserted
        WHERE   Test.id IN (SELECT id FROM inserted)
    END
GO

CREATE TRIGGER insteadOfTrigger
ON Test
INSTEAD OF  UPDATE 
AS 
    UPDATE Test SET 
        value = 'InsteadOfValue'
    FROM    inserted
    WHERE   Test.id IN (SELECT id FROM inserted)
GO

INSERT INTO Test (value) VALUES ('MyValue')
GO
UPDATE Test SET value = 'MyNewValue' WHERE value = 'MyValue'
GO

SELECT * FROM Test
GO

Ваше «forTriggerValue» будет «B», а не «A».

1 голос
/ 11 марта 2011

Проверьте настройку «Разрешить запуск других» на сервере.В SSMS щелкните правой кнопкой мыши на Сервере и выберите Свойства.Затем посмотрите на вкладку «Дополнительно».

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...