在INSTEAD OF INSERT触发器执行插入后,FOR INSERT触发器是否会触发?

时间:2011-03-11 13:57:15

标签: sql-server sql-server-2008 triggers

标题几乎说明了一切......我有一个带有INSTEAD OF INSERT触发器的表,它会检查某些事情并在事情没问题时执行实际插入。它还有一个FOR INSERT,UPDATE触发器,它根据新插入的行中的值更新其他表中的值。

我怀疑FOR INSERT,UPDATE触发器没有触发。为什么会这样?

2 个答案:

答案 0 :(得分:3)

  

更新其他表中的值   基于新的值   插入行。

FOR INSERT触发器中的“inserted”表将包含INSTEAD OF触发器插入的值, NOT 您的insert语句。例如,请考虑以下脚本:

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 :(得分:1)

检查服务器上的“允许触发其他人”设置。在SSMS中,右键单击“服务器”,然后选择“属性”。然后查看“高级”选项卡。

enter image description here