Oracle——触发器

1.语法格式:

create or replace trigger name
 before|after
 insert or delete or update
 on table_name
 [for each row[when trigger_condition]]  //行级触发器
begin
 trigger_body
end name;

 

2.语句级触发器:在被触发后只执行一次,而不管这一操作会影响到数据库中多少行记录(默认情况下)

SQL> create or replace trigger emp_op
  2   before insert or update or delete
  3   on emp
  4  begin
  5   insert into emp_log values(user,sysdate);
  6  end emp_op;
  7  /

触发器已创建

SQL> update emp set sal=2000;

已更新17行。

SQL> select * from emp_log;

WHO                            WHEN
------------------------------ ------------
SCOTT                          18-10月-17

 

从以上代码可以看出,update语句更新了多行数据,而触发器仅向表emp_log中添加了一行记录

3.行级触发器:当一个DML语句操作影响到数据库中的多行数据时,行级触发器会针对每一行执行一次。

SQL> create or replace trigger emp_op
  2   before insert or update or delete
  3   on emp
  4   for each row
  5  begin
  6   insert into emp_log values(user,sysdate);
  7  end emp_op;
  8  /

触发器已创建

SQL> update emp set sal=2000;

已更新16行。

SQL> select * from emp_log;

WHO                            WHEN
------------------------------ --------------
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17

WHO                            WHEN
------------------------------ --------------
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17
SCOTT                          18-10月-17

已选择16行。

 

4.instead of触发器:也称替代触发器,通常情况下,instead of触发器是定义在视图上,而不是定义在表上。

SQL> create view emp_dep_view
  2  as select empno,ename,job,sal,dname
  3     from emp,dept
  4     where dept.deptno=emp.deptno;

视图已创建。

SQL> create or replace trigger insert_emp_deb_trigger
  2   instead of insert on emp_dep_view
  3   for each row
  4  declare
  5   v_deptno emp.deptno%type;
  6  begin
  7   insert into emp(empno,ename,job,sal) values(:new.empno,:new.ename,:new.job,:new.sal);
  8  end insert_emp_deb_trigger;
  9  /

触发器已创建

SQL> insert into emp_dep_view(empno,ename,job,sal,dname) values(8125,'董鹏','Mgr',1500,'SALES');

已创建 1 行。

Oracle中不能对有两个以上表建立的视图,进行增加数据操作,所以给出了替代触发器。增加数据是增加在表中。

posted @ 2017-10-18 16:34  Queenayao  阅读(188)  评论(0编辑  收藏  举报