SHR*_*SHR 7 trigger sql-server
我在尝试分析一些数据库时偶然发现了这个触发器:
Create trigger [tbl_Details_Trigger] on [tbl_Details]
Instead of Insert
As
Insert into [tbl_Details]
Select * from inserted
Run Code Online (Sandbox Code Playgroud)
在我看来,这个触发器并没有做任何特别的事情,如果它被丢弃,结果将是一样的。我对吗?我错过了什么吗?
你是对的; 由于此触发器INSTEAD OF INSERT只是将插入的数据插入到定义触发器的表中,因此唯一的结果就是插入数据,就像触发器不存在一样。
与任何和所有更改一样,在生产中删除此触发器之前,请确保在开发/测试环境中测试更改。
有趣的是,如果表包含IDENTITY列,您将无法创建触发器。考虑这个在 SQL Server 2016+ 上运行的重现:
USE tempdb;
DROP TABLE IF EXISTS dbo.insert_test;
CREATE TABLE dbo.insert_test
(
i int NOT NULL
CONSTRAINT PK_insert_test
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, d varchar(100) NOT NULL
);
GO
CREATE TRIGGER insert_test_trigger ON dbo.insert_test
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.insert_test (i, d)
SELECT i, d
FROM inserted;
END
GO
INSERT INTO dbo.insert_test (d)
VALUES ('test');
SELECT *
FROM dbo.insert_test;
Run Code Online (Sandbox Code Playgroud)
结果:
消息 544,级别 16,状态 1,过程 insert_test_trigger,第 8 行 [批处理开始第 24 行]
当 IDENTITY_INSERT 设置为 OFF 时,无法在表“insert_test”中插入标识列的显式值。