【发布时间】:2017-11-26 08:52:31
【问题描述】:
Microsoft Documentation 声明“关于何时引用具有 INSTEAD OF 触发器的表的 INSERT 或 UPDATE 语句必须为列提供值的规则与表没有 INSTEAD OF 触发器时的规则相同”。
但是:
CREATE TABLE tbTriggerTest (id INT PRIMARY KEY);
GO
CREATE TRIGGER dbo.tgTriggerTest
ON dbo.tbTriggerTest
INSTEAD OF INSERT
BEGIN
SELECT * FROM INSERTED
END
GO
INSERT tbTriggerTest DEFAULT VALUES
GO
即使在 INSERT 语句级别我将空值插入到主键中,也不会引发错误。实际上 INSERTED.id 在这种情况下为 NULL。那么文档不正确还是仅适用于触发器内部?
编辑:响应建议的答案,说明调用者必须为非空列提供一些值,即使它为空,以下不会引发错误但可以说不提供任何值对于列ij。
CREATE TABLE tbTriggerTest2
(
id INT,
ij INT,
CONSTRAINT PK PRIMARY KEY (id, ij)
)
GO
CREATE TRIGGER dbo.tgTriggerTest2
ON dbo.tbTriggerTest2
INSTEAD OF INSERT
AS
BEGIN
SELECT * FROM INSERTED;
END
GO
INSERT tbTriggerTest2 (id) VALUES (0)
GO
【问题讨论】:
-
您的触发器只是选择...,它试图从触发器返回结果集,但已弃用。它实际上并没有插入任何东西。它应该改为“插入到 tblTriggerTest SELECT * FROM 插入”。
-
我知道@pmbAustin,这只是表明当触发器放在桌面上时规则确实会改变。
标签: sql-server tsql triggers sql-server-2016