首页 > 自考资讯 > 自考知识

instead of触发器和after触发器的特点,关于after触发器和insteadof触发器

头条共创 2024-06-27

概述

我最近在创建触发器时遇到错误。这是一个快速记录:错误信息:

[42000] [Microsoft][SQL Server Native Client 10.0][SQL Server] Text、ntext 或image 列不能在“插入”和“删除”表中使用。 (311)975f817ef6da4ac0b77c5485a3df0b59~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720077788&x-signature=otuvZeOOTjcaInF7SyHE1eyUQr0%3D 解决思路和方法记录如下,仅供大家参考。

思路

除非使用IS NULL 或LIKE 运算符,否则无法对Text、ntext 和image 数据类型进行比较或排序。如果将其更改为而不是此处,则可以访问触发器中的二进制字段,而无需这样做。根据ID进行检查。

所以这里我们只是将“AFTER”改为“Instead”。

调整后:

71529dbb1af146f6a5908a4dad1570ce~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720077788&x-signature=8IcVfnQx5tJEh1Fa%2BdNh%2BV7LPcI%3D

那么AFTER和instead of有什么区别呢?

1. 代替触发器

INSTEAD OF 触发器用于替换常规触发器操作。也就是说,当对表执行INSERT、UPDATE或DELETE操作时,系统不会直接对表执行这些操作,而是将操作的内容传递给服务器。按下扳机并检查扳机操作。正确后才进行相应的操作。因此,INSTEAD OF 触发器在处理表约束之前运行。

INSTEAD OF 触发器的工作方式与完整性约束类似。使用数据库时,使用约束可能会获得更好的结果。触发器允许您定义比完整性约束更复杂的约束。

INSTEAD OF 触发器可以在表以及具有一个或多个实际表的视图上定义,但仅限于应用于作为级联引用完整性约束的目标的表。

2. 触发后

AFTER 触发器定义在表上执行INSERT、UPDATE 或DELETE 语句后要执行的操作。例如,如果您对一张表中的数据执行更新操作,然后立即需要对相关表执行指定操作,则可以使用AFTER 触发器。 AFTER 触发器只能在表上指定并在约束处理之后进行操作。

您只能在每个表上创建一个INSTEAD OF 触发器,但可以创建多个AFTER 触发器。

c35d5603ea3a48b58a3731541ef0ce8b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720077788&x-signature=s4JEqBpQQxKrajfNcyCSWahpoOs%3D3,实例:

代替触发器:

向表“0261”插入数据时,检查表“026”中是否存在学号,如果存在则插入。如果不存在,则不会插入。

CREATE TRIGGER [checkid] ON [dbo].[0261] INSTEAD OF insertASIF NOT EXISTS(SELECT * FROM 026 WHERE 学号=(从INSERTED 中选择学号)) BEGIN ROLLBACK TRANSACTION PRINT '要处理的学号不存在。 ' ENDELSE BEGIN INSERT INTO plan 0261 select * from selected PRINT ' 记录处理成功。 'ENDAFTER 触发器:

当您在排序表上设置类型为AFTER (FOR) 的INSERT 触发器时,插入记录时,排序统计表中会自动计算统计信息。

CREATE TRIGGER [orderinsert] ON [dbo].[订单表]AFTER INSERTASDECLARE @bookid int, @ordernum int, @num intSELECT @bookid=书号,@ordernum=数量FROM INSERTEDSELECT @num=count(书号) FROM 订单统计表WHERE 书号=@bookidIF @num=0 -- 未找到书。插入一条记录。 INSERT INTO 订购统计表VALUES (@bookid, @ordernum) ELSE -- 找到图书。更新记录。 UPDATE 订购统计表SET 订单总数量=订单总数量+ @ordernum WHERE 书号=@bookid 如果您的朋友觉得有用,请帮我们转发。稍后我将分享更多DevOps 和DBA 内容,如果您感兴趣,请继续关注。

8ab83e5e0a09496baf9cd7e26ea97980~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1720077788&x-signature=XIysuIerSnfyXtQqCEpo1Bg8Lwg%3D

版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。

猜你喜欢