前后触发器的理解,求大仙解释解释

bibozai 2012-03-09 11:12:56
自学到触发器这章节时,有点混乱,感觉创建后触发型触发器和创建前触发型触发器有点混淆了~~

创建后触发型的例子:
保证“商品表”中的单价列的值与“商品价格变动表”中单价列的值一致。

create trigger UnitPriceConsistent
on Table_PriceHistory for insert,update
as
declare @NewPrice money
select @NewPrice = SaleUnitPrice from inserted
update table_Goods set SaleUnitPrice = @NewPrice
where GoodsID in (select GoodsID from inserted)

问:是先执行as后面的语句,然后执行触发器进行插入和更新操作么。

创建前触发型的例子:
创建只允许删除会员积分低于200的顾客记录的触发器。

create trigger Deletecust
on table_Customer instead of delete
as
if not exists(select * from deleted where CardID in(
select CardID from Table_CardID where Score>=200))
delete from talbe_Customer where CardID in(select CardID from deleted)

问:创建前的不是不执行引发触发器执行的数据操作语句么,但感觉比如这个例子也是先执行as后面的
语句,条件满足了才执行触发器的DELETE操作啊(跟创建后的一样思想啊)~貌似用创建后的去做这题只要把 ‘instead of’改为‘for’就可以了...请大家帮我解释下。还有,用exists,Score<200代替文中的notexists,Score>=200,可以么



请大家就以上两个例子为我讲解先触发器前后型的区别~~谢谢~~
...全文
380 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
bibozai 2012-03-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 travylee 的回复:]

引用 5 楼 bibozai 的回复:

怎么人为的使用insert或update语句来处理呢?


你的意思是不用触发器??
[/Quote]

我的意思是在使用前触发器后,还要再执行insert或是update动作,该怎么操作
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bibozai 的回复:]

怎么人为的使用insert或update语句来处理呢?
[/Quote]

你的意思是不用触发器??
bibozai 2012-03-19
  • 打赏
  • 举报
回复
怎么人为的使用insert或update语句来处理呢?
ycagri 2012-03-14
  • 打赏
  • 举报
回复
如果你想在前置触发器内,实现特定的操作后,还要再执行insert或是update动作,必须人为的使用insert或update语句来处理一次
dawugui 2012-03-14
  • 打赏
  • 举报
回复
AFTER

指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定 FOR 关键字,则 AFTER 是默认设置。

不能在视图上定义 AFTER 触发器。


INSTEAD OF

指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。

INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。

ycagri 2012-03-14
  • 打赏
  • 举报
回复
默认的触发器是后置式的,你的触发器里面设置了for insert,update
也就是当insert,update操作成功完成后,才会执行触发器内的代码

而前置触发是这样的,在还没有正式操作之前,如果有insert,update,delete等这种操作,就会触发,然后执行触发器内的代码,结束后并不再执行insert,update,delete操作
  • 打赏
  • 举报
回复
for指定只有在触发器里面的语句都执行成功后被触发,仅使用for关键字时after是默认设置instead of表示不执行其所定义的,只执行触发器本身

34,576

社区成员

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

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