多个操作语句的触发器为什么在执行时,只执行了第一句?
这个问题困扰了我好久,记得第一次遇到这个问题是半个月前,做牛腩新闻发布系统的数据库遇到这个问题,是关于级联删除的:当我们删除新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记录,但是通过如下触发器,我们就可以实现:
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
第二条语句不执行,也就是说,我删除“新闻”时,只可以把“新闻评论”删除,而新闻却留了下来,这很让人头疼。当时怎么都没有解决掉,然后就把这个问号画到了现在。
第二次遇到了,只能解决。又翻出数据库,开始折腾。
终于发现一个问题:这是改正后的触发器,在删除新闻评论,和删除新闻的语句中,都换成了变量,而变量@strnewstitle 在开始就进行了赋值。比较第一次的触发器:首先:变量没有定义,所以第二条语句没有被执行,第一条语句中,么有使用变量,所以执行了。
总结:问题其实很容易发现,多一点细心就可以了。当时就因为这个“小细节”,是的一个写了90%的触发器不可以使用,做什么都一样,可见细节是必须要重视的。
而这段时间老是很浮躁,所以,思考问题,发现问题都变得那么的轻浮,把本不该拖拉的工作拖拉了很久,表示惭愧。