10. 触发器和事件

简介: 10. 触发器和事件

创建触发器

触发器是在插入、更新和删除语句前后自动执行的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可以修改事件是否可用


相关文章
|
5月前
|
存储 前端开发 JavaScript
简单实现一个事件触发器
简单实现一个事件触发器
75 0
|
2月前
|
消息中间件 运维 Serverless
函数计算产品使用问题之如何判断从函数调用获取到的事件是由哪个触发器发出的
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
运维 Serverless 数据处理
函数计算产品使用问题之OSS触发器是否只支持事件处理函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
监控 Oracle 安全
Oracle用户事件触发器:数据库世界的“福尔摩斯”
【4月更文挑战第19天】Oracle用户事件触发器是数据库中的监控机制,类似于“福尔摩斯”,在用户执行特定操作时自动触发。它们关注用户行为而非数据变化,可用于权限检查、安全监控、性能优化等。通过DDL语句创建,需注意逻辑清晰、条件合适及定期更新,以适应数据库变化和业务发展。掌握其使用能有效保障数据安全与稳定。
|
10月前
|
图形学
触发器事件
触发器事件
|
存储 SQL 关系型数据库
触发器和事件自动化的讲解
触发器和事件自动化的讲解
104 0
|
设计模式 JavaScript 索引
Node.js精进(4)——事件触发器
Node.js精进(4)——事件触发器
|
存储 SQL 关系型数据库
【MYSQL百炼成圣】金刚不坏篇——事件(定时器)和触发器
【MYSQL百炼成圣】金刚不坏篇——事件(定时器)和触发器
295 0
【MYSQL百炼成圣】金刚不坏篇——事件(定时器)和触发器
|
存储 关系型数据库 MySQL
mysql 存储过程、触发器、视图、事件
mysql 存储过程、触发器、视图、事件
119 0