【导读】

最近ITPUB技术论坛特意组织网络性讨论活动,关于数据库审计的话题,分享各自公司如何实现数据库审计、个人经验和构想,以及数据库审计的技巧,刚好有网友发了一个典型的审计需求,要帮他分析,以及教其如何实现,为此把内容整理成一片文章分享,供大家参考。

MySQL触发器的用处还是非常多地,关键看业务需要,曾经给大家介绍过基于存储引擎MEMORY加触发器的应用场景之一剖析。通过阅读本文,将会告诉大家:触发器的语法知识、触发器的限制、审计案例分析和实现,将逐一讲解。

n  语法

CREATE

[DEFINER = { user | CURRENT_USER }]

TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt

DEFINER:指定触发器的创建者,默认为登录mysqld服务器的账号信息;

trigger_name:触发器的名称,要符合mysql对待数据库对象命名的规范;

trigger_time:触发表上的触发器语句体执行的时间:行更新前还是行更新后,2个选项值:

BEFOR or AFTER;

tbl_name:指定触发器是对应那一个数据库对象:表的;

trigger_stmt:为触发器内部可执行的语句体;

n  触发器限制

l  拥有触发器的数据库对象必须为实体表,不能为临时表或视图;

l  MyISAM、MEMORY、InnoDB等常用存储引擎都支持触发器功能;

l  触发器支持INSERT类操作:INSERT、LOAD DATA、REPLACE;

l  触发器支持UPDATE操作;

l  触发器支持DELETE操作,但是不支持DROP TABLE 、TRUNCATE操作;

l  处发起能支持字句:INSERT INTO … ON DUPLICATE KEY UPDATE …;

l  一个数据库中的对象表,不能对同一触发事件有2个或以上的触发器同时响应;

l  一个数据库中不能有同名的触发器程序;

l  触发器无法显示调用执行,也无法像函数或存储过程一样显示地传递参数;

l  通过关键字OLD.column_name获得的值不能通过SET命令修改,但是关键字NEW获得的值能通过SET NEW.column_name=VALUE方式修改;

l  触发器的处理部分不能含有事务的关键字,例如:COMMIT、ROLLBACK等;

l  创建了触发器的表,若支持事务,则触发器也会受事务执行成功还是失败的影响,且触发器程序执行成功还是失败,也会影响事务的执行是成功还是失败;若不支持事务,则也无法支持事务的回滚操作;

n  审计案例

有一张存储车辆收费信息的表t_car,因业务要求,程序要有对该表的数据修改权限,为此需要审计对该表上数据的记录值修改信息,以备查询、跟踪。表t_car结构:

CREATE TABLE t_car(

`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,

`car_number`   VARCHAR(45)  DEFAULT ” COMMENT ‘车牌号’,

`card_number`  VARCHAR(45)  DEFAULT ” COMMENT ‘卡片编号’,

`pay`          DECIMAL(6,1)  DEFAULT 0 COMMENT ‘金额’,

PRIMARY KEY(`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

审计存储的内容:

  1. 修改前pay字段的值;
  2. 修改后pay字段的值;
  3. 记录被修改的时间;
  4. 登陆数据库服务器修改数据的ip地址、帐号信息;

为此审计表的结构为:

CREATE TABLE  t_record(

`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,

`username`     VARCHAR(45)       DEFAULT ” COMMENT ‘登录mysql的用户名’,

`client_ip`      VARCHAR(45)  DEFAULT ” COMMENT ‘远程访问mysql服务器的客户端ip地址’,

`update_Before`  VARCHAR(45)         DEFAULT ” COMMENT ‘修改前的金额’,

`update_After`   VARCHAR(45)         DEFAULT ” COMMENT ‘修改后的金额’,

`gmt_create`    TIMESTAMP NOT NULL DEFAULT ’0000-00-00 00:00:00′ COMMENT ‘创建时间’,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们可以使用触发器记录所有用户对表t_car,进行UPDATE操作修改数据的行为进行记录,触发器语句体:

DELIMITER $$ CREATE TRIGGER tri_t_car BEFORE UPDATE ON t_car FOR EACH ROW BEGIN IF NEW.pay<>OLD.pay THEN INSERT INTO t_record(username,client_ip,update_Before,update_After,gmt_create) VALUES(SUBSTRING_INDEX(USER(),’@',1),SUBSTRING_INDEX(USER(),’@',-1),OLD.pay,NEW.pay,NOW()); END IF; END $$ DELIMITER ;

测试:

测试用例的数据生成语句:

INSERT INTO t_car(car_number,card_number,pay)

VALUES(SUBSTRING(RAND(),3,20),SUBSTRING(RAND(),3,10),SUBSTRING(RAND(),3,3)),

(SUBSTRING(RAND(),3,20),SUBSTRING(RAND(),3,10),SUBSTRING(RAND(),3,3)),

(SUBSTRING(RAND(),3,20),SUBSTRING(RAND(),3,10),SUBSTRING(RAND(),3,3));

root@localhost : test 11:14:49> SELECT * FROM t_car;

+—-+—————–+————-+——-+

| ID | car_number      | card_number | pay   |

+—-+—————–+————-+——-+

|  1 | 933606902075565 | 4065322181  | 231.0 |

|  2 | 939605452064057 | 0025060456  | 193.0 |

|  3 | 96105140723386  | 2241153588  | 237.0 |

+—-+—————–+————-+——-+

3 rows in set (0.00 sec)

修改目标表数据的测试语句:

UPDATE t_car SET pay=100.5 WHERE ID=1;

查询审计信息存储的表:

root@localhost : test 11:15:51> SELECT * FROM t_record;

+—-+———-+———–+—————+————–+———————+

| ID | username | client_ip | update_Before | update_After | gmt_create          |

+—-+———-+———–+—————+————–+———————+

|  1 | root     | localhost | 231.0         | 100.5        | 2011-07-08 11:15:51 |

+—-+———-+———–+—————+————–+———————+

1 row in set (0.00 sec)

可以看到需要审计的信息,都已经存储到对应的审计表中,到此触发器实现审计功能的需求就完整实现了。

n  总结

触发器的用处非常多,关键是要结合业务场景使用,本文给大家介绍了如何使用触发器实现数据库的审计功能;我们还可以借助触发器实现2张表之间的数据同步问题,配合MEMORY引擎可以解决该存储引擎缺陷:数据无法持久化,从而增强MEMORY引擎的使用场景;我们也可以利用触发器实现异地,甚至跨国界多数据库节点之间的数据同步业务需求,后续篇章给大家介绍,某著名电子商务公司利用触发器,加应用程序实现多数据节点之间的数据同步问题。

文章原地址:http://www.mysqlops.com/2011/07/08/mysql-trigger-audit.html

MySQL触发器之审计功能(转)的更多相关文章

  1. mysql触发器之姓名转姓名拼音

    人员表people 字段:id,peopleNumber,name,namePinyin,sex,birthday,nation. namePinyin不用填写,根据name自动生成. wordlib ...

  2. mysql基于init-connect+binlog完成审计功能

    目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用 ...

  3. mysql 之审计 init-connect+binlog完成审计功能

    mysql基于init-connect+binlog完成审计功能 目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是my ...

  4. 【转】mysql利用init-connect增加访问审计功能

    mysql的连接首先都是要通过init-connect初始化,然后连接到实例. 我们利用这一点,通过在init-connect的时候记录下用户的thread_id,用户名和用户地址实现db的访问审计功 ...

  5. Mysql开启审计功能

    第一种经验证,有效. 第一种用macfee的mysql审计插件. 下载地址:https://bintray.com/mcafee/mysql-audit-plugin/release/1.1.4-72 ...

  6. MySQL5.7 (审计)通过init_connect + binlog 实现MySQL审计功能

    转载自:https://blog.51cto.com/13941177/2173620 一.简介 1.概述 mysql本身已经提供了详细的sql执行记录–general log ,但是开启它有以下几个 ...

  7. 开启mysql审计功能

    下面方式是在线开启,重启后会失效: 1.mysql社区版没有审计插件,先获取server_audit.so文件,我是先在一台测试服务器上安装了一个mariadb数据库,然后搜索find / -name ...

  8. 利用paramiko模块实现堡垒机+审计功能

    paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...

  9. SQLSERVER2008新增的审核/审计功能

    SQLSERVER2008新增的审核/审计功能 很多时候我们都需要对数据库或者数据库服务器实例进行审核/审计 例如对失败的登录次数进行审计,某个数据库上的DDL语句进行审计,某个数据库表里面的dele ...

随机推荐

  1. (2015年郑州轻工业学院ACM校赛题) G 矩阵

    看这道题的时候就感觉用一点动归思想+暴力 就能过了. #include<stdio.h> #include<iostream> #include<stack> #i ...

  2. XBox360自制系统的更新(Update)

    升级和更新 升级(Upgrade):从Windows XP到Windows 10,这叫升级,不叫更新.XBox360升级失败的话,后果可能会比较严重,直接就无法开机了. 更新(Update):在Win ...

  3. K - Leapin' Lizards - HDU 2732(最大流)

    题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有 ...

  4. Confluence简介

    前言     我们有很多的知识共享的工具,比如我们每天都用的qq共享,网盘共享,但是都不如我们这个来的方便,直接.这个是直接通过网页的形式进行共享,类似于我们的博客共享,但是它更加的具有指向性,站点管 ...

  5. 如何唯一确定一台iOS设备

    如果你的iOS应用需要针对设备做特定的操作,或者需要硬件的信息来进行判定等等的,你就需要对iOS设备进行唯一性的判定. 苹果设备有个先天的东西符合这个需求,UDID,这个东东用iTunes就可以看到, ...

  6. acm - cry for no one

    再一次回到实验室,距离上次已经四个多月了.诸多业障,三界无安,犹如火灾,众若充满,甚可怖畏,常有生老病死 忧患,如是等火,炽然不息.<成实论>云:“万法刹那生,万法刹那灭,转转相续也”.又 ...

  7. FZU-竞技游戏

    Description John和Smith在玩一种竞技游戏.在游戏中,John给Smith由n个正整数组成的序列以及m条操作指令,需要Smith按照指令来对n个整数进行操作.其中每条指令都包括二个整 ...

  8. SKTransition类

    继承自 NSObject 符合 NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0 ...

  9. Appcelerator Titanium 3.x Win7 64位平台安装步骤

    刚接触Android移动开发,第一次下载Titanium,第一次下载ADT,第一次看Javascript代码,N多第一次...... 慢慢摸索了一个礼拜把移动开发的工具链的配置学习了一下,抛砖引玉,但 ...

  10. mac下的home键、end键以及insert键的替代

    最近用android模拟器模拟东西,发现模拟器的home快捷键是键盘上的home键,这让我在windows下很好找,换到mac下找了老半天也没找到,后来才查到是有替代键的,放到这里做备份 home键f ...