当前位置: 代码迷 >> SQL >> PL/SQL(oracle)九_触发器
  详细解决方案

PL/SQL(oracle)九_触发器

热度:34   发布时间:2016-05-05 14:51:19.0
PL/SQL(oracle)9_触发器

一、触发器概念:(Trigger):
?? 是一种命名的PL/SQL块,是针对特定事件自动触发的。触发器不能接收参数。
?? 是基于表、视图、方案、数据库级别的。
二、为什么使用触发器。??
?? 通常可以实现一些审计的操作。
三、触发器类型:
??? 1、DML触发器:当在数据库上做DML操作时建立的触发器。??
??? 2、DDL触发器:当在数据库上做DDL操作时建立的触发器。??
??? 3、系统事件触发器:当实例系统、关闭、用户登陆、登出等操作时建立的触发器。
四、DML触发器:
? 1、DML语句级触发器:当在一个表上做某个DML操作时,触发器体本身的语句被自动执行1次。
???? 创建语法:
???? create Or Replace Trigger 触发器名 [before|After] [Insert|Update|Delete] On
???? 表名 PL/SQL块。
???? 说明:before|After,触发时间。before表示触发器体内的语句在DML操作之前执行,After表示之后执行。
???? [Insert|Update|Delete] :触发事件
???? PL/SQL块,如果有变量声明部分,需要以declare关键字开头。
???? 在触发器里不能包含事物结束的语句。
??????????????????????????
? 2、DML行级别触发器: 当在一个表上做某个DML操作时,触发器体本身的语句根据DML操作所影响的行数
???? 来决定执行多少次。
????
???? create Or Replace Trigger 触发器名 [before|After] [Insert|Update|Delete] On
???? 表名 For Each Row
????? PL/SQL块。

创建表:

Create table audit_emp_table(     user_name         varchar2(10),     timestamp           date,     old_empno          number(10),     new_empno        number(10),     old_ename          varchar2(10),     new_ename        varchar2(10),     old_job                varchar2(10),     new_job              varchar2(10),     old_sal                number(7,2),     new_sal              number(7,2));

?创建触发器:

?

CREATE OR REPLACE TRIGGER audit_emp_valuesAFTER DELETE OR INSERT OR UPDATE ON empFOR EACH ROWBEGIN    INSERT INTO audit_emp_table (user_name, timestamp,         old_empno,new_empno,old_ename, new_ename,          old_job,new_job, old_sal, new_sal)    VALUES (USER, SYSDATE, :OLD.empno,:NEW.empno,         :OLD.ename, :NEW.ename, :OLD.job,         :NEW.job, :OLD.sal, :NEW.sal );END;

试验:

Select * From audit_emp_tableUpdate emp Set sal = sal;Commit;
?

触发器例子1:

create or replace trigger ZA_ZFBA_JCXX_RK_WFXYRXX               before insert or update on  ZA_ZFBA_JCXX_RK_WFXYRXX                for each row declare begin       if inserting then          :new.gxsj :=sysdate;          :new.tbsj :=sysdate;       elsif updating then          :new.gxsj :=sysdate;       end if;end;

触发器例子2.

create or replace trigger update_sary  after update on za_zfba_jcxx_rk_sary  for each rowDECLAREBEGIN  IF(:new.GMSFHM is not null) THEN    update ZA_ZFBA_JCXX_RK_SARY_H t         set t.GMSFHM = gmsfhm, t.XM = xm, t.RYXH = :new.RYXH             where t.RYXH = :old.RYXH and t.AJBH = :old.AJBH and RYLB = '0';  END IF;END update_sary;

?

?

  相关解决方案