Oracle 触发器trigger使用案例


Posted in Oracle onFebruary 24, 2022

一、触发器定义

Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器。触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等。

二、触发器分类

触发器分为语句级触发器和行级触发器。

  • 语句级触发器:在某些语句执行前或执行后被触发。
  • 行级触发器:在定义了触发器的表中的行数据改变时就会被触发一次。

按照用户具体的操作事件的类型,可以分为5种触发器。

  • 数据操作(DML)触发器:此触发器是定义在Oracle表上的,当对表执行insert、update、delete操作时可以触发该触发器。如果按照对表中行级数据进行触发或语句级触发,又可以分为行级(row)触发器,语句级触发器,按照修改数据的前后触发触发器,又可以分为 after 触发器和before触发器之分。
  • 数据定义操作(DDL)触发器:当对数据库对象进行create、alter、drop操作时,触发触发器进行一些操作记录保存、或者限定操作。
  • 用户和系统事件触发器:该类型的触发器是作用在Oracle数据库系统上,当进行数据库事件时,触发触发器,一般用来记录登录的相关信息。
  • INSTEAD OF 触发器:此类型的触发器是作用在视图上,当用户对视图进行操作时,触发该触发器把相关的操作转换为对表进行操作。
  • 复合触发器:指的是对数据操作(DML)触发器当中的多种类型触发器进行复合,比如;一个触发器当中包含着after(或before)的行级触发器和after(或before)的语句级触发器,来完成一些更为复杂的操作。

三、触发器功能

Oracle触发器可以根据不同的数据库事件进行特定的调用触发器程序块,因此,它可以帮助开发者完成一些PL/SQL存储过程完成不了的问题,比如:

  • 允许or限制对表的修改
  • 自动生成派生列,比如自增字段(序列)
  • 强制数据一致性
  • 提供审计和日志记录
  • 防止无效的事务处理
  • 启用复杂的业务逻辑

但是不推荐在触发器当中写业务逻辑程序,因为这样对后期数据的维护将大大提高成本。

四、触发器语法

create [or replace] trigger 触发器名称 触发时间 触发事件
on 表名
[for each row]
begin
  PL/SQL语句块
end;

语法解释:
触发器名称:触发器对象的名称,没有实际用途。
触发时间:指定触发器何时执行,有before和after两个值。
before:在数据库动作之前执行触发器
after:在数据库动作之后执行触发器
触发事件:指明哪些数据库动作会触发该触发器
insert 数据库插入时会触发该触发器
update 数据库更新时会触发该触发器
delete 数据库删除时会触发该触发器
表名:数据库触发器所在的表
for each row:对触发器的执行范围做限定,对表的每一行触发器执行一次,如果没有这个选项就是对整个表执行一次

五、触发器使用案例

案例1:向job1表中插入一条数据后输出 欢迎加入 语句

--准备工作:拷贝jobs表为job11表,案例1和案例2均在job1表中执行。
CREATE TABLE JOB1 AS SELECT * FROM HR.JOBS;
--创建触发器
create or replace trigger trigger1 after insert
on job1
begin
  dbms_output.put_line('祝您早日涨薪!');
end;

触发器创建完成后,可向job1表插入一行数据验证效果。

--插入数据,触发触发器的执行
insert into job1 values('ruirui','Prisident',15000,30000);

效果如下:

Oracle 触发器trigger使用案例

案例2:数据校验,不允许星期二和星期四向emp1表中插入/更新数据。

create or replace trigger trigger2 before insert or update 
on job1
declare
  v_day varchar2(20);
begin
  ---判断今天是否是星期二或星期四
  select to_char(sysdate,'day') into v_day from dual;
  ---判断
  if v_day = '星期二' then
    dbms_output.put_line('今天是星期二,不能插入/更新数据!');
    raise_application_error(-20001,'今天是星期二,不能插入/更新数据!');
  if v_day = '星期四' then
    dbms_output.put_line('今天是星期四,不能插入/更新数据!');
    raise_application_error(-20001,'今天是星期四,不能插入/更新数据!');
  end if;
  end if;
end;

触发器创建完成后,可向job1表插入一行数据验证效果。

--插入数据,触发触发器的执行
insert into job1 values('rui1','Prisident',15000,30000);

效果如下:

Oracle 触发器trigger使用案例

Oracle 触发器trigger使用案例

案例3:创建触发器,记录表的删除数据

--创建job1_log表用于记录job1表的删除记录
create table job1_log  as select * from job1 where  1<>1;

--创建触发器
create or replace trigger trigger3 after delete 
on job1
for each row
begin
  insert into job1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary);
  dbms_output.put_line('记录已经成功删除并记录到日志');
end;

触发器创建完成后,可删除job1表一行数据验证效果。

--测试
delete from job1 where job_id='ruirui';

效果如下:

Oracle 触发器trigger使用案例

Oracle 触发器trigger使用案例

案例4:创建触发器,记录表的更新数据

--创建日志记录表
create table test_log(
  l_user varchar2(15),
  l_type varchar2(15),
  l_date varchar2(20)
);

--创建触发器
create or replace trigger trigger4 after delete or insert or update
on job1
declare
  v_type test_log.l_type%type;
begin
  if deleting then
    v_type := 'delete';
    dbms_output.put_line('记录已经成功删除并记录到日志');
  elsif inserting then
    v_type := 'insert';
    dbms_output.put_line('记录已经成功插入并记录到日志');
  elsif updating then
    v_type := 'update';
    dbms_output.put_line('记录已经成功更新并记录到日志');
  end if;
  insert into test_log values(user,v_type,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'));
end;

触发器创建完成后,可更新job1表中数据验证效果。

--测试
insert into job1 values('rui1','Prisident',15000,30000);

Oracle 触发器trigger使用案例

update job1 set min_salary=20000 where job_id='rui1';

Oracle 触发器trigger使用案例

delete from job1 where job_id='rui1';

Oracle 触发器trigger使用案例

查询test_log表中记录如下:

select * from test_log;

Oracle 触发器trigger使用案例

案例5:创建触发器,在删除某条数据之前先在记录表插入该条数据

--创建job1_log表用于记录job1表的删除记录
create table test1_log  as select * from job1 where  1<>1;

--创建触发器
create or replace trigger trigger5 before delete on job1
for each row --行级触发器
begin
  insert into test1_log values(:old.job_id,:old.job_title,:old.min_salary,:old.max_salary);
end;

触发器创建完成后,可更新job1表中数据验证效果。

--测试
delete from job1 where job_id='rui2';
commit;

查询test1_log表中记录如下:

select * from test01_log;

Oracle 触发器trigger使用案例

参考:Oracle数据库 触发器

到此这篇关于Oracle 触发器trigger概述的文章就介绍到这了,更多相关Oracle 触发器trigger内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
使用springboot暴露oracle数据接口的问题
May 07 Oracle
Oracle 区块链表创建过程详解
May 15 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
使用Navicat Premium工具将oracle数据库迁移到MySQL
May 27 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
Oracle中update和select 关联操作
Jan 18 Oracle
oracle重置序列从0开始递增1
Feb 28 Oracle
清空 Oracle 安装记录并重新安装
Apr 26 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
Oracle中update和select 关联操作
Jan 18 #Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 #Oracle
详解Oracle数据库中自带的所有表结构(sql代码)
Oracle表空间与权限的深入讲解
Nov 17 #Oracle
详解Oracle块修改跟踪功能
Nov 07 #Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 #Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 #Oracle
You might like
php数组去除空值函数分享
2015/02/02 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
PDO::inTransaction讲解
2019/01/28 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
jQuery 树形结构的选择器
2010/02/15 Javascript
Jquery网页出现的乱码问题的三种解决方法
2013/06/30 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
el-select 下拉框多选实现全选的实现
2019/08/02 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
python 已知平行四边形三个点,求第四个点的案例
2020/04/12 Python
python matlab库简单用法讲解
2020/12/31 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
网络安全类面试题
2015/08/01 面试题
门店业绩提升方案
2014/06/08 职场文书
企业标语口号
2014/06/10 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
Tomcat弱口令复现及利用
2022/05/06 Servers