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

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

在使用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 相关产品和应用

全部下载

专题列表