插入前的 SQL Server 触发器

Posted

技术标签:

【中文标题】插入前的 SQL Server 触发器【英文标题】:SQL Server trigger before insert 【发布时间】:2017-11-05 06:49:56 【问题描述】:

我有一个包含几列的表,我想创建一个触发器,该触发器从一个或多个列中获取值并在另一列中设置值。

例如:

带有列 test1、test2、test3 的表测试。

我想从 test2 和 test3 中获取值并将它们设置在 test1 中。 原因是 test1 定义为 not null 并且值必须是 test2+test3

我可以在插入之前在触发器中执行此操作吗?

【问题讨论】:

SQL Server 没有BEFORE INSERT 触发器——唯一的选择(如果你真的必须使用触发器)是INSTEAD OF INSERT 触发器 【参考方案1】:

您可以添加如下计算列,无需触发器

create table t1
(
t1 as t2+t3,
t2 int,
t3 int
)

【讨论】:

如果 t1 不为空,那么上述查询是否有效?我认为如果 t1 值不为空,则应保留它,如果为空,则必须从 t2 和 t3 计算 我忘了说t2和t3不为空【参考方案2】:

试试这个:

IF OBJECT_ID('[dbo].[Demo]') IS NOT NULL
BEGIN
    DROP TABLE [dbo].[Demo];
END;

CREATE TABLE [dbo].[Demo]
(
    [test1] INT NOT NULL
   ,[test2] INT
   ,[test3] INT
);

GO

/*
Msg 515, Level 16, State 2, Line 15
Cannot insert the value NULL into column 'test1', table 'TEST.dbo.Demo'; column does not allow nulls. INSERT fails.
*/

INSERT INTO [dbo].[Demo] ([test2], [test3])
VALUES (1, 1);

GO

CREATE TRIGGER TRG_DEMO_I_I ON [dbo].[Demo] INSTEAD  OF INSERT AS
BEGIN 

    INSERT INTO [dbo].[Demo] ([test1], [test2], [test3])
    SELECT [test2] + [test3], [test2], [test3]
    FROM inserted;
END;

GO

-- this is OK
INSERT INTO [dbo].[Demo] ([test2], [test3])
VALUES (1, 1);

SELECT *
FROM [dbo].[Demo];

GO

【讨论】:

以上是关于插入前的 SQL Server 触发器的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 触发器切换插入、删除、更新

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

SQL Server 触发器插入导致锁定直到提交

SQL Server插入触发器改进

如何在插入时在 SQL Server 中创建触发器?

SQL Server 在插入时使用触发器删除行