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