pl/sql--触发器 Triggers

talkingDB 2019-12-02

一:触发器简介

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;

相关推荐