第七章 触发器与事件


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的事件。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM