我有桌子 Tb
Tb
ID | Name | Desc ------------------------- 1 | Sample | sample desc
我想在INSERT上创建一个触发器,该触发器将更改inserting的值Desc,例如:
Desc
INSERT INTO Tb(Name, Desc) VALUES ('x', 'y')
将导致
ID | Name | Desc ------------------------- 1 | Sample | sample desc 2 | x | Y edited
在上面的示例中,我得到了插入的值,将其Desc更改为大写并添加edited到末尾。
edited
这就是我所需要的,获取Desc要插入的内容并对其进行修改。
我怎样才能做到这一点?
插入更新后处理它是否更好?还是使用INSTEAD OF INSERT进行触发,并在表结构每次更改时对其进行修改?
使用插入后触发器。从inserted伪表连接到Tb主键上。然后更新desc的值。类似于:(但可能无法编译)
inserted
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语句完成之前。因此,新的,不正确的值已放置在目标表中。添加,删除列等时,无需更改此触发器。
insert
警告 触发完整性约束是在触发触发器之后执行的。因此,您不能施加检查约束来强制使用DESC的正确形式。因为这将导致语句在触发器有机会修复任何内容之前失败。(请在依赖之前仔细检查此段。自从我编写触发器以来已经有一段时间了。)