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

mysql 触发器进入历史

一、触发器

MySQL 触发器(Triggers)是一种数据库对象,它与表关联,能在特定的事件(如插入、更新或删除)发生时自动执行一些指定的操作。使用触发器可以帮助我们自动维护数据库的完整性、一致性,或者同步更新数据库中的相关数据。当涉及到将数据变更记录到历史表中时,触发器特别有用。

在 INSERT、UPDATE、DELETE 操作之前或之后触发并执行触发器中定义的 SQL 语句。
在这里插入图片描述

创建触发器以记录历史
假设我们有一个名为 employees 的表,我们想要记录每次对这个表进行的修改(更新或删除操作)到一个名为 employees_history 的历史表中。以下是如何设置这样的触发器的步骤:

‌创建历史表‌:

首先,你需要有一个地方来存储历史记录。这个表通常包含原表的所有相关字段,以及额外的字段来存储变更的时间戳和操作类型(比如是更新还是删除)。

CREATE TABLE employees_history (
    id INT AUTO_INCREMENT PRIMARY KEY,
    employee_id INT,
    name VARCHAR(100),
    position VARCHAR(100),
    salary DECIMAL(10, 2),
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    action VARCHAR(10)
);

二、创建触发器‌

然后,你需要为 employees 表创建一个触发器,用于在更新或删除记录时将旧的数据复制到 employees_history 表中。

1‌、更新操作的触发器‌:

CREATE TRIGGER before_employee_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employees_history (employee_id, name, position, salary, action)
    VALUES (OLD.id, OLD.name, OLD.position, OLD.salary, 'UPDATE');
END;

2‌、删除操作的触发器‌:

CREATE TRIGGER before_employee_delete
BEFORE DELETE ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employees_history (employee_id, name, position, salary, action)
    VALUES (OLD.id, OLD.name, OLD.position, OLD.salary, 'DELETE');
END;

3‌、创建AFTER INSERT触发器‌:

CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    INSERT INTO employees_audit (employee_id, name, position, salary, action)
    VALUES (NEW.id, NEW.name, NEW.position, NEW.salary, 'INSERT');
END;

在这个例子中,after_employee_insert触发器会在每次向employees表插入新记录后被触发。触发器会使用NEW关键字来访问新插入的记录的值,并将这些值插入到employees_audit表中,同时记录下操作类型为’INSERT’。

4、查看触发器的状态、语法等信息

SHOW TRIGGERS;

5、删除触发器,如果没有指定 schema_name,默认为当前数据库

DROP TRIGGER [schema_name.]trigger_name;

三、注意事项

‌性能‌:触发器的执行会增加数据库操作的开销,尤其是在高频率更新或删除的场景下。确保评估触发器对性能的影响。

‌事务处理‌:如果原始操作在事务中回滚,触发器中执行的操作也会回滚。

‌权限‌:创建触发器需要特定的权限,确保你的数据库用户账户有足够的权限来创建触发器。

‌触发时机‌:你可以选择触发器在操作之前(BEFORE)还是之后(AFTER)触发。对于记录历史而言,BEFORE 触发器通常更合适,因为它允许你访问旧值(OLD)。

通过以上步骤,你可以设置一个简单但有效的系统来自动记录数据库表的历史变更。这对于审计、数据恢复或简单的变更跟踪都非常有用。


http://www.kler.cn/a/413621.html

相关文章:

  • QSqlTableModel的使用
  • Java代码操作Zookeeper(使用 Apache Curator 库)
  • 精通高并发,需要掌握哪些知识
  • 从零开始:NetBox 4.1 Docker 部署和升级
  • 华为云云连接+squid进行正向代理上网冲浪
  • SpringBoot源码-spring boot启动入口ruan方法主线分析(一)
  • Android 使用Charles抓包显示Unknown
  • MySQL 数据库索引优化实践指南
  • 利用阿里云镜像仓库和 Github Action 同步镜像
  • 【Qt】重写QComboBox下拉展示多列数据
  • CSGO游戏搬砖党如何应对上海Major
  • 【81-90期】Java核心面试问题深度解析:性能优化与高并发设计
  • 卷积神经网络(CNN)中的批量归一化层(Batch Normalization Layer)
  • ORACLE数据库直接取出数据库字段JSON串中的 VALUE内容
  • ensp配置静态路由与RIP协议
  • Harbor安装、HTTPS配置、修改端口后不可访问?
  • 【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎
  • Js-对象-04-JSON
  • 林业产品推荐系统:Spring Boot开发手册
  • 九、Ubuntu Linux操作系统
  • 【自动化Selenium】Python 网页自动化测试脚本(下)
  • 矩阵重新排列——sort函数
  • mysql sql语句 between and 是否边界值
  • 短效IP池如何帮助我们进行原创保护?
  • 【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)
  • Oracle SYSTEM 和 SYSAUX 表空间的清理和回收