MySQL利用触发器保护特定字段防止数据篡改

周叙
周叙
发布时间:2026-10-14| 5人浏览过
原创

在使用MySQL数据库时,某些核心字段(如用户联系方式、账户余额)需要严格防止被篡改,但可能仍需允许修改其他业务字段。通过配置 BEFORE UPDATE 触发器,可以在数据提交更新前自动恢复受保护字段的原始值,从而在保证业务灵活性的同时确保关键数据的完整性。

使用触发器锁定字段

触发器是数据库中一种特殊的存储过程,它会在指定的数据库事件(如插入、更新、删除)发生时自动执行。要实现防止特定字段被修改,可以创建一个 BEFORE UPDATE 类型的触发器,在该触发器中将 new 对象中的目标字段重新赋值为 old 对象中的对应值。

第1步:创建锁定多个字段的触发器

目的: 保护包含多个敏感信息的表结构,使其在执行更新操作时无法改变特定列的数据。

入口: MySQL CLI 工具或管理界面(如 Navicat, phpMyAdmin)。

动作: 定义触发器逻辑,将需要保护的字段在更新前恢复原值。

  1. 首先清理可能存在的同名触发器,保证脚本可重复执行:
    DROP TRIGGER IF EXISTS `members`;
  2. 临时关闭 SQL_MODE 模式以简化语法解析:
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='';
  3. 使用 DELIMITER // 更改语句终止符,防止触发器内部的分号导致执行中断。
    DELIMITER //
  4. 创建名为 members 的 BEFORE UPDATE 触发器,锁定 name, cellphone, email, password 四个字段:
    CREATE TRIGGER `members` BEFORE UPDATE ON `members` FOR EACH ROW BEGIN
     set new.name  = old.name;
     set new.cellphone = old.cellphone;
     set new.email  = old.email;
      set new.password = old.password;
    END//
    
  5. 恢复默认分隔符并还原 SQL_MODE:
    DELIMITER ;
    SET SQL_MODE=@OLD_SQL_MODE;

至此,任何对 members 表的 UPDATE 操作,若试图修改上述四个字段,其值都会被强制回退到更新前的状态。

第2步:构建演示用账户表结构

目的: 创建一个包含基础账户信息与资金变动记录的测试表,为后续展示余额防篡改效果做准备。

入口: SQL执行窗口。

动作: 建立包含ID、用户名、现金余额等字段的表。

可以使用如下建表语句来构建一个简易的账户体系:

CREATE TABLE `account` (
 `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 `user` VARCHAR(50) NOT NULL DEFAULT '0',
 `cash` FLOAT NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。