一:触发器简介
pl/sql--触发器 Triggers
Oracle 可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对各个行或者语句操作上进行触发.
1.替代触发器
由于在Oracle里,不能直接对由两个以上的表建立的视图进行操作,所以给出了替代触发器。
2.系统触发器
他可以在Oracle数据库系统中的时间中进行触发,如Oracle系统的启动与关闭等。
触发器组成:
- 触发事件:即在何种情况下触发Trigger;例如: insert,update,delete。
- 触发时间:即在Trigger是在触发时间发生之前(before)还是之后(after)触发,也就是触发事件和该trigger的操作顺序。
- 触发器本身:即该trigger被触发后的目的和意图,正是触发器本身要做的事情。例如:pl/sql块。
- 触发频率:说明触发器内定义的动作被执行的次数。即语句级(statement)触发器和行级(row)触发器
语句级(statement)触发器:是指当某触发事件发生时,该触发器只执行一次。
行级(row):是指当某触发时间发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
二:trigger 实验
1.helloworld trigger 后期用plsq工具创建更加简单
一个helloworld级别的触发器 create or replace trigger hello_trigger after update on employees --for each row begin dbms_output.put_line('hello...'); --dbms_output.put_line('old.salary:'|| :OLD.salary||',new.salary'||:NEW.salary); end;
然后执行:update employees set salary = salary + 1000 where employee_id=100
2.行级触发器: for each row 每更新 employees 表中的一条记录, 都会导致触发器执行
create or replace trigger employees_trigger after update on employees for each row begin dbms_output.put_line('修改了一条记录!'); end;
3.语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次
create or replace trigger employees_trigger after update on employees begin dbms_output.put_line('修改了一条记录!'); end;
4.使用 :new, :old 修饰符
:old 触发器触发之前的数据
:new 触发器触发之后的数据
create or replace trigger employees_trigger after update on employees for each row begin dbms_output.put_line('old salary: ' || :old.salary || ', new salary: ' || :new.salary); end;
5.综合例子:编写一个触发器, 在对 my_emp 记录进行删除的时候, 在 my_emp_bak 表中备份对应的记录
1). 准备工作: create table my_emp as select employee_id id, last_name name, salary sal from employees create table my_emp_bak as select employee_id id, last_name name, salary sal from employees where 1 = 2 2). create or replace trigger bak_emp_trigger before delete on my_emp for each row begin insert into my_emp_bak values(:old.id, :old.name, :old.sal); end;