数据库原理:触发器和事件
触发器(TRIGGER)和事件(EVENT)都是与表操作相关的特殊类型的存储过程,都包含一系列的SQL语句。触发器是在满足一定条件下自动触发执行的数据库对象,如向表中插入记录、更新记录或者删除记录时,触发器被系统自动地触发并执行。事件是MySQL基于特定时刻或时间周期调用的过程式数据库对象,例如在某一时刻定期激活事件向表中插入记录、更新记录或者删除记录,事件有时也被称作临时触发器。与触发器不同的是,一个事件可调用一次,也可周期性调用,它由一个特定的线程来管理,该线程被称作事件调度器(EVENT SCHEDULER)。
本章学习目标:了解MySQL中触发器和事件的应用场景与作用;掌握使用MySQL创建、查看和删除触发器的方法;掌握使用MySQL创建、查看和修改事件的方法。
一、MySQL触发器
1.1、触发器概述
MySQL从5.0.2版本开始支持触发器的功能。在MySQL中,触发器通常是定义在表上的,用于保护表中的数据。触发器针对的是永久性表,而不是临时表,它只能由数据库的特定操作事件来触发,当操作影响到被保护的数据时,如对数据表进行插入(INSERT)、修改(UPDATE)和删除(DELETE)操作时,数据库系统就会自动执行触发器中定义的程序语句,以保护数据完整性和执行其他的一些业务操作。触发器与存储过程的区别在于触发器能够自动触发执行。触发器基于一个表创建,但可以基于多个表进行操作,因此,触发器可以对表执行复杂的完整性约束。根据数据操作与触发器执行的先后顺序,触发器可分为BEFORE和AFTER两类,BEFORE触发器在INSERT/UPDATE/DELETE操作之前执行触发器,AFTER触发器则在INSERT/UPDATE/DELETE操作之后执行触发器,如图16-1所示。通常,BEFORE触发器用于一些数据的校验工作(数据类型、格式等),AFTER触发器则用于一些后续的统计工作(计算行数、平均值等)。每一类触发器根据触发的操作事件又可分为INSERT、UPDATE和DELETE3类。
在MySQL实际应用中,触发器主要可应用于以下场景。
(1)数据库的安全性检查。例如,禁止在非工作日时间插入学生信息。
(2)数据库的数据校验。触发器可以防止恶意的或错误的INSERT、UPDATE和DELETE操作。例如,每增加一个学生信息到数据表时,触发器都检查其出生日期格式是否正确。
(3)数据库的审计。例如,跟踪表上操作的记录,比如什么时间什么人操作了数据库。
(4)数据库的备份和同步。例如,无论什么时候删除一名学生信息,触发器都在某个备份表中保留一个副本。再比如,有两个数据库,一个在北京、一个在南京,在北京的数据库为主数据库,在南京的为备份数据库,数据库管理员可以利用触发器监听北京数据库的修改内容,如果北京数据库被修改则将修改的数据库传递给南京的备份数据库。
(5)实现复杂的数据库完整性规则。触发器实现非标准的数据完整性检查和约束,可以引用列或数据库对象。例如,老师向学生成绩表中输入超过满分限制的分数时,触发器返回默认值。
(6)自动计算数据值。当数据的值达到一定的要求时进行特定的处理。例如,每当一届学生毕业时,触发器就从学生数量中减去毕业的学生数量。
1.2、创建触发器
1.3、查看触发器
1.4、删除触发器
二、MySQL事件
2.1、事件概述
在系统管理或者数据库管理中,数据库管理员经常需要周期性地执行某一条或者多条SQL语句。为此,MySQL从5.1版本开始推出了事件。事件是一种特殊的存储过程,可以用于定时执行的任务,如定时删除记录、对数据进行汇总、清空表、删除表等某些特定任务。事件与触发器类似,都是在某些事务发生时被激活。触发器的语句是为了响应给定表上发生的特定类型的操作事件而执行的,而事件的语句是为了响应指定的时间间隔而执行的。因此,有时事件也被称作临时性触发器。类似于Linux下的cron作业或Windows任务调度程序的思想,MySQL 事件是根据日程表运行的任务。当我们创建一个事件时,可以创建一个包含一条或者多条SQL语句的数据库对象,这些SQL语句可以在固定的时刻或者周期性地被执行。MySQL事件可以精确到每秒执行一次任务,而操作系统的计划任务只能精确到每分钟执行一次,这充分体现了事件的实时优势。对于一些对数据实时性要求比较高的应用,如股票交易、银行转账、营业额汇总等应用,可以通过事件定时或周期性处理。通过事件可以将依赖于外部程序的一些对数据的定时性操作转移到通过数据库本身提供的功能来实现,也就是说,事件不需要外部程序进行调用,其可以根据设定的时刻被调用一次或者周期性调用。
MySQL使用事件调度器(EVENT SCHEDULER)来调用事件,它可以不断地监视一个事件是否需要被调用。事件调度器默认是开启的,如果要创建事件,必须打开它。用户可以通过以下语句开启(on)或者关闭(off)事件调度器。
1 |
|
用户也可以在配置文件my.ini(Windows系统)或者my.cnf(Linux系统)中加入语句event_scheduler=on,并且重启MySQL服务器来开启时间调度器。在配置文件中添加了该语句后,MySQL就可以是始终开启事件。
用户可以在MySQL Shell中通过以下语句来查看事件调度器是否开启。
1 |
|
执行上述语句,结果如表16-3所示。
Variable_name | Value |
---|---|
event_name | ON |
用户也可以使用SHOW PROCESSLIST语句来查看事件调度器是否开启。当事件调度器开启时时,其作为守护进程出现在SHOW PROCESSLIST的输出结果中。SHOW PROCESSLIST语句的语法格式如下。
1 |
|