DML触发器的创建

目录

触发器的创建

DML触发器的创建

语句级 DML 触发器的创建

创建触发器,当对emp数据表进行添加记录、更新记录和删除记录的时候,判断是否是工作时间段,如果不是工作时间段,不允许执行

在数据表 dept 上创建触发器,当在该表上插入、删除或者更新的时候,记录操作日志

行级 DML 触发器的创建

为 emp 数据表创建一个触发器,当插入新员工的时候,显示新员工的工号和姓名;当更新员工工资的时候,显示每个员工更新前后的工资;当删除员工的时候,显示被删除员工的工号和姓名

创建一个数据表用于存放学生的基本信息,并创建一个序列,然后在表上创建一个触发器,在向表中插入数据的时候,触发所建立的触发器,为学生信息表自动添加主键序列值


Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645

触发器的创建

触发器的基本语法如下所示。

CREATE OR REPLACE TRIGGER<触发器名>
<触发时间 ><触发事件 > ON<表名 > 视图名 >|< 数据库名 >< 模式名>
[FOR EACH ROW]
[WHEN<条件表达式 >]
BEGIN
<PL/SQL语句 >
END

其中的参数说明如下 

(1)OR REPLACE 为可选参数,如果数据库中已经存在要创建的触发器,则先把原先的触发器删除,再重新建立触发器,或者说覆盖原先的触发器。
(2)触发时间包含 BEFORE 和 AFTER 两种,BEFORE指触发器是在触发事件发生之前执行
AFTER 指触发器在触发事件发生之后执行。
(3)触发事件,例如 INSERT,UPDATE,DELETE,CREATE,ALTER,DROP 等。
(4)<PL/SQL语句>是要执行的触发器操作。

DML触发器的创建

DML触发器在执行 DML语句时触发,可以分为INSERT、UPDATE 和 DELETE 操作,可以定义在操作之前或者之后触发,也可以指定为行级触发或者语句级触发。

语句级 DML 触发器的创建

它是默认的 DML触发器的创建,不使用 FOR EACH ROW子句。语句触发器所对应的 DML语句影响表中符合条件的所有行,但触发器只执行一次,并且不再使用 WHEN 条件语句。 

创建触发器,当对emp数据表进行添加记录、更新记录和删除记录的时候,判断是否是工作时间段,如果不是工作时间段,不允许执行

如下图所示,在第2行定义了触发事件和触发时间,在程序中使用条件语句判断当前时间,如果操作不是在规定时间内,则禁止操作。

下图是在非工作时间内向数据表中添加记录的时候,产生错误警告。

在数据表 dept 上创建触发器,当在该表上插入、删除或者更新的时候,记录操作日志

分析:

这个触发器要求当向表中插入、删除或者更新数据的时候,将操作记录下来,因此需要首先建立一个数据表用于记录日志。
创建表的语句如下所示。

CREATE TABLE dept_log(action_user VARCHAR2(20)
action name VARCHAR2(20),
action time DATE)

程序代码如图所示

如上图所示,在触发器中主要使用了3个条件谓词“INSERTING”“DELETING”和“UPDATING”分别表示触发条件是否是“插入”“删除”和“更新”。

如果条件成立,则返回TRUE,否则返回FALSE。根据不同情况,向记录日志的数据表中添加操作日志。
触发器创建完成后,可以向数据表 dept 中分别插入一条数据和删除一条数据,然后查询新建立的日志表,如下图所示。

我们可以发现,新建立的日志表记录了对数据表的每一笔操作。

行级 DML 触发器的创建

行级 DML 触发器必须加入 FOR EACH ROW 子句,和语句级 DML触发器不一样,行级 DML 触发器在每次执行 DML操作的时候,如果操作一条记录,触发器就执行一次,如果涉及多条记录,那么触发器就执行多次。

在行级触发器中可以使用 WHEN 条件语句控制触发器的执行。

在行级触发器中,会使用两个标识符,即:OLD 和 :NEW,用于访问和操作当前正在处理记录中的数据。

:OLD 表示在 DML操作完成前记录的值;:NEW 表示在 DML操作完成时记录的值。

这两个标识符在不同的 DML操作下有不同的含义。
如果触发操作时,在INSERT情况下,:OLD标识符没有定义,其中所有字段内容是NULL
而:NEW 标识符指被插入的记录。

如果触发操作时,在UPDATE情况下,:OLD标识符指更新前的记录,:NEW标识符指更新后的记录如果触发操作时,在 DELETE 情况下,:OLD 标识符指被删除前的记录,而:NEW 标识符没有定义
其中所有字段内容是 NULL。在触发器内使用这两个标识符的时候,标识符后面必须跟字段名称,

例如:OLD.FIELD 或者:NEWFIELD,即不能直接使用这两个标识符引用整个记录。

此外,在条件语句 WHEN 中如果用到这两个标识符,则标识符前的“:”可以省略。

为 emp 数据表创建一个触发器,当插入新员工的时候,显示新员工的工号和姓名;当更新员工工资的时候,显示每个员工更新前后的工资;当删除员工的时候,显示被删除员工的工号和姓名

分析

:这是一个行级触发器的创建,同时在触发器内还要判断是哪种 DML 操作。

详细代码如下图所示。

如上图所示,在程序中分别使用:NEW和 :OLD 标识符实现 DML操作前后数据的获取。

此外还使用了3个条件谓词“INSERTING”“DELETING”和“UPDATING”来判断不同的 DML操作,并根据不同的操作显示不同的信息。
创建触发器完成后,可以分别插入、删除和更新数据,如下图所示。

我们可以看出,当更新数据的时候,触发器执行了多次,因为更新的部门有4条符合条件的记录因此触发器执行了4次。
行级触发器经常用于为数据表自动生成主键序列值。来看下面这个范例。

创建一个数据表用于存放学生的基本信息,并创建一个序列,然后在表上创建一个触发器,在向表中插入数据的时候,触发所建立的触发器,为学生信息表自动添加主键序列值

首先创建学生信息表

CREATE TABLE student(
stu id INT PRIMARY KEY,
stu_name VARCHAR2(20),
stu_age lNT)

在创建一个序列

CREATE SEQUENCE stu_seg;

我们可以在触发器中使用该序列的 nextval属性获取有序的数值。
下面就创建触发器以实现为学生信息表自动添加学号关键字,程序代码如下图所示。

从上图可以看到,在触发器中将获取的序列值赋予:new.stu_id。
下面就看一下向数据表中插入记录的效果,分别使用两条插入语句。

INSERT INTO student VALUES (10,'zhangsan',25);
INSERT INTO student(stu_name,stu_age) VALUES ('lisi',24);

然后查询数据表的内容,如图所示

我们可以看出,第一条插入语句虽然给出了学生编号为“10”,但是数据表中对应的 ID 却不是这个结果,

它自动在触发器中获取序列的下一个值,第二个插入语句虽然没有给出学生编号的值,仍然自动添加了序列值。 

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

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

相关文章

Packet Tracer - 交换机安全配置解析

第一步先连线SW1连到SW2接口连接G0/2到G0/2 指令配置 SW-1 SW-1>enable SW-1#conf t Enter configuration commands, one per line. End with CNTL/Z. SW-1(config)#interface range G0/1-2 SW-1(config-if-range)#switchport mode SW-1(config-if-range)#switchport no…

tcp服务器端与多个客户端连接

如果希望Tcp服务器端可以与多个客户端连接&#xff0c;可以这样写&#xff1a; tcpServernew QTcpServer(this);connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection())); void MainWindow::onNewConnection() {QTcpSocket *tcpSocket;//TCP通讯的Sockettcp…

UE4_动画基础_FootIK

角色由于胶囊体的阻挡&#xff0c;双脚与地面平行&#xff0c;不会与斜坡、台阶等贴合&#xff0c;有一条腿会处于悬空状态&#xff0c;通过双骨骼IK节点使一只脚太高&#xff0c;让后胶囊体下降&#xff0c;修正双脚的角度。这就是逆向运动IK的方法。 一、新建第三人称模板游戏…

异步日志方案spdlog

异步日志方案spdlog spdlog 是一款高效的 C 日志库&#xff0c;它以其极高的性能和零成本的抽象而著称。spdlog 支持异步和同步日志记录&#xff0c;提供多种日志级别&#xff0c;并允许用户将日志输出到控制台、文件或自定义的接收器。 多线程使用和同步、异步日志没有关系是…

SpringBoot模块化时遇到Could not autowire. No beans of ‘xxxService‘ type found.错误

SpringBoot模块化时遇到Could not autowire. No beans of xxxService type found.错误 一、SpringBoot模块化时遇到Could not autowire. No beans of xxxService type found.错误二、解决办法一三、解决办法二 一、SpringBoot模块化时遇到Could not autowire. No beans of ‘xx…

六天以太坊去中心化租房平台,前端+合约源码

六天以太坊去中心化租房平台 概述项目结构合约部署运行项目功能介绍一、首页二、房东后台我的房屋我的订单上架新房屋 三、租户后台我的房屋我的订单 四、仲裁后台 下载地址 概述 六天区块链房屋租赁系统&#xff0c;采用去中心化的方式实现了房屋的租赁功能。房东可在平台上托…

三丰云服务器搭建网站

注册登录 在官网上注册好账号&#xff0c;然后选择登录。 用尽量少、迷糊的信息完成。确保个人信息安全 本部分涉及大家的隐私&#xff0c;笔者便不进行讲解。注册登录在右上角。 登录后的样式 开通服务器、主机 之后需要实名认证 完成样式 构建网站测试 配置虚拟主机 软件准备…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题&#xff0c;mark下。 中途遇到了很多问题&#xff0c;如果有相同的伙伴遇到了类似的&#xff0c;欢迎交流 官方的video播放器在app上不友好&#xff0c;有以下功能不支持。 loadedmetadata、controlstoggle不支持 不支持外挂字幕&#xf…

基于自注意力机制的长短期记忆神经网络(LSTM-SelfAttention)的回归预测

提示&#xff1a;MATLAB版本需要R2023a以上 基于自注意力机制的长短期记忆神经网络&#xff08;LSTM-SelfAttention&#xff09;是一种用于时序数据预测的模型。这个模型结合了两个不同的结构&#xff0c;即长短期记忆网络&#xff08;LSTM&#xff09;和自注意力机制&#xff…

Python自学之路--003:PyCharm新建工程之后安装的Python第三方库找不到问题

目录 1、概述 2、问题原因 3、解决办法 3.1、.py文件通过.bat不能调用 3.2、通过调用之前PyCharm工程的解释器找到库 3.3、重新安装一遍或将库Copy到新工程的.venv里面 1、概述 通过PyCharm新建一个工程的时候发现&#xff0c;之前安装的python库没了&#xff0c;如下图。…

李廉洋:4.27黄金原油下周一行情分析及走势策略。

金价将出现六周来的首次单周下跌&#xff0c;因投资者在金价上涨数月后获利了结。自2月中旬的低点以来&#xff0c;金价已经上涨了约17%&#xff0c;尽管对美联储放松政策的预期正在减弱&#xff0c;但金价仍屡创新高。周五公布的最新通胀数据强化了高利率将暂时维持的观点。“…

SQLite尽如此轻量

众所周知&#xff0c;SQLite是个轻量级数据库&#xff0c;适用于中小型服务应用等&#xff0c;在我真正使用的时候才发现&#xff0c;它虽然轻量&#xff0c;但不知道它却如此轻量。 下载 官网&#xff1a; SQLite Download Page 安装 1、将下载好的两个压缩包同时解压到一个…