10. 触发器和事件

122 阅读2分钟

创建触发器

触发器是在插入、更新和删除语句前后自动执行的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 得到旧的行和里面的值

注意:在触发器中,只能修改除了触发器所在表的别的表。否则经过不恰当的操作,会造成无尽的循环触发

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 ;

触发语句

delete from payments
where payment_id = 11

查看触发器

show triggers;

show triggers like 'payments%'

删除触发器

drop trigger if exists payments_after_insert;

使用触发器进行审计

建立一个审核表(日志表)以记录谁在什么时间做了什么修改,实现方法就是在触发器里加上创建日志记录的语句,日志记录应包含修改内容信息和操作信息两部分。

例如 往 payments_after_insert 的主体里加上这样的语句:

INSERT INTO payments_audit
VALUES (NEW.client_id, NEW.date, NEW.amount, 'insert', NOW());

往 payments_after_delete 的主体里加上这样的语句:

INSERT INTO payments_audit
VALUES (OLD.client_id, OLD.date, OLD.amount, 'delete', NOW());

注意:实际运用中不会为数据库中的每张表建立一个审核表,相反,会有一个整体架构,通过一个总审核表来记录,这在之后设计数据库中会讲到。

事件

事件是一段根据计划执行的代码,可以执行一次,或者按某种规律执行 比如每天早上10点或每月一次 通过事件我们可以自动化数据库维护任务,比如删除过期数据、将数据从一张表复制到存档表 或者 汇总数据生成报告,所以事件十分有用。

首先找到事件触发器

show variables like 'event%';
set global event_scheduler = on; -- 如果是关闭的状态,可以设置为打开

按照如下编写定时任务:每年定时删除审计表中的信息

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 作为条件

show events;

事件删除

drop event if exists yearly_delete_stale_audit_rows;

事件修改

alter event  -- 把前面create的代码部分,替换create为alter就可以修改
alter event yearly_delete_stale_audit_rows disable; -- disable/able可以修改事件是否可用