概述
我最近在创建触发器时遇到错误。这是一个快速记录:错误信息:
[42000] [Microsoft][SQL Server Native Client 10.0][SQL Server] Text、ntext 或image 列不能在“插入”和“删除”表中使用。 (311) 解决思路和方法记录如下,仅供大家参考。
思路
除非使用IS NULL 或LIKE 运算符,否则无法对Text、ntext 和image 数据类型进行比较或排序。如果将其更改为而不是此处,则可以访问触发器中的二进制字段,而无需这样做。根据ID进行检查。
所以这里我们只是将“AFTER”改为“Instead”。
调整后:
那么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 触发器。
3,实例:
代替触发器:
向表“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 内容,如果您感兴趣,请继续关注。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。