触发器:
触发器被定义为党表被修改时产生动作的对象。触发器可以用于insert、update和delete语句。举个例子,你可以在将值插入表中之前做检查,或者指定哪些行从表中删除时应当被记入另一个数据变化日志中。触发器对于自动化记录被监控表的变化更新是很有用处的。
举个具体的实例,mysql数据库中创建如下数据库和表
create database if not exists `test`;
use test;
#被监控的数据表
create table IF NOT EXISTS `test`.`auction`
(
`id`int unsigned not null auto_increment,
`ts`timestamp,
`item`varchar(30) not null,
`bid`decimal(10,2) not null,
primarykey (id)
);
#表auction数据有更新时记录到auction_log表中
create table if not exists`test`.`auction_log`
(
actionenum('create', 'update', 'delete'),
`id`int unsigned not null,
`ts`timestamp,
`item`varchar(30) not null,
`bid`decimal(10,2) not null,
index(id)
);
备注:mysql数据库默认是不对table赋予trigger权限的,建议手动给需要被监控管理的数据表给用户赋予trigger权限。操作如下:
#GRANT trigger ON databasename.tablename TO‘username’@’%’;
去掉相应权限使用REVOKE关键字操作
接着,我们定义表auction的相关trigger触发器,如下操作:
drop trigger if exists`test`.`insert_auction`;
create trigger insert_auction after inserton `test`.`auction` for each row
insert into `test`.`auction_log` (action,id, ts, item, bid) values('create', new.id, now(), new.item, new.bid);
drop trigger if exists`test`.`update_auction`;
create trigger update_auction after updateon `test`.`auction` for each row
insert into `test`.`auction_log`(action,id, ts, item, bid) values('update', new.id, now(), new.item, new.bid);
drop trigger if exists`test`.`delete_auction`;
create trigger delete_auction after deleteon `test`.`auction` for each row
insert into `test`.`auction_log`(action,id, ts, item, bid) values('delete', old.id, now(), old.item, old.bid);
备注:触发器编写的格式如下:
DELIMITER $$
CREATE TRIGGER triggername BEFORE|AFTER insert|update|deleteON tablename for each row
BEGIN
SQL操作块;
END;$$
DELIMITER;
若是只有一条SQL操作的trigger,则可以精简如下
CREATE TRIGGER triggername BEFORE|AFTERinsert|update|delete ON tablename for each row
Sql操作语句;
删除触发器,使用drop trigger triggername即可。
在MYSQL Workbench上执行触发器以后,管理视图变化如下:
分别对auction表插入、更新和删除数据操作
insert into `test`.`auction`(item, bid) values('chintzpillows', 10.00);
update `test`.`auction` set bid=30 whereid=1;
delete from `test`.`auction` where id=1;
查询auction_log表可见如下内容:
select * from `test`.`auction_log`;