良许Linux教程网 干货合集 详解ORACLE触发器(trigger)

详解ORACLE触发器(trigger)

触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

详解ORACLE触发器(trigger)

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,'中文系');

查询结果如下,自动生成id了: ORACLE触发器(trigger)的使用ORACLE触发器(trigger)的使用

b、 行级触发器(after触发器)

创建触发器:将对student表的操作都记录到stu_log表中(update of 用于指定一个或多个字段,指定字段被更新时才会触发触发器)

create or replace trigger modify_stu
after insert or delete or update of stu_name
on student
for each row
 begin
   if inserting then
     insert into stu_log values(1,'insert',sysdate,:new.stu_name);
   elsif deleting then
      insert into stu_log values(2,'delete',sysdate,:old.stu_name);
   elsif updating then
     insert into stu_log values(3,'update_old',sysdate,:old.stu_name);
     insert into stu_log values(4,'update_new',sysdate,:new.stu_name);
    end if;
end;
insert into student values(1,'NO2','李四',21,'数学系');  --插入一条数据
delete student where stu_name='张三';   --删除一条数据
update student set stu_age=19 where stu_name='李四';  --修改李四的年龄
update student set stu_name='王二' where stu_name='李四';  --修改李四的名称

查询stu_log表的结果如下,第3条update语句没有触发该触发器,因为触发器指定只有修改stu_name字段才会触发触发器:

ORACLE触发器(trigger)的使用ORACLE触发器(trigger)的使用
ORACLE触发器(trigger)的使用ORACLE触发器(trigger)的使用

c、语句级触发器(before触发器):用来控制对表的修改

create or replace trigger modify_stu
before insert or update or delete on student
begin
  if deleting then
    raise_application_error(-20001,'该表不允许删除数据');
  elsif updating then
    raise_application_error(-20002,'该表不允许修改数据');
   elsif inserting then
    raise_application_error(-20003,'该表不允许插入数据');
   end if;
end;

插入数据时报错如下,删除和修改数据同样也报错: ORACLE触发器(trigger)的使用ORACLE触发器(trigger)的使用

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

1ad5ad6eddc451da964a8888a6fd5266d0163210
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部