当前位置: 首页 > java >正文

数据库触发器Trigger

在数据库管理系统中,触发器(Trigger)是一种特殊的存储过程,它在特定的事件发生时自动执行。触发器通常用于维护数据的完整性和一致性。通过事件触发而被执行,不能直接调用。

触发器的三要素

触发事件 before/after(insert、update、delete)

触发条件 when

触发动作 begin ... end

触发器的分类

根据触发时机和触发事件的不同,触发器可以分为以下几种类型:行级触发器与语句级触发器

行级触发器(Row-Level Trigger)在每一行数据受到影响时触发,例如在插入、更新或删除某一行数据时。

语句级触发器(Statement-Level Trigger)则在执行一条SQL语句时触发,无论该语句影响了多少行数据。

创建触发器

SQL> creagte trigger <触发器名>  [{before | after}]

{[inster | delete | update of 列名列表] }

on 表名

[ referencing <临时视图名>]

[ when <触发条件>]

<触发动作>

end [触发器名]

说明:

update: 指明是update触发器,每当update语句修改由of子句指定的列时,激发触发器。如果忽略of子句,每当update修改表的任意列值时,都将激发触发器。

referencing <临时视图名>:指定临时视图别名,在触发器运行过程中,系统会生成另个临时视图分别存放被更新值旧值和新值(rollback用)。对于行级触发器,默认临时视图名分别为old和new;对于语句级触发器,默认临时视图名分别为old-table和new-table。

例如:

行级触发器

触发器中还可以回退修改使用rollback

SQL> create trigger bad_trg after update of balance on users

referencing new row as nrow, old row as orow

for each row

when nrow.balance < 0

begin

rollback

# 插入不良记录

insert into bads select concat(borrows.userid, convert(varchar(100), getdate(), 10)), borrows.userid, brid, getdate()  from borrows  when nrow.userid = borrows.userid and etime is null

end

语句级触发器

SQL> create trigger RAISE_LIMIT after update of SAL on EMP

referencing new table as n_tb,  old table as o_tb

for each statement

when (800 > (select avg(SAL) from EMP)

begin

delete from EMP where ENO in ( select ENO from n_tb ) insert into EMP ( select * from o_tb )

end

修改触发器

SQL> alter  trigger bad_trg  after  update on users
AS
BEGIN
    -- 新的触发器逻辑
    PRINT 'Employee record has been updated.'
    -- 可以添加更多的逻辑,例如记录日志或执行其他操作
END

删除触发器

SQL> drop  trigger bad_trg
 

http://www.xdnf.cn/news/7176.html

相关文章:

  • Hugo 安装保姆级教程(搭建个人blog)
  • 2025.05.17得物机考笔试真题第三题
  • UESplineThicken节点
  • Android开发-翻页类视图
  • 中文分词与数据可视化03
  • 【2025版】OpenFeign快速入门
  • Cursor:简单三步提高生成效率
  • HJ5 进制转换【牛客网】
  • 工作流介绍
  • TIMER免疫浸润分析
  • 谷歌地球引擎GEE将多个遥感影像作为多个波段合并成一张图像并下载的方法
  • C++ deque大小操作、deque数据插入、deque数据删除
  • Linux学习笔记|GCC编译指令基础|静动态库|makefile
  • KAG:通过知识增强生成提升专业领域的大型语言模型(五)
  • Python异常处理与OOP深度解析及实战案例
  • 软件调试纵横谈-18-页堆
  • Java程序员学AI(一)
  • [强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程-下
  • Python 从列表中删除值的多种实用方法详解
  • C++学习:六个月从基础到就业——C++17:std::optional/variant/any
  • 玄机-第一章 应急响应-Linux日志分析
  • LoRA微调的参数学习
  • 1-机器学习的基本概念
  • 浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)
  • 电子电路:什么是电子电路中的噪声?为什么会产生噪声?噪声全部是负面影响吗?
  • React-Query使用react-testing-library进行测试
  • c/c++的opencv直方图初识
  • HarmonyOS:应用文件访问(ArkTS)
  • C++算法(23):memset原理、性能对比与替代策略
  • 数据共享的艺术