数据库安全·内容版本控制,撰改留痕

以下节选择《Netkiller Architect 手札》

地址 http://www.netkiller.cn/architect/

接下来几周的话题是数据库安全。

5.5. 内容版本控制,撰改留痕

主表

CREATE TABLE `article` (
	`article_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
	`cat_id` SMALLINT(5) NOT NULL DEFAULT '0',
	`title` VARCHAR(150) NOT NULL DEFAULT '',
	`content` LONGTEXT NOT NULL,
	`author` VARCHAR(30) NOT NULL DEFAULT '',
	`keywords` VARCHAR(255) NOT NULL DEFAULT '',
	PRIMARY KEY (`article_id`),
	INDEX `cat_id` (`cat_id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1		

用于记录每次修改变动,通过该表,可以追朔数据库记录被什么时候修改过,修改了那些内容。

CREATE TABLE `article_history` (
	`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
	`article_id` MEDIUMINT(8) UNSIGNED NOT NULL,
	`cat_id` SMALLINT(5) NOT NULL DEFAULT '0',
	`title` VARCHAR(150) NOT NULL DEFAULT '',
	`content` LONGTEXT NOT NULL,
	`author` VARCHAR(30) NOT NULL DEFAULT '',
	`keywords` VARCHAR(255) NOT NULL DEFAULT '',
	PRIMARY KEY (`id`),
	INDEX `article_id` (`article_id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1		

版本控制触发器

DROP TRIGGER article_history;

DELIMITER //
CREATE TRIGGER article_history BEFORE update ON article FOR EACH ROW
BEGIN
	INSERT INTO article_history SELECT * FROM article WHERE article_id = OLD.article_id;
END; //
DELIMITER;		

进一步优化,我们可以为 history 历史表增加时间字段,用于记录被撰改那一时刻的时间。

CREATE TABLE `article_history` (
	`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
	`article_id` MEDIUMINT(8) UNSIGNED NOT NULL,
	`cat_id` SMALLINT(5) NOT NULL DEFAULT '0',
	`title` VARCHAR(150) NOT NULL DEFAULT '',
	`content` LONGTEXT NOT NULL,
	`author` VARCHAR(30) NOT NULL DEFAULT '',
	`keywords` VARCHAR(255) NOT NULL DEFAULT '',
	`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Created Time',
  	`mtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modified Time',
	PRIMARY KEY (`id`),
	INDEX `article_id` (`article_id`)
)
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1		

我们还可以为该表(article_history)增加出发器,任何修改将被拒绝.

原文发布于微信公众号 - Netkiller(netkiller-ebook)

原文发表时间:2016-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Aox Lei

Mysql 分区介绍(二) —— RANGE分区

通过范围的方式进行分区, 为每个分区给出一定的范围, 范围必须是连续的并且不能重复, 使用VALUES LESS THAN操作符

771
来自专栏Netkiller

重新整理AUTO_INCREMENT字段

节选择《Netkiller MySQL 手札》 13.9. 重新整理AUTO_INCREMENT字段 AUTO_INCREMENT 并非按照我们意愿,顺序排列...

3405
来自专栏个人随笔

MySQL 中国省市区SQL表数据

1.查省 SELECT * FROM china WHERE china.Pid=0 2.查市 SELECT * FROM chinaWHERE china.P...

6730
来自专栏Netkiller

重新整理AUTO_INCREMENT字段

节选择《Netkiller MySQL 手札》 13.9. 重新整理AUTO_INCREMENT字段 AUTO_INCREMENT 并非按照我们意愿,顺序排列,...

2856
来自专栏北京马哥教育

zabbix表分区(适用于zabbix2.0.x,zabbix2.2.x和zabbix2.4.x)[推荐]

本文主要介绍了zabbix进行数据库表分区的方法: 在系统监控中,zabbix已经代替了nagios+cacti,zabbix以其良好的图形展示和高度自定义赢得...

3506
来自专栏听雨堂

使用子查询时应当注意的

在一个查询中: UPDATE a SET a.scts = b.v1, a.YCYL = b.v2, a.YCSL = b.v3 FROM kfdbsyy a,...

19310
来自专栏王翔的专栏

如何处理 MySQL错误码 1215:无法添加外键约束?

创建外键失败常见错误,以及处理办法。

1.8K0
来自专栏从零开始的linux

mysql基础语法 表

#if语句,防止报错 mysql> drop database if exists `HA-test`; Query OK, 0 rows affected, ...

3235
来自专栏腾讯云TStack专栏

Zabbix 分区优化

目前 zabbix 的数据主要存储在 history 和 trends 的2个表中,随着时间的推移,这两个表变得非常大,性能会非常差,影响监控的使用。对 MyS...

1.1K0
来自专栏用户2442861的专栏

mysql按照天分区月表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/d...

1742

扫码关注云+社区