版权声明
转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。
摘要
数据库记录防删除,放撰改,撰改留痕,灵活性解决方案
目录
1. 什么是防删除,防撰改
2. 为什么要做防删除,防撰改限制
3. 何时做防删除,防撰改限制
4. 在哪里做防删除,防撰改限制
5. 谁去做防删除,防撰改限制
6. 怎样实现防删除,防撰改限制
6.1. 限制删除
6.2. 限制修改
6.3. 为数据安全而分库
7. 怎样实现数据修改留痕
7.1. 版本控制
7.2. 一张表实现历史日志记录
1. 什么是防删除,防撰改
禁止数据删除,数据一旦增加不允许数据被任何人删除
禁止数据修改,数据一旦建立不允许对数据做修改操作
2. 为什么要做防删除,防撰改限制
很多时候我们的数据是只增加,不会删除数据。有些敏感子段一旦数据家里是不允许再修改的,例如银行账户表中的资金子段。
另一个原因是我们防止误操作
3. 何时做防删除,防撰改限制
我认为在数据库设计时就应该考虑倒这些问题,如果发现数据被删除或者被撰改,亡羊补牢也不晚,我们不能允许再次发生。
你可以取消用户的 DELETE 权限,使之只能做查询操作,但修改(UPDATE)呢?你就无能为力!如果取消UPDATE程序将不能正常运行。
4. 在哪里做防删除,防撰改限制
程序设计之初你就应该想到这些问题,如果没有考虑倒,你只能修改现有逻辑。通常的做法是所有表增加一个删除状态子段,删除操作即是更新状态。这种方式也有弊端就是垃圾数据会不停地膨胀。
5. 谁去做防删除,防撰改限制
我认为可以分为两种人,一种是DBA,一种是开发者。这里主要将数据库部分。
6. 怎样实现防删除,防撰改限制
6.1. 限制删除
CREATE DEFINER=`dba`@`192.168.%` TRIGGER `account_before_delete` BEFORE DELETE ON `account` FOR EACH ROW BEGIN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001;
END
对account表中的记录做删除操作,数据库抛出异常 Permission denied
6.2. 限制修改
禁止所有修改操作
DELIMITER $$
CREATE DEFINER=`dba`@`192.168.%` TRIGGER `logging_before_update` BEFORE UPDATE ON `logging` FOR EACH ROW BEGIN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Permission denied', MYSQL_ERRNO = 1001;
END
限制部分子段修改,其他子段扔允许修改
CREATE DEFINER=`dba`@`192.168.%` TRIGGER `members_before_update` BEFORE UPDATE ON `members` FOR EACH ROW BEGIN
SET NEW.`id` = OLD.id;
SET NEW.`name` = OLD.name;
SET NEW.`chine