阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

ORACLE触发器(trigger)的使用

92次阅读
没有评论

共计 2809 个字符,预计需要花费 8 分钟才能阅读完成。

导读 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。触发器是一种在事件发生时隐式地自动执行的 PL/SQL 块,不能接受参数,不能被显式调用。
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)的使用

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)的使用

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)的使用

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2809字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中