INSTEAD OF触发器使用的问题

zrzr1111 2009-09-02 12:53:50
创建触发器:
create trigger update_读者信息
on 读者信息
instead of update
as
if update(日期)
begin
print '不能修改日期'
rollback
end
go

测试该触发器:
update 读者信息 set 日期=getdate() where 姓名='ABC'
显示:不能修改日期,说明该触发器被触发了

可是对INSTEAD OF触发器我不太明白:
1、因为操作的过程中,无论更新哪一列,都会触发该触发器。所以,只要使用了INSTEAD OF触发器,该表所有的列都不能被更新了。这是正确的吗?对此有些疑惑,如果是正常了,用INSTEAD OF触发器有什么用呢?
2、INSTEAD OF并不表示在进行更新操作之前执行触发器,也不表示在进行更新操作之后执行触发器。按照字面意思,就是忘掉更新操作,转而执行后面的操作。这样理解对吗?

可不可以理解为INSTEAD OF触发器是用来限制对表/视图进行添加、修改、删除操作的??
...全文
245 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2009-09-03
  • 打赏
  • 举报
回复
if 是你的判断,不是触发器触发的条件。
zrzr1111 2009-09-03
  • 打赏
  • 举报
回复
我明白
可我这个例子仅在更新(日期)这一列时,触发器才被触发;
在更新其他列时,按道理来讲该触发器是不会被触发了
但是建了该触发器后,其他列也不能被修改了,这是为什么?
Tiger_Zhao 2009-09-03
  • 打赏
  • 举报
回复
已经说了是“替换”,就是原先的 Update 始终不会被正真执行,它只是起到了一个触发的作用。
zrzr1111 2009-09-03
  • 打赏
  • 举报
回复
谢谢Tiger_Zhao
能解答一下我提出的第一个问题吗?
为什么用了INSTEAD OF触发器后,表中每一个字段都不能被更新了呢?

在此先谢谢了
cqq_chen 2009-09-03
  • 打赏
  • 举报
回复
把if给去了,看看打印出来的结果你就明白了
Tiger_Zhao 2009-09-02
  • 打赏
  • 举报
回复
instead of update
就是用下面的语句代替原始的 UPDATE 语句,通常也应该是一句 UPDATE 语句。

从你的应用来看,只是检查,用 AFTER 更合适。
zrzr1111 2009-09-02
  • 打赏
  • 举报
回复
1、如果是执行UPDATE操作时被触发,那么INSTEAD OF触发器跟AFTER触发器有什么区别呢?
参考书上写的是:INSTEAD OF触发器是在触发后将执行一组新的SQL语句用以代替引起触发器执行的语句。不太理解,引起触发器执行的语句是UPDATE,那么触发后将执行的是什么呢?
另外,上面我写的例子是仅仅在修改“日期”列时被触发。而把AFTER改为INSTEAD OF,那一列都无法更新了
三楼の郎 2009-09-02
  • 打赏
  • 举报
回复
触发器概念理解错误,Instead of update表示在执行Update操作时触发,除了Instead of Update外还有Instead of Insert、Instead of Delete分别表示插入时触发和删除时触发。

触发器一般在进行多表操作时使用,比如Instead of Delete的意思就是在删除表中的记录的时候还需要先干什么,比如需要先删除受外键约束的子表里的相关记录等
Tiger_Zhao 2009-09-02
  • 打赏
  • 举报
回复
instead of update 是指记录被 Update 时执行触发器。
update 是整条记录的状态,与更新哪个字段无关。
所以下面才要用 if update(日期) 来进行判断。

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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