trigger(触发器):

数据库触发器时存储于数据库的命令 PL/SQL 语句块,当触发器发生时它们会隐含执行。执行触发器的活动被称为触发触发器。
触发事件的中类:

  1. 处理数据库表的 DML 语句 (INSERT , UPDATE, DELETE)。
  2. DDL 语句 (如 CREATE ,ALTER)
  3. 系统事件 ,如数据库启动或关闭。
  4. 用户事件,如登录和注销。

创建触发器通用语法:
括号中的保留字是可选的。

create [or replace] trigger trigger_name
{before|after} trigger_enevt on table_name
[for each row]  --指定行触发器
[follows another_trigger]  --跟随另一个触发器
[enable/disable]          --启用/禁用       
[when condition]          --当满足条件
declare
  declaration statements   --声明参数
begin
  executable statements    --执行过程
  exception
    exception-handling statements  --处理异常语句
end;

说明:
trigger_name:触发器的名称
before | after :指示何时触发执行。(触发事件发生 之前 / 之后 )。
trigger_enevt :DML 语句 (INSERT , UPDATE, DELETE)等。
for each row:指定行触发器,只适用于所有的插入,修改或者删除的数据行。
注意:

follows , enable和disable :是在 oracle 11g 中引入的,在 11g 之前,需要用 alter trigger 命令来启用或者禁用触发器。enable和disable 指定触发器是在启用,还是禁用状态下被创建的。当触发器被启用时,触发事件发生就会执行该触发器。反之,当触发器被禁用时,触发事件发生时也不会执行该触发器。当不使用 enable和disable 字句来创建触发器时,在默认情况下是启用的。

禁用触发器执行:alter trigger trigger_name disable;
启用之前被禁用的触发器 :alter trigger trigger_name enable;
follows :可以指定触发器被触发的顺序,这个选项适用于在相同表上所定义的,且在相同时间点会执行的触发器。例如:如果在 person 表上定义两个触发器,并且在数据插入之前触发,如果不使用 follows 字句,oracle 就无法保证这些触发器始终按照相同的次序执行。

如果一个表删除了,则该表上定义的触发器也会被删除。

示例1: 利用触发器实现 id 编号 自增
1:创建序列:

-- Create sequence 
create sequence  seq_name
minvalue 1                             -最小值  
maxvalue 9999999999999999999999999999  --最大值
start with 1                              --从1开始自增                        
increment by 1                       --每次增长 1
nocache;                              --不使用缓存

2.创建触发器

create or replace trigger  tri_name
before insert on  Person
for each row
 
when (new.S_ID is null)
begin
    select seq_name.NEXTVAL into:new.S_ID from dual; -- into 后面的 字段一定要加 : 号
    end;

示例2:
创建触发器,记录表种删除的数据:

create  or replace  trigger tri_oldInfo
after delete on Person  --
for each row
begin
	insert into OLD_Person values  (:OLD.ID, :OLD.NAME, :OLD.AGE, :OLD.SEX);--:old代表旧值
end;

示例3:

create or replace trigger tri_log
after delete or update or insert on Person 
declare
v_type varchar2(30) :='未知';
begin
  if inserting then  --当执行 insert 时
    v_type :='insert';
  elsif updating then  --当执行 update 时
    v_type :='update';
  elsif deleting then  --当执行 delete 时
     v_type :='delete';  
  end if;   
   insert into LogInfo values (user,v_type,sysdate); --记录当前用户,操作类型,和时间
  end;

Oracle触发器 的三个谓语词 inserting \ updating \ deleting

伪记录: :NEW 和 :OLD

对于 insert 动作, :NEW可以获取将要插入数据的新行。但是 :OLD未定义,值为null。
对于 delete 动作,:OLD可以获取删除的旧数据行。但是 :NEW未定义,值为null。

要注意 在when 语句的条件中使用时,:NEW 和 :OLD不在使用冒号作为前缀。

示例4:在插入数据时完善表行的信息

create or replace trigger student_bi
 before insert on srudent
 for each row
   declare
    v_student_id student.student_ID%type; 
 begin
   select student_ID_seq.nextval into v_student_id from dual;
   :new.student_id :=v_student_id;
   :new.create_by  :=user;
   :new.create_date:=sysdate;
   end;

注意 ,在插入数据时,insert 语句必须包含触发器提供值的列名。