创建触发器
触发器是在插入、更新和删除语句前后自动执行的SQL代码,通常使用触发器增强数据一致性
sql
复制代码
delimiter $$ create trigger payments_after_insert after insert on payments -- 可以是befor update 等相关关键字 for each row -- 对每一行,新插入的 begin update invoices set payment_total = payment_total + new.amount where invoice_id = new.invoice_id; end $$ delimiter ;
- new 得到新的刚刚插入的行和里面的值
- old 得到旧的行和里面的值
注意:在触发器中,只能修改除了触发器所在表的别的表。否则经过不恰当的操作,会造成无尽的循环触发
sql
复制代码
delimiter $$ create trigger payments_after_delete after delete on payments for each row begin update invoices set payment_total = payment_total - old.amount where invoice_id = old.invoice_id; end $$ delimiter ;
触发语句
sql
复制代码
delete from payments where payment_id = 11
查看触发器
sql
复制代码
show triggers; show triggers like 'payments%'
删除触发器
sql
复制代码
drop trigger if exists payments_after_insert;
使用触发器进行审计
建立一个审核表(日志表)以记录谁在什么时间做了什么修改,实现方法就是在触发器里加上创建日志记录的语句,日志记录应包含修改内容信息和操作信息两部分。
例如 往 payments_after_insert 的主体里加上这样的语句:
sql
复制代码
INSERT INTO payments_audit VALUES (NEW.client_id, NEW.date, NEW.amount, 'insert', NOW());
往 payments_after_delete 的主体里加上这样的语句:
sql
复制代码
INSERT INTO payments_audit VALUES (OLD.client_id, OLD.date, OLD.amount, 'delete', NOW());
注意:实际运用中不会为数据库中的每张表建立一个审核表,相反,会有一个整体架构,通过一个总审核表来记录,这在之后设计数据库中会讲到。
事件
事件是一段根据计划执行的代码,可以执行一次,或者按某种规律执行 比如每天早上10点或每月一次 通过事件我们可以自动化数据库维护任务,比如删除过期数据、将数据从一张表复制到存档表 或者 汇总数据生成报告,所以事件十分有用。
首先找到事件触发器
sql
复制代码
show variables like 'event%'; set global event_scheduler = on; -- 如果是关闭的状态,可以设置为打开
按照如下编写定时任务:每年定时删除审计表中的信息
sql
复制代码
create event yearly_delete_stale_audit_rows on schedule -- at '2019-05-01' every 1 year starts '2019-01-01' ends '2029-01-01' do begin delete from payments_audit where action_date < now() - interval 1 year; -- 或者使用 datesub(now() - interval 1 year) end $$ delimiter ;
事件查看
可以使用 like 作为条件
sql
复制代码
show events;
事件删除
sql
复制代码
drop event if exists yearly_delete_stale_audit_rows;
事件修改
sql
复制代码
alter event -- 把前面create的代码部分,替换create为alter就可以修改 alter event yearly_delete_stale_audit_rows disable; -- disable/able可以修改事件是否可用