多个操作语句的触发器为什么在执行时,只执行了第一句?

多个操作语句的触发器为什么在执行时,只执行了第一句?

这个问题困扰了我好久,记得第一次遇到这个问题是半个月前,做牛腩新闻发布系统的数据库遇到这个问题,是关于级联删除的:当我们删除新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记录,但是通过如下触发器,我们就可以实现:

create trigger trigcategorydelete

on category

instead of delete

as

begin

declare @id int  --定义一个变量id

select @id=id from deleted  --从deleted临时表中,赋值id给变量@id

delete news where caId=@id  --先删除该类别下的所有新闻

delete category where id=@id  --然后删除新闻类别 

end

当时学习这里的时候,重点在“级联删除”。看完视频后,根据对触发器的理解,自己写的触发器,如下:

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<删除新闻触发器,因为存在外键,在删除新闻时,需要先删除新闻评论>
-- =============================================
ALTER TRIGGER [dbo].[trigDeleteNews] 
   ON  [dbo].[新闻表] 
   instead of delete
AS 
BEGIN
	--声明新闻变量
	declare @strNewsTitle varchar(10)
	--删除新闻评论
	delete 新闻评论表 where 新闻标题=(select 新闻标题 from deleted)
	--删除新闻
	delete 新闻表 where 新闻标题=@strNewsTitle

END

悲剧发生了,我写的触发器,只执行第一条语句:

多个操作语句的触发器为什么在执行时,只执行了第一句?_第1张图片

第二条语句不执行,也就是说,我删除“新闻”时,只可以把“新闻评论”删除,而新闻却留了下来,这很让人头疼。当时怎么都没有解决掉,然后就把这个问号画到了现在。

第二次遇到了,只能解决。又翻出数据库,开始折腾。

终于发现一个问题:这是改正后的触发器,在删除新闻评论,和删除新闻的语句中,都换成了变量,而变量@strnewstitle 在开始就进行了赋值。比较第一次的触发器:首先:变量没有定义,所以第二条语句没有被执行,第一条语句中,么有使用变量,所以执行了。



总结:问题其实很容易发现,多一点细心就可以了。当时就因为这个“小细节”,是的一个写了90%的触发器不可以使用,做什么都一样,可见细节是必须要重视的。

而这段时间老是很浮躁,所以,思考问题,发现问题都变得那么的轻浮,把本不该拖拉的工作拖拉了很久,表示惭愧。


你可能感兴趣的:(多个操作语句的触发器为什么在执行时,只执行了第一句?)