Orcale触发器的after/before

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Orcale触发器的after/before相关的知识,希望对你有一定的参考价值。

create or replace trigger trig2 after update on dept for each row
begin
update emp set deptno = :NEW.deptno where deptno = :OLD.deptno;
end;

update dept set deptno = 99 where dept = 10;
在看马老师的视频时遇到这样的疑问。楼上的update语句在存在触发器的情况下是可以执行的。但是我对after关键字在update语句后面执行产生了疑问,在没有触发器的情况下,update语句是无法执行的,那么在触发器触发之前不就报错了么?难道因为触发器的存在,该语句实际上是没有执行。我可以理解这里使用before,但是after暂时理解不了。分不多,意思一下,谢了。

不是没有触发器
而是如果对表做了update语句后 触发器会被触发,然后执行下面的语句

--------------------------------------------------------------------------------
创建触发器:
CREATE [OR REPLACE] TRIGGER <触发器名>
BEFORE|AFTER
INSERT|DELETE|UPDATE [OF <列名>] ON <表名>
[FOR EACH ROW]
WHEN (<条件>)
<pl/sql块>

关键字"BEFORE"在操作完成前触发;"AFTER"则是在操作完成后触发;
关键字"FOR EACH ROW"指定触发器每行触发一次.
关键字"OF <列名>" 不写表示对整个表的所有列.
WHEN (<条件>)表达式的值必须为"TRUE".

特殊变量:
:new --为一个引用最新的列值;
:old --为一个引用以前的列值;
这些变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

使用RAISE_APPLICATION_ERROR
语法:RAISE_APPLICATION_ERROR(错误号(-20000到-20999),消息[,true|false]);
抛出用户自定义错误.
如果参数为'TRUE',则错误放在先前的堆栈上.

INSTEAD OF 触发器 INSTEAD OF 触发器主要针对视图(VIEW)将触发的dml语句替换成为触发器中的执行语句,而不执行dml语句.
禁用某个触发器
ALTER TRIGGER <触发器名> DISABLE
重新启用触发器
ALTER TRIGGER <触发器名> ENABLE
禁用所有触发器
ALTER TRIGGER <触发器名> DISABLE ALL TRIGGERS
启用所有触发器
ALTER TRIGGER <触发器名> ENABLE ALL TRIGGERS
删除触发器
DROP TRIGGER <触发器名>追问

可能你忘记了orcale的学习表。deptno是存在约束的。如果说先执行update语句然后触发trigger,那么是不是约束在update的时候失效了?或者说update语句根本没有执行,实际操作是由trigger执行的。

追答

约束是不能修改吗?只是不能重复,还是能修改的啊

追问

约束是可以修改的,但是也有个先后啊。触发器用的是after,我就在想是不是应该先执行了update之后才执行触发器的。如果说先执行update那么就会被约束。这个约束是外键约束,正常情况下是不能更新。不知道是不是应该这样理解:因为存在触发器里的那句代码,在执行update语句的时候就无视约束了。然后触发器触发,更新所有关联的外键。

追答

我想问下 你所说的有约束就不能update 是什么情况

追问

一个dept表,字段deptno,deptname,其中deptno关联着另外一张emp表中的deptno字段。这不就是约束么? 那么现在我能update 表dept中的deptno么?

追答

我的数据库 可以 不知道你说的马老师的有没有外键

参考技术A 你看清楚啊,触发器是建在dept表上的,也就是说这个触发器的效果是,每当dept中的数据被修改以后 就会自动修改 emp中的deptno列

触发器before和after有啥区别?

1.不要复制粘贴,可以举个例子。
说详细点。

2.还有sql server 2005 怎么不光before没有,连after也没有?

3。在sql server里建一个工资的表 如工资表,工资不足3000,自动改为3000.(用before触发器的功能实现,有人说用instead of来写,怎么写?)

呵呵,看来你不熟悉触发器呀
无论是insert触发器还是update触发器,他都有一个before或者after关键字
before 就是在insert或update之前执行触发器
after 就是在insert或update之后执行触发器
例:
CREATE OR REPLACE TRIGGER TR_1 before UPDATE ON TABLE
这和在触发器中用inserted 和updated没关系
参考技术A before是在数据库操作之前做触发,
after是在数据库操作之后做触发

以上是关于Orcale触发器的after/before的主要内容,如果未能解决你的问题,请参考以下文章

触发器before和after区别

触发器before和after区别

触发器before和after区别

触发器before和after区别

触发器 new和old before和after

触发器after和before