AFTER触发器与INSTEAD OF触发器的区别

lxdong8686 2009-02-19 11:51:00
请举一简单例子??
...全文
11546 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiqi16451645 2011-11-20
  • 打赏
  • 举报
回复
我觉得二楼的好,很直白。
yiyu55 2011-06-25
  • 打赏
  • 举报
回复
每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。
---------------------------------------------------------------------------
不是说每个表上,而是表上的每一个动作才是。
haoyuan711 2010-09-13
  • 打赏
  • 举报
回复
但是不知道instead of触发器既然是代替出发它的sql语句,那为什么inserted表和deleted表中还会有数据呢?
heling0223 2010-08-12
  • 打赏
  • 举报
回复
一楼解答的非常不错
lyvip 2010-06-12
  • 打赏
  • 举报
回复
学习了。。。。
jflsljz 2010-06-10
  • 打赏
  • 举报
回复
一楼说得太好了,终于明白了INSTED OF触发器的作用,谢谢了.
IE14571 2010-01-29
  • 打赏
  • 举报
回复
学习.....
zhhanddudu 2009-09-14
  • 打赏
  • 举报
回复
一楼的怎么看不到啊
lcg22itit 2009-08-06
  • 打赏
  • 举报
回复
INSTEAD OF
jifengshuai 2009-08-05
  • 打赏
  • 举报
回复
一楼的见解很好,受用了,谢谢了 哈哈
lsd123 2009-05-06
  • 打赏
  • 举报
回复
.
x361528143 2009-03-23
  • 打赏
  • 举报
回复
看到 有用 谢谢
百年树人 2009-02-20
  • 打赏
  • 举报
回复
如楼上所述,简而言之:

after触发器是在操作成功后,所采取的一些动作

而对于instead of触发器,对数据库的操作只是一个“导火线”而已,真正起作用的是触发器里面的动作;
往往这种触发器会有很多分支判断语句在里面,根据不用的条件做不同的动作
-晴天 2009-02-20
  • 打赏
  • 举报
回复
INSTEAD OF 触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEAD OF 触发器的动作要早于表的约束处理。
INSTEAD OF 触发器的操作有点类似于完整性约束。在对数据库的操纵时,有些情况下使用约束可以达到更好的效果,而如果采用触发器,则能定义比完整性约束更加复杂的约束。有关触发器与约束的比较,请参见联机丛书。
INSTEAD OF 触发器不仅可在表上定义,还可在带有一个或多个基表的视图上定义,但在作为级联引用完整性约束目标的表上限制应用。
AFTER 触发器定义了对表执行了 INSERT、UPDATE 或 DELETE 语句操作之后再执行的操作。比如对某个表中的数据进行了更新操作后,要求立即对相关的表进行指定的操作,这时就可以采用 AFTER 触发器。AFTER 触发器只能在表上指定,且动作晚于约束处理。
每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。
实例:
INSTEAD OF 触发器:
向表“计0261”插入数据时,检查学号是否存在于表“计026”中,如存在则进行插入操作,否则就不插入。
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 触发器,用来在插入记录时自动将统计值计算到订货统计表中。
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
ggsysy 2009-02-20
  • 打赏
  • 举报
回复
一楼的不错,学习了。

34,835

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧