Instead of 触发器

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的主键相对,此时通过主外键将两个表连接起来。(建立好后,先在其中插入数据)

Instead of 触发器

-->   如下,创建了一个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;

会出现以下报错:

Instead of 触发器

✔出错原因: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 触发器 练习

 

上一篇:AlphaCode能写代码了,人工智能会取代人吗


下一篇:萌新web9