知识卡片

触发器的三要素结构与NEW/OLD表机制

结构图卡

内容

触发器能实现比外键、CHECK约束更复杂的完整性检查,因为它不是声明式 的静态约束,而是一段在特定时机自动执行的代码,其结构由三部分组成: 触发器语句(事件)——定义激活触发器的操作类型(插入/删除/修改, 但要注意这三类事件不严格等同于INSERT/DELETE/UPDATE三条SQL语句, LOAD DATA、REPLACE等语句同样可能触发对应事件);触发器限制 (条件)——BEFORE或AFTER,决定触发器代码相对于原始操作本身的执行 顺序;触发器操作(动作)——真正被执行的代码。为了让触发器代码能 访问”变化前”和”变化后”的数据,系统会临时生成两张辅助表:OLD表存储 被删除或修改前的旧数据,NEW表存储新插入或修改后的数据——INSERT 事件只需要NEW表(只有新数据,没有旧数据可言),DELETE事件只需要 OLD表,UPDATE事件因为同时涉及旧值和新值,两张表都要生成。触发器 代码与引发它的原始操作被数据库当作一个不可分割的整体处理,即”要么 全做,要么全不做”——若触发器执行失败,原始的插入/删除/修改操作也会 被撤销,这个”绑定成一体”的特性正是第11章事务处理技术中原子性的一个 具体体现。当一个触发器的动作又触发了另一个触发器(触发器级联)时, 这个”整体成败”的范围也会随之扩大到整条级联链,因此设计有级联关系的 触发器时需要格外谨慎,避免链条中某一环失败导致整条链全部回滚。

结构图

flowchart TD
    A["触发器事件<br/>INSERT/UPDATE/DELETE<br/>(不严格等于同名SQL语句)"] --> B{触发器限制<br/>BEFORE或AFTER}
    B -->|BEFORE| C[原始操作前执行触发器动作]
    B -->|AFTER| D[原始操作后执行触发器动作]
    A -->|INSERT| E[生成NEW表: 存新插入数据]
    A -->|DELETE| F[生成OLD表: 存被删除前数据]
    A -->|UPDATE| G[同时生成NEW表和OLD表]
    C --> H["触发器动作与原始操作绑定为一体<br/>要么全做要么全不做"]
    D --> H

参考来源

- 位置:《数据库原理(微课版)》第8章《数据库编程》8.3.1-8.3.2节 "触发器原理""触发器的创建与使用"(源文件:_epub-src/index_split_005.html) - 结论依据:原文明确"触发器由3个部分组成:触发器语句(事件)、触发器 限制(条件)、触发器操作(动作)""INSERT事件发生时,只需要创建NEW 表,DELETE事件发生时只需要创建OLD表,而UPDATE事件发生时,需要 创建NEW和OLD两张表""触发器上的操作与触发事件是一体的,'要么全做, 要么全不做'……这种'要么全做,要么全不做'的特性称为事务的原子性", 因此可以推出触发器的三要素结构、NEW/OLD表的生成规则及其与事务 原子性的关系。 - 原始内容:INSERT事件发生时,只需要创建NEW表,DELETE事件发生时 只需要创建OLD表,而UPDATE事件发生时,需要创建NEW和OLD两张表 ……触发器上的操作与触发事件是一体的,"要么全做,要么全不做"。