一尘不染

如何在SQL Server的触发器中编辑INSERT的值?

sql

我有桌子 Tb

ID | Name   | Desc
-------------------------
 1 | Sample | sample desc

我想在INSERT上创建一个触发器,该触发器将更改inserting的值Desc,例如:

INSERT INTO Tb(Name, Desc) VALUES ('x', 'y')

将导致

ID | Name   | Desc
-------------------------
 1 | Sample | sample desc
 2 | x      | Y edited

在上面的示例中,我得到了插入的值,将其Desc更改为大写并添加edited到末尾。

这就是我所需要的,获取Desc要插入的内容并对其进行修改。

我怎样才能做到这一点?

插入更新后处理它是否更好?还是使用INSTEAD OF INSERT进行触发,并在表结构每次更改时对其进行修改?


阅读 267

收藏
2021-05-05

共1个答案

一尘不染

使用插入后触发器。从inserted伪表连接到Tb主键上。然后更新desc的值。类似于:(但可能无法编译)

CREATE TRIGGER TbFixTb_Trg 
ON  Tb  
AFTER INSERT 
AS  
BEGIN 
    UPDATE Tb
    SET DESC = SomeTransformationOf(i.DESC)
    FROM Tb
    INNER JOIN inserted i on i.Id = Tb.Id
END  
GO

此触发发生在插入发生之后但insert语句完成之前。因此,新的,不正确的值已放置在目标表中。添加,删除列等时,无需更改此触发器。

警告
触发完整性约束是在触发触发器之后执行的。因此,您不能施加检查约束来强制使用DESC的正确形式。因为这将导致语句在触发器有机会修复任何内容之前失败。(请在依赖之前仔细检查此段。自从我编写触发器以来已经有一段时间了。)

2021-05-05