1、触发器说明
触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用
2、触发器类型
根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下3类
(1)DML触发器
对数据表进行DML语句操作(如insert、update、delete)时所触发的触发器,可以分为:
语句级触发器或行级触发器:行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,语句级触发器则只触发一次,与语句所影响到的行数无关
before触发器或after触发器:before触发器在触发事件发生之前执行触发器代码,after触发器则在触发事件发生之后执行
语法:
create [or replace] trigger trigger_name
{before | after} trigger_event
on table_name
[for each row]
[when trigger_condition]
trigger_body
语法解释:
trigger_name:触发器名称
before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发
trigger_event:触发事件,在DML触发器中主要为insert、update、delete等
table_name:表名,表示发生触发器作用的对象
for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
when trigger_condition:添加的触发条件
trigger_body:触发体,是标准的PL/SQL语句块
(2)替代触发器(instead of触发器)
对视图进行操作时定义的触发器,替代触发器只能定义在视图上.
语法:
create [or replace] trigger trigger_name --触发器名称
instead of trigger_event --触发事件
on view_name --视图名称
for each row --替代触发器必须指定为行级的触发器
[when trigger_condition] --触发条件
trigger_body --触发体,PL/SQL块
(3)系统事件触发器
对数据库实例或某个用户模式进行操作时定义的触发器,可以分为:
数据库系统触发器和用户触发器
3、案例
(1)DML触发器
DML触发器的案例都是基于student表和stu_log表来进行的,所以先创建student表和stu_log表
create table STUDENT ---创建student表
(
id NUMBER(19), --id
stu_no VARCHAR2(20), --学号
stu_name VARCHAR2(32), --姓名
stu_age NUMBER, --年龄
stu_major VARCHAR2(32) --专业
)
create table STU_LOG ---创建stu_log表,用于记录对student表的操作日志
(
log_id NUMBER, --日志id
log_action VARCHAR2(100), --操作名称
log_date DATE, --操作时间
log_message VARCHAR2(32) --
)
a、行级触发器(before触发器)
创建触发器:实现id的隐式自增
create or replace trigger modify_stu
before insert on student
for each row
declare
next_id number;
begin
select seq_test.nextval into next_id from dual;
:new.id :=next_id;
end;
插入一条数据,但是不插入id
insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','张三',20,'中文系');
生产例子,插入数据后将其中某个字段里面的内容一部分修改: