ORACLE触发器(trigger)的使用
创作时间:
作者:
@小白创作中心
ORACLE触发器(trigger)的使用
引用
1
来源
1.
https://www.linuxprobe.com/oracle-use-trigger.html
触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。触发器是一种在事件发生时隐式地自动执行的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了:
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字段才会触发触发器:
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;
插入数据时报错如下,删除和修改数据同样也报错:
热门推荐
糖尿病患者十年控糖经验:从12降至5.9的三大秘诀
长时间用眼怎么办?七大护眼营养素帮你舒缓疲劳
世界卫生组织发布:《低钠盐替代品使用指南》,可降低卒中和心血管风险!
买房送5年高速费 杭州一区发放买房补贴 当地住建局:杭州工作的人来买房划算
什么是地震活动性以及为什么研究它很重要?
不定冠词有哪些?一篇搞懂英语语法中的小可爱
全球十大家族资本投资人:李嘉诚的红颜知己上榜
想要提升魔方速拧水平,你得先练对这件事
舌头训练游戏:趣味舌部运动游戏
气息弱、舌头灵活差、口唇力量不足是用什么方法训练?
积极参加职业技能等级认定:开启成功之门的金钥匙
医疗安全之医疗告知说明义务关键点
《克苏鲁的呼唤》全结局剧情分析 克苏鲁的呼唤结局有几种
家庭省能热水攻略:如何选择小厨宝与燃气热水器的黄金组合
持续更新|缅甸7.9级地震已致云南瑞丽2人受伤,多处老旧房屋受损
机械类最挣钱的专业:揭秘未来五年高薪赛道
孕妇能用六神花露水吗
自闭症个别化教育计划(IEP)包含哪些关键内容?
为什么屋里总有蚊子怎么办(怎么才能防止蚊子进到家里?)
脸上有了痘印痘坑,好难看!我该怎么办?
“过午不食”真的科学吗?
李泽楷:每个叱咤商界的超人,都有你不知道的凡人一面
深度学习入门:从人工智能到深度学习的关键概念与应用
如何计算按揭房的月供金额?这种计算方法有哪些影响因素和注意事项?
抑郁症与焦虑症的区别:症状、原因、诊断和治疗全方位解析
超声发现胆囊息肉如何管理?需要个体化制定随访方案
异步处理优化:多线程线程池与消息队列的选择与应用
演讲技巧:如何让你的演讲幽默有趣
金骏眉的前世今生:虽然年轻,但底蕴深厚
矫正牙齿医生的技术重要吗?肯定重要!直接影响到你的正畸结果和矫正风险!