【Oracle】Oracle系列之十四--触发器

文章目录

  • 往期回顾
  • 前言
  • 1. 基本概念
  • 2. 行级触发器
  • 3. 语句级触发器
  • 4. 系统级触发器
  • 5. 替代触发器

往期回顾

  • 【Oracle】Oracle系列之一–Oracle数据类型
  • 【Oracle】Oracle系列之二–Oracle数据字典
  • 【Oracle】Oracle系列之三–Oracle字符集
  • 【Oracle】Oracle系列之四–用户管理
  • 【Oracle】Oracle系列之五–Oracle表空间
  • 【Oracle】Oracle系列之六–Oracle表分区
  • 【Oracle】Oracle系列之七–表的创建与管理
  • 【Oracle】Oracle系列之八–SQL查询
  • 【Oracle】Oracle系列之九–Oracle常用函数
  • 【Oracle】Oracle系列之十–Oracle正则表达式
  • 【Oracle】Oracle系列之十一–PL/SQL
  • 【Oracle】Oracle系列之十二–视图、记录、同义词、序列
  • 【Oracle】Oracle系列之十三–游标

前言

1. 基本概念

触发器(trigger)是一种数据库对象,可以看作由事件来触发的特殊存储过程。当一个特定的事件发生时,会自动执行在数据库表上的某些操作,比如当对一个表进行操作(insert,delete, update)时就会激活它执行,使得数据库其他数据发生变化。

触发器常用于加强数据的完整性约束和业务规则等。

数据验证:确保插入、更新或删除操作符合业务规则和完整性约束条件。
数据转换:将插入、更新或删除操作中的数据转换为其他格式或单位。
数据记录:记录插入、更新或删除操作的详细信息,例如时间戳、用户ID等。
Oracle触发器的语法如下:

CREATE OR REPLACE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
[OF column_name]
[ON table_name]
[REFERENCING OLD AS old NEW AS new]
[FOR EACH ROW]
WHEN (condition)
DECLARE-- 声明局部变量和游标
BEGIN-- 执行触发器操作
END;

各关键字含义如下:

CREATE OR REPLACE TRIGGER:创建或替换一个触发器。
BEFORE | AFTER:指定触发器在插入、更新或删除操作之前(BEFORE)还是之后(AFTER)触发。
INSERT | UPDATE | DELETE:指定触发器在哪种操作上触发。
[OF column_name]:指定只对某一列进行操作。
[ON table_name]:指定触发器所属的表名。
[REFERENCING OLD AS old NEW AS new]:指定使用OLD和NEW伪记录引用旧值和新值。
[FOR EACH ROW]:指定为每一行执行触发器操作。
[WHEN (condition)]:指定触发器执行的条件。
DECLARE:声明局部变量和游标。
BEGIN:开始执行触发器操作。
END;:结束触发器代码块。
/:表示触发器定义结束。
Oracle 触发器主要有三种类型:

行级触发器 (Row-level triggers):在每次插入、更新或删除单个记录时触发。
语句级触发器 (Statement-level triggers):在 SQL 语句执行完毕后触发。
系统级触发器 (System-level triggers):在数据库整体运行时触发。

2. 行级触发器

行级触发器是一种基于行的触发器,它会在每次插入、更新或删除单个记录时触发。该触发器通常用于检查记录的值是否符合特定条件,并防止非法操作。

e.g.

-- delete时触发
Create Or Replace Trigger del_deptid
After Delete On dept
For Each Row
Begin
Delete From emp Where deptno=:Old.deptno;
End;

– insert时触发

Create Or Replace Trigger insert_dept 
After Insert On dept
For Each Row 
Begin
Insert Into emp(empno,ename,deptno) Values('8999''bob',:New.deptno);
End;

– update时触发

Create Or Replace Trigger update_dept 
After Update On dept
For Each Row 
Begin
Update emp Set deptno=:New.deptno Where deptno=:Old.deptno;
End;

注意:update的触发器种使用了 :Old 和 :New 句柄来引用被操作的记录的旧值和新值。:Old.deptno 引用了被更新记录的 id 值,而 :New.deptno 则引用了该记录被更新后的 id 值。通过这种方式可在触发器中获取并记录被修改的记录的详细信息。

– 利用行级触发器与SEQUENCE生成自增ID

create or replace trigger trg_emp
before insert on 
T_EMP
for each row 
begin 
select seq_EMP_ID.nextval into :new.id from dual; 
End;

3. 语句级触发器

语句级触发器是一种基于 SQL 语句的触发器,它会在 SQL 语句执行完毕后触发。通常用于记录日志,或在多个表之间同步数据。

Create Or Replace Trigger dnl_emp
After Insert Or Delete Or Update On emp
Begin
If Inserting Then
Insert Into mylog Values(User,Sysdate,'I');
Elsif Deleting Then
Insert Into mylog Values(User,Sysdate,'D');
Else
Insert Into mylog Values(User,Sysdate,'U');
End If;
End;

4. 系统级触发器

系统级触发器是一种可以在整个数据库级别上触发的触发器,常用于监控数据库对象,处理用户登录、注销、DDL语句以及其他重要事件,可以让管理员或者DBA更好地掌握和管理数据库。

e.g. 将所有SELECT查询操作进行记录到日志表(audit_log)中。

CREATE OR REPLACE TRIGGER audit_select
AFTER SELECT ON SCOTT.EMP
FOR EACH STATEMENT
BEGININSERT INTO audit_log(username, query_date, table_name, sql_text)VALUES(USER, SYSDATE, 'EMP', ora_sql_txt);
END;

5. 替代触发器

由于ORACLE里,不能直接对由两个以上的表建立的视图进行操作,因此替代触发器用于解决当组成视图的表是两个及两个以上时,无法更新的问题。

e.g.

Create Or Replace Trigger tr_v_e_d
Instead Of Insert On v_emp_dept
For Each Row
Begin
Insert Into dept(deptno,dname) Values(:New.deptno,:New.dname);
Insert Into emp(empno,ename,job,deptno) Values(:New.empno,:New.ename,:New.job,:New.deptno);
End;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 2204 搭建 nextcloud 个人网盘

Nextcloud是一套用于创建网络硬盘/云盘以存放文件的客户端-服务器软件,Nextcloud 完全开源并且免费。 一、搭建 ubuntu apache2 mysql php (lamp)环境 因为 nextcloud 服务是使用 php 语言和 mysql 数据库的web服务,因此需要…

FFmpeg 基础模块:容器相关的 API 操作

目录 AVFormat 模块 AVFormat 前处理部分 AVFormat 读写处理部分 小结 思考 FFmpeg 目录中包含了 FFmpeg 库代码目录、构建工程目录、自测子系统目录等,具体内容如下: 现在你知道 FFmpeg 的源代码目录中都包含了哪些内容,在之后使用 FFm…

kafka初体验基础认知部署

kafka 基础介绍 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统,可以快速地处理高吞吐量的数据流,并将数据实时地分…

modelize.ai - 小记

文章目录 关于 关于 官网:https://www.beta.modelize.ai Modelize.ai是一个AI agents和teams的创作平台,通过结合多元的agents以及工作流的衔接,让AI agents之间高效协同,达到一键式完成复杂工作的效果。 公司的愿景是让AI打工人…

acwing算法基础之基础算法--高精度加法算法

目录 1 知识点2 模板 1 知识点 大整数 大整数,它们的长度都为 1 0 6 10^6 106。大整数是指长度为 1 0 6 10^6 106的整数。 大整数 - 大整数 大整数 * 小整数 大整数 / 小整数 把大整数存储到向量中,需要考虑高位在前还是低位在前,低位在前…

「专题速递」RTC云网端联合优化、弱网对抗策略、QUIC协议的能力和实践

随着互联网日益增长的加速需求、复杂的网络环境和多样化的视频业务,音视频技术领域的专家们正在不断探索如何实现准确和极低延迟的网络传输能力。他们在应用层流控、传输层协议设计以及跨层优化等方面积极努力,以改善用户的网络体验。 在当今数字化时代&…

Mac版快速切换工具:One Switch中文 for mac

One Switch是一款功能强大、体验极简的Mac菜单栏工具,适合需要频繁切换系统设置和启动应用程序的用户使用。通过它,用户可以更方便地完成日常操作,提高工作效率。 快速访问工具:One Switch提供了一个便捷的菜单栏图标,…

Android:实现手机前后摄像头预览同开

效果展示 一.概述 本博文讲解如何实现手机前后两颗摄像头同时预览并显示 我之前博文《OpenGLES:GLSurfaceView实现Android Camera预览》对单颗摄像头预览做过详细讲解,而前后双摄实现原理其实也并不复杂,粗糙点说就是把单摄像头预览流程写两…

对象的相等和引用相等的区别

“ 有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top ” 首发博客地址[1] 面试题手册[2] 系列文章地址[3] 1. 什么是对象的相等和引用相等? 对象的相等:当两个对象的内容相同或满足某种特…

计算机网络(第8版)-第4章 网络层

4.1 网络层的几个重要概念 4.1.1 网络层提供的两种服务 如果主机(即端系统)进程之间需要进行可靠的通信,那么就由主机中的运输层负责(包括差错处理、流量控制等)。 4.1.2 网络层的两个层面 4.2 网际协议 IP 图4-4 网…

Maven 中引用其他项目jar包出现BOOT-INF问题

问题 在B项目中引入A项目的类,但是发现怎么也引入不进来 A项目打包之后,想在B项目中引用jar 在B项目中发现类文件无法引用 参考网上进行清缓存等一系列操作都没有解决。 最后发现引用的jar包中包含BOOT-INF, 然后去A项目中查找&#xff…

黑马点评-02使用Redis代替session,Redis + token机制实现

Redis代替session session共享问题 每个Tomcat中都有一份属于自己的session,所以多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时可能会导致数据丢失 用户第一次访问1号tomcat并把自己的信息存放session域中, 如果第二次访问到了2号tomcat就无法获取到在1号…

CSS小计

1:设置图片随窗缩放 使用百分比 width: 100%;height: 100%; 使用vmin: 将可视区域分为100vmin width: 100vmin;height: 100vmin; 2:设置字体颜色与背景色融合 mix-blend-mode: difference 3: 设置宽度自适应 width:fit-content 4:外边距合并 当两个相领的两个容…

Prompt-Tuning(一)

一、预训练语言模型的发展过程 第一阶段的模型主要是基于自监督学习的训练目标,其中常见的目标包括掩码语言模型(MLM)和下一句预测(NSP)。这些模型采用了Transformer架构,并遵循了Pre-training和Fine-tuni…

【MySql】4- 实践篇(二)

文章目录 1. SQL 语句为什么变“慢”了1.1 什么情况会引发数据库的 flush 过程呢?1.2 四种情况性能分析1.3 InnoDB 刷脏页的控制策略 2. 数据库表的空间回收2.1 innodb_file_per_table参数2.2 数据删除流程2.3 重建表2.4 Online 和 inplace 3. count(*) 语句怎样实现…

Uniapp 婚庆服务全套模板前端

包含 首页、社区、关于、我的、预约、订购、选购、话题、主题、收货地址、购物车、系统通知、会员卡、优惠券、积分、储值金、订单信息、积分、充值、礼品、首饰等 请观看 图片参观 开源,下载即可 链接:婚庆服务全套模板前端 - DCloud 插件市场 问题反…

机器学习必修课 - 使用管道 Pipeline

目标:学习使用管道(pipeline)来提高机器学习代码的效率。 1. 运行环境:Google Colab import pandas as pd from sklearn.model_selection import train_test_split!git clone https://github.com/JeffereyWu/Housing-prices-dat…

(一)正点原子STM32MP135移植——准备

一、简述 使用板卡:正点原子的ATK-DLMP135 V1.2 从i.mx6ull学习完过来,想继续学习一下移植uboot和内核的,但是原子官方没有MP135的移植教程,STM32MP157的移植教程用的又是老版本的代码,ST官方更新后的代码不兼容老版本…

Redis缓存设计与性能优化

文章目录 一、缓存穿透二、缓存失效(击穿)三、缓存雪崩四、热点缓存key重建优化五、缓存与数据库双写不一致六、开发规范与性能优化键值设计key名设计value设计 命令使用客户端使用系统内核参数优化vm.swapinessvm.overcommit_memory(默认0)合理设置文件句柄数慢查询日志&#…

包装类?为什么需要包装类?

包装类是一种用于将基本数据类型(如整数、浮点数、字符等)封装成对象的类。在Java和许多其他编程语言中,基本数据类型是不具备面向对象特性的,它们不是对象,不能进行方法调用或参与泛型化。为了弥补这一不足,Java引入了包装类,允许基本数据类型被当作对象来处理。 Java…