Instead of 触发器的作用
# 理解
在此之前,对于insert、update、delete触发器已经学习的很完善了,但始终不理解instead of触发器真正作用在哪里,因为其实之前的三种触发器其实已经能解决很多复杂的问题了。
并且,对于“after触发器只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上;instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。”这句话我并不理解。
但在无意间看到这一篇大佬的博客后(点击这串文字,到达该博主博客),我真正理解了instead of 触发器。
after触发器是在操作成功后,所采取的一些动作
而对于instead of触发器,真正起作用的是触发器里面的动作!
用文字不好将其中的道理解释清楚,所以请仔细理解以下得例子(例子也是来自那位大佬)。
# 举例
& 首先这里有两个表,一个是新闻类别表( caregory ),一个是新闻表( news )。顾名思义,每一个新闻都有一个类别属性,该属性对应在类别表中;每一个类别可以对应有新闻表中的多条新闻(不知道解释清楚没)。总的来说:news表的主键为id,外键为caID,与caregory的主键相对,此时通过主外键将两个表连接起来。(建立好后,先在其中插入数据)
--> 如下,创建了一个delete触发器,其功能为删除一个新闻类别,以及该新闻类别下所有的新闻
1 CREATE TRIGGER De_c 2 ON caregory 3 FOR DELETE 4 AS 5 DELETE news WHERE caid = ( SELECT id FROM deleted )
▷ 创建好后,实现语句:
DELETE FROM caregory WHERE id = 2;
会出现以下报错:
✔出错原因:after触发器是在执行完delete操作后执行的,执行操作后,该新闻类别已经不存在了,当触发器再执行删除新闻时,新闻类别已经找不到了,就无法删除掉新闻(因为 news 表有外键,需要在外键存在的情况下才能删除新闻)。这个时候 instead of 触发器就能很好的解决这一问题。
-->如下,创建与delete 触发器同样功能的instead of 触发器
1 CREATE TRIGGER De_in 2 ON caregory 3 INSTEAD OF DELETE 4 AS 5 DELETE news WHERE caid = ( SELECT id FROM deleted ); 6 DELETE caregory WHERE id = ( SELECT id FROM deleted );
▷ 创建好后,实现语句:
DELETE FROM caregory WHERE id = 2;
这一次就能删除掉该新闻类别及其类别下得所有新闻,无报错
☑ 到了这里,我想就可以理解到那句话的意思了
after触发器(insert、update、delete触发器)内的语句是在操作进行之后才触发执行的
instead of 触发器 并不会执行操作,那个操作仿佛就是一个触发的命令,有了这个命令,instead of 触发器触发了,就会执行触发器内的语句;若触发器内只有像 raiserror 、print之类的不含操作性的语句,那该操作并不会真正的执行,但在触发器内可以通过 inserted 或 deleted 表中获取到本该执行该操作而形成的数据。
Instead of 触发器 练习