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可以修改事件是否可用


相关文章
|
1天前
|
存储 前端开发 JavaScript
简单实现一个事件触发器
简单实现一个事件触发器
33 0
|
1天前
|
监控 Oracle 安全
Oracle用户事件触发器:数据库世界的“福尔摩斯”
【4月更文挑战第19天】Oracle用户事件触发器是数据库中的监控机制,类似于“福尔摩斯”,在用户执行特定操作时自动触发。它们关注用户行为而非数据变化,可用于权限检查、安全监控、性能优化等。通过DDL语句创建,需注意逻辑清晰、条件合适及定期更新,以适应数据库变化和业务发展。掌握其使用能有效保障数据安全与稳定。
|
5月前
|
图形学
触发器事件
触发器事件
|
9月前
|
存储 SQL 关系型数据库
触发器和事件自动化的讲解
触发器和事件自动化的讲解
76 0
|
12月前
|
设计模式 JavaScript 索引
Node.js精进(4)——事件触发器
Node.js精进(4)——事件触发器
|
存储 关系型数据库 MySQL
mysql 存储过程、触发器、视图、事件
mysql 存储过程、触发器、视图、事件
104 0
|
存储 SQL 关系型数据库
【MYSQL百炼成圣】金刚不坏篇——事件(定时器)和触发器
【MYSQL百炼成圣】金刚不坏篇——事件(定时器)和触发器
250 0
【MYSQL百炼成圣】金刚不坏篇——事件(定时器)和触发器
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.28. 事件触发器函数
9.28. 事件触发器函数 9.28.1. 捕获命令结尾的改变 9.28.2. 通过DDL命令删除处理的对象 9.28.3. 处理表重写事件 PostgreSQL提供这些帮助函数用以从事件触发器中检索信息。
1380 0