7.1 触发器的概念及管理
1. 概念
触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
存储过程的优点:
安全性:可以基于数据库的值使用户具有操作数据库的某种权利。
审计:可以跟踪用户对数据库的操作。
实现复杂的数据完整性规则
实现复杂的非标准的数据库相关完整性规则。
2. 创建使用触发器
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
语法格式:
create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt
说明:
trigger_event与以表操作方式激活触发程序的sql语句并不很类似, 这点很重要。
【例1】创建一个表tb,其中只有一列a,在表上创建一个触发器,每次插入操作时,将用户变量count的值加一
【例2】创建一个由delete触发多个执行语句的触发器tb_delete,每次删除记录时,都把删除的记录的a字段的值赋值给用户变量@old_value。@count记录删除的个数。
【例3】定义了一个update触发程序,用于检查更新每一行时将使用的新值,并更改值,使之位于0~100的范围内。
3. 查看触发器
show triggers语句可以查看触发器的状态、语法等信息,但是因为不能查看指定的触发器。
查询系统表information_schema.triggers表,这个方式可以查询指定触发器的指定信息,操作起来明显方便得多。
【例4】查询名称为tb1_insert的触发器
4. 删除触发器
删除触发器语法格式:
drop trigger [schema_name.]trigger_name触发程序
说明:
数据库(schema_name)是可选的。如果省略了schema,将从当前数据库中删除触发程序。
【例5】删除触发器tb1_insert.
5. 对触发器的进一步说明
下面是使用触发器的一些限制:
触发器不能调用将数据返回客户端的存储过程,也不能使用采用call语句的动态sql。
触发器不能使用以显式或隐式方式开始或结束事务的语句,如start transaction、commit或rollback。
需要注意以下几点:
触发器针对行来操作,因此当处理大数据集的时候可能效率很低。
触发器不能保证原子性。
7.2 事件的概念及管理
1. 事件概念
事件调度器(event scheduler):可以用做定时执行某些特定任务,可以精确到每秒钟执行一个任务,而操作系统的计划任务只能精确到每分钟执行一次。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(triggers)是基于某个表所产生的事件触发的。
2. 创建事件
基本形式如下:
create event event_name on schedule schedule [on completion [not] preserve] [enable | disable | disable on slave] [comment 'comment'] do event_body; schedule: at timestamp interval: quantity
【例6】创建一个立即启动的事件,创建后查看学生信息如下:
注意:在使用时间调度器这个功能之前必须确保event_scheduler已开启。
【例7】创建一个30秒后启动的事件, 创建后查看学生信息如下:
3. 修改事件
修改事件的基本形式如下:
alter event event_name [on schedule schedule] [rename to new_event_name] [on completion [not] preserve] [comment 'comment'] [enable | disable] [do sql_statement]
【例8】将事件direct的名字改成firstdirect。
4. 删除事件
删除事件基本形式:
drop event [if exists] event_name
说明:
如果事件不存在,会产生error 1513 (hy000): unknown event错误,因此最好加上if exists
【例9】删除名为thirtyseconds的事件。