MySQL利用触发器保护特定字段防止数据篡改
在使用MySQL数据库时,某些核心字段(如用户联系方式、账户余额)需要严格防止被篡改,但可能仍需允许修改其他业务字段。通过配置 BEFORE UPDATE 触发器,可以在数据提交更新前自动恢复受保护字段的原始值,从而在保证业务灵活性的同时确保关键数据的完整性。
使用触发器锁定字段
触发器是数据库中一种特殊的存储过程,它会在指定的数据库事件(如插入、更新、删除)发生时自动执行。要实现防止特定字段被修改,可以创建一个 BEFORE UPDATE 类型的触发器,在该触发器中将 new 对象中的目标字段重新赋值为 old 对象中的对应值。
第1步:创建锁定多个字段的触发器
目的: 保护包含多个敏感信息的表结构,使其在执行更新操作时无法改变特定列的数据。
入口: MySQL CLI 工具或管理界面(如 Navicat, phpMyAdmin)。
动作: 定义触发器逻辑,将需要保护的字段在更新前恢复原值。
- 首先清理可能存在的同名触发器,保证脚本可重复执行:
DROP TRIGGER IF EXISTS `members`; - 临时关闭 SQL_MODE 模式以简化语法解析:
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=''; - 使用
DELIMITER //更改语句终止符,防止触发器内部的分号导致执行中断。
DELIMITER // - 创建名为
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//
- 恢复默认分隔符并还原 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;
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













