关于触发器的一个问题

时间:2021-06-10 11:01:35
有以下一段代码

.
create trigger test_trigger_insert
before insert or update on EMP 
for each row
begin
:new.JOB:=upper(:new.JOB);
end;

第一个问题
关键字before指定在触发语句实际执行之前执行该触发器,对吧?

第二个问题
:new.JOB:=upper(:new.JOB);因为用的是NEW,表示新数据,指的是把临时表(inserted)中JOB列转换为大写对吧?

第三个问题(最不解的一个问题)
当真实表(EMP)执行INSERT或者UPDATE操作的时候,由于指定的是BEFORE关键字,所以真实表(EMP)的INSERT或者UPDATE操作并不马上执行,而是先执行这个触发器,在这个触发器中,把临时表(虚拟表)中受影响的JOB列转换为大写。
后面的属于我的猜测:触发器执行完毕,更新了inserted表中的数据,然后再把inserted表的相关行更新到真实表中,是这样的吗?如果不是:我就没搞懂了,该触发器没有对真实表(EMP)的具体操作,那么是如何把临时表(inserted)和真实表(EMP)相关联起来的?难道说是真实表(EMP)的INSERT或者UPDATE操作取的是临时表(inserted)里面的数据?




20 个解决方案

#1


lz发错版了???、

#2


Oracle的,转版吧

#3


我主要是想了解这个触发器实现的细节

#4


引用 2 楼 htl258 的回复:
Oracle的,转版吧



没啊,我就是发在SQL版的啊

#5


可能已近实际执行了 但是有事务 可以回滚

#6


LS的你在说什么呀,能不能针对我提出的问题来解答?

#7


看不懂,帮顶

#9


菜鸟学习了

#10


能不能针对我提出的问题来解答?


这样,我换个提问方法


触发条件是INSERT
当触发器指定BEFORE关键字后,会先执行触发器。.

如果我只在触发器里更改了新插入行某个字段的值,当触发器执行完毕的时候,就会跳回引发触发器执行的语句(也就是INSERT操作),那么原触发语句(INSERT)所插入的新行是取的新值吗,如果是,是哪里取到的? 

#11


引用 10 楼 csshow 的回复:
能不能针对我提出的问题来解答?


这样,我换个提问方法


触发条件是INSERT
当触发器指定BEFORE关键字后,会先执行触发器。.

如果我只在触发器里更改了新插入行某个字段的值,当触发器执行完毕的时候,就会跳回引发触发器执行的语句(也就是INSERT操作),那么原触发语句(INSERT)所插入的新行是取的新值吗,如果是,是哪里取到的?

建议到Oracle版块提问,听的人比较专业,像你说的BEFORE关键字,MS-SQL是INSTEAD OF的,语法也不一样,所以不好回答。

#12


100分不会连一个我想要的答案都得不到吧

#13


引用 11 楼 htl258 的回复:
引用 10 楼 csshow 的回复:
能不能针对我提出的问题来解答?


这样,我换个提问方法


触发条件是INSERT
当触发器指定BEFORE关键字后,会先执行触发器。.

如果我只在触发器里更改了新插入行某个字段的值,当触发器执行完毕的时候,就会跳回引发触发器执行的语句(也就是INSERT操作),那么原触发语句(INSERT)所插入的新行是取的新值吗,如果是,是哪里取……



MS-SQL没有BEFORE?

这个是我要书上找到的例子,SQL2000的书

#14


SQL2000 有BEFORE的吧,是新增加的

#15


学习了..........

#16


顶一个。

#17


该回复于2010-09-06 13:58:55被版主删除

#18


关于触发器的一个问题

#19


路过。

#20


结了!!!!

#1


lz发错版了???、

#2


Oracle的,转版吧

#3


我主要是想了解这个触发器实现的细节

#4


引用 2 楼 htl258 的回复:
Oracle的,转版吧



没啊,我就是发在SQL版的啊

#5


可能已近实际执行了 但是有事务 可以回滚

#6


LS的你在说什么呀,能不能针对我提出的问题来解答?

#7


看不懂,帮顶

#8


#9


菜鸟学习了

#10


能不能针对我提出的问题来解答?


这样,我换个提问方法


触发条件是INSERT
当触发器指定BEFORE关键字后,会先执行触发器。.

如果我只在触发器里更改了新插入行某个字段的值,当触发器执行完毕的时候,就会跳回引发触发器执行的语句(也就是INSERT操作),那么原触发语句(INSERT)所插入的新行是取的新值吗,如果是,是哪里取到的? 

#11


引用 10 楼 csshow 的回复:
能不能针对我提出的问题来解答?


这样,我换个提问方法


触发条件是INSERT
当触发器指定BEFORE关键字后,会先执行触发器。.

如果我只在触发器里更改了新插入行某个字段的值,当触发器执行完毕的时候,就会跳回引发触发器执行的语句(也就是INSERT操作),那么原触发语句(INSERT)所插入的新行是取的新值吗,如果是,是哪里取到的?

建议到Oracle版块提问,听的人比较专业,像你说的BEFORE关键字,MS-SQL是INSTEAD OF的,语法也不一样,所以不好回答。

#12


100分不会连一个我想要的答案都得不到吧

#13


引用 11 楼 htl258 的回复:
引用 10 楼 csshow 的回复:
能不能针对我提出的问题来解答?


这样,我换个提问方法


触发条件是INSERT
当触发器指定BEFORE关键字后,会先执行触发器。.

如果我只在触发器里更改了新插入行某个字段的值,当触发器执行完毕的时候,就会跳回引发触发器执行的语句(也就是INSERT操作),那么原触发语句(INSERT)所插入的新行是取的新值吗,如果是,是哪里取……



MS-SQL没有BEFORE?

这个是我要书上找到的例子,SQL2000的书

#14


SQL2000 有BEFORE的吧,是新增加的

#15


学习了..........

#16


顶一个。

#17


该回复于2010-09-06 13:58:55被版主删除

#18


关于触发器的一个问题

#19


路过。

#20


结了!!!!

#21