oracle触发器~
触发器是一种特殊的存储过程,下面是触发器的详细说明:
ORACLE 触发器
ORACLE产生数据库触发器的语法为:
create [or replace] trigger 触发器名 触发时间 触发事件
on 表名
[for each row]
pl/sql 语句
其中:
触发器名:触发器对象的名称。由于触发器是数据库自动执行 的,因此该名称只是一个名称,没有实质的用途。
触发时间:指明触发器何时执行,该值可取:
before—-表示在数据库动作之前触发器执行;
after—-表示在数据库动作之后出发器执行。
触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
举例:下面的触发器在更新表auths之前触发,目的是不允许在周末修改表:
create trigger auth_secure
before insert or update or delete file://对整表更新前触发
on auths
begin
if(to_char(sysdate,’DY’)=’SUN’
RAISE_APPLICATION_ERROR(-20600,’不能在周末修改表auths’);
( RAISE_APPLICATION_ERROR是函数,括弧内的,第一参数范围在-20000~20999之间,第二个
参数是字符串,大小在2k,超过的话,系统自动截断)
end if;
end
Oracle触发器中的:new和:old的使用
:new— 触发器执行过程中触发表作操作的当前行的新纪录
:old— 触发器执行过程中触发表作操作的当前行的旧纪录
我们在使用 :new 或者 :old 的操作时需要注意以下问题:
1、 必须是行级触发器,因为 :new 或者 :old 是当前触发表操作的当前行的新数据或者旧数据,所以必须在行级触发器中才能使用。否则编译时会出现错误。
2、 当触发器被不同事件触发时,需要注意:
insert 触发操作 只有 :new
delete 触发操作 只有 :old
update 触发操作 都有。
如果违反上述操作中随意使用 :new 或者 :old 不会在编译时报错误但是会发现使用这两个关键字无效。
3、 使用触发器时如果要修改 :new 的值需要注意:
只有行级前触发器才能修改 :new 的值,而行级后触发器不可以。
因为行级前触发器是在本行 DML 操作之前,所以才能修改 :new 的值。从逻辑上说,也只有在这时修改才有意义。如果行级后触发器要试图修改 :new 的值会报变异错误。从逻辑上说后触发器的执行已经在本行 DML 操作,以后了,再修改 :new 的值已经不会对数据产生影响了。
4、 当在触发条件中使用 :new 或者 :old 的时候注意,只能直接写 old 或者 new ,不能带符号 ”:” 否则会出错。
create or replace trigger TRI_PrintTest
before delete or insert or update on TEST_EXAM --触发事件
for each row -- 每修改一行都需要调用此过程
begin
dbms_output.put_line(:new.IDNEW); --IDNEW字段更新后的值
dbms_output.put_line(:old.IDNEW); --IDNEW字段更新前的值
end;
原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/394/11720894.shtml
还没有评论,来说两句吧...