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 相关文章推荐
ORACLE数据库对long类型字段进行模糊匹配的解决思路
Apr 07 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
Oracle11g R2 安装教程完整版
Jun 04 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
Oracle数据库中通用的函数实例详解
Mar 25 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
instantclient客户端 连接oracle数据库
Apr 26 Oracle
Oracle中DBLink的详细介绍
Apr 29 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
JS中不为人知的五种声明Number的方式简要概述
2013/02/22 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
python实现的防DDoS脚本
2011/02/08 Python
深入理解python多进程编程
2016/06/12 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
多重CSS背景动画实现方法示例
2014/04/04 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
html5教程画矩形代码分享
2013/12/04 HTML / CSS
大学毕业寄语大全
2014/04/10 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
旷课检讨书范文
2015/01/27 职场文书
夫妻吵架保证书
2015/05/08 职场文书
十七岁的单车观后感
2015/06/12 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL