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 DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
RPM包方式安装Oracle21c的方法详解
Aug 23 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
C#连接ORACLE出现乱码问题的解决方法
Oct 05 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
详解SQL的窗口函数
Apr 21 Oracle
Oracle用户管理及赋权
Apr 24 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
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
PHP 高手之路(三)
2006/10/09 PHP
php创建多级目录代码
2008/06/05 PHP
php $_ENV为空的原因分析
2009/06/01 PHP
PHP 翻页 实例代码
2009/08/07 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
Django框架视图介绍与使用详解
2019/07/18 Python
如何给Python代码进行加密
2020/01/10 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
化学相关工作求职信
2013/10/02 职场文书
医学专业大学生求职的自我评价
2013/11/27 职场文书
培训自我鉴定
2014/01/31 职场文书
给面试官的感谢信
2014/02/01 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
会议简报格式范文
2015/07/20 职场文书
《花钟》教学反思
2016/02/17 职场文书
JavaScript设计模式之原型模式详情
2022/06/21 Javascript