标题几乎说明了一切......我有一个带有INSTEAD OF INSERT触发器的表,它会检查某些事情并在事情没问题时执行实际插入。它还有一个FOR INSERT,UPDATE触发器,它根据新插入的行中的值更新其他表中的值。
我怀疑FOR INSERT,UPDATE触发器没有触发。为什么会这样?
答案 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中,右键单击“服务器”,然后选择“属性”。然后查看“高级”选项卡。