after[for]触发器与instead of 替代触发器的区别

最近在复习sqlserver数据库的触发器时,了解到触发器有两种类型,最开始学的时候只是大致知道其作用,复习的过程中更应该讲究理解,于是找到了一份大神的解释,原文链接:https://bbs.csdn.net/topics/300074591

以下是正文内容:

INSTEAD OF 触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEAD OF 触发器的动作要早于表的约束处理。
INSTEAD OF 触发器的操作有点类似于完整性约束。在对数据库的操纵时,有些情况下使用约束可以达到更好的效果,而如果采用触发器,则能定义比完整性约束更加复杂的约束。有关触发器与约束的比较,请参见联机丛书。
INSTEAD OF 触发器不仅可在表上定义,还可在带有一个或多个基表的视图上定义,但在作为级联引用完整性约束目标的表上限制应用。
AFTER 触发器定义了对表执行了 INSERT、UPDATE 或 DELETE 语句操作之后再执行的操作。比如对某个表中的数据进行了更新操作后,要求立即对相关的表进行指定的操作,这时就可以采用 AFTER 触发器。AFTER 触发器只能在表上指定,且动作晚于约束处理。
每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。
实例:
INSTEAD OF 触发器:
向表“计0261”插入数据时,检查学号是否存在于表“计026”中,如存在则进行插入操作,否则就不插入。

1

2

3

4

5

6

7

8

9

10

11

12

13

CREATE TRIGGER [checkid] ON [dbo].[计0261] 

INSTEAD OF insert

AS

IF NOT EXISTS(SELECT FROM 计026 WHERE 学号=(SELECT 学号 FROM INSERTED))

  BEGIN

    ROLLBACK TRANSACTION

    PRINT '要处理记录的学号不存在!'

  END

ELSE

  BEGIN

    INSERT INTO 计0261 select from inserted

    PRINT '已经成功处理记录!'

  END


AFTER 触发器:
对订货表设置 AFTER(FOR) 类型的 INSERT 触发器,用来在插入记录时自动将统计值计算到订货统计表中。

1

2

3

4

5

6

7

8

9

10

11

12

13

CREATE TRIGGER [orderinsert] ON [dbo].[订货表]

AFTER INSERT

AS

DECLARE @bookid int, @ordernum int, @num int

SELECT @bookid = 书籍编号, @ordernum = 数量 FROM INSERTED

SELECT @num = count(书籍编号) FROM 订货统计表 WHERE 书籍编号=@bookid

IF @num = 0

  --未找到该书,插入记录

  INSERT INTO 订货统计表 VALUES(@bookid, @ordernum)

ELSE

  --找到该书,更新记录

  UPDATE 订货统计表

SET 总订货量 = 总订货量 + @ordernum WHERE 书籍编号 = @bookid

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值