这个触发器的目的是什么?

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)

在我看来,这个触发器并没有做任何特别的事情,如果它被丢弃,结果将是一样的。我对吗?我错过了什么吗?

Han*_*non 3

你是对的; 由于此触发器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”中插入标识列的显式值。