第 10 章 触发程序

触发程序是用户定义在数据表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增、删、改操作均由服务器自动激活相应的触发程序。触发程序是一个功能强大的工具,可以使每个站点在有数据修改时自动强制执行其业务规则。通过触发程序,可以使多个不同的用户能够在保持数据完整性和一致性的良好环境下进行修改操作。

10.1 触发程序的定义

触发程序是一种特殊的存储过程,它的执行不是由程序调用,也不是手工气动,而是通过事件进行触发来被执行的。触发程序经常用于加强数据的完整性约束和业务规则等。触发程序类似约束,但比约束更灵活,具有更精细和更强大的数据控制能力。触发程序的优点如下:
(1)触发程序的执行是自动的。当对触发程序相关表的数据做出相应的修改后立即执行。
(2)触发程序可以通过数据库中相关的表进行层叠修改另外的表。
(3)触发程序可以实施比FOREIGN KEY约束、CHECK约束更为复杂的检查和操作。

10.2 触发程序的创建

MySQL创建触发程序的格式如下:
CREATE trigger <触发程序名称>
{before | after}
{insert | update | delete}
On <表名>
For each row
<触发程序SQL语句>
下面对定义触发程序各部分语法进行详细说明。
(1)表的拥有者即创建表的用户可以在表上创建触发程序,而且一个表上可以创建多个触发程序。
(2)create trigger <触发程序名称>:创建一个新的触发程序,并指定触发程序的名称。
(3){before | after}:用于指定在INSERT、UPDATE或DELETE语句执行前触发还是执行后触发。
(4){insert | update | delete}
INSERT:将新行插入表时激活触发程序。例如:INSERT、LOAD DATA 和 REPLACE语句。
UPDATE:更改某一行时激活触发程序。例如:UPDATE语句。
DELETE:从表中删除某一行时激活触发程序。例如:DELETE和REPLACE语句。
(5)on<表名>:用于指定响应该触发程序的表名。必须引用永久性表,不能将触发程序与TEMPORARY表或视图关联起来。
(6)for each row:触发程序的执行间隔,for each row 通知触发程序吗,每隔一行执行一次动作,而不是对整个表执行一次。
(7)<触发程序SQL语句> :触发程序要执行的SQL语句,如果该触发程序要执行多条SQL语句,要将多条语句放在BEGIN……END块中。
(8)触发程序名称存放在与方案的名称空间内,这意味着在 1 个方案中,所有的触发程序必须具有唯一的名称,位于不同方案中的触发程序可以具有相同的名称。
提示:对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如:对于某一表,不能拥有两个BEFORE UPDATE触发程序。
提示:(1)在MySQL中如果想访问受触发程序影响的行中的列,可以使用LOD和NEW关键字。在INSERT触发程序中,仅能使用NEW.col_name,且只有新行,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,且没有新行,只有旧行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也可使用NEW.col_name来引用更新后的行中的列。
(2)用OLD命名的列是只读的,可以引用它,不能改变它的值。对于NEW命名的列,如果具有SELECT权限,可以引用它。在BEFORE触发程序中,如果用户有UPDATE权限,可以使用“SET NEW.col_name=value”更改它的值,如果程序需要,可以在触发程序中更改将要插入到新行中的值,或用于更新新的行。
(3)使用别名OLD和NEW,能够引用与触发程序相关的表中的列。OLD.col_name在更新或删除它之前,引用已有行中的 1 列。NEW.col_name在更新它之后引用将要插入的新行的 1 列或已有行的 1 列。激活触发程序时,对于触发程序引用的所有OLD和NEW列,需要具有SELECT权限,对于作为SET赋值目标的所有NEW列,需要具有UPDATE权限。

10.3 触发程序的操作

10.3.1 查看触发程序

触发程序创建后可以通过两种方法查看触发程序的定义、状态等信息。查看的方法分别为SHOW TRIGGERS和在系统表TRIGGERS中进行查看。

  1. 使用SHOW TRIGGERS语句查看触发程序的信息
    SHOW TRIGGERS [FROM db_name] [LIKE expr]
    其中,LIKE expr待匹配的表达式(expr)会与触发程序定义时所在的表的名称相比较,而不与触发程序的名称相比较。
  2. 在系统表TRIGGERS中查看触发程序的信息
    已定义好的触发程序的信息都存储在INFORMATION_SCHEMA库中的TRIGGERS表中,可以通过查看该表中的信息获取某个触发程序的信息。
    查询语法如下:SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
    where condition

10.3.2 删除触发程序

MySQL删除触发程序的语法如下:
DROP {DATABASE | SCHEMA} [IF EXISTS] Trigger_name
下面对删除触发程序各部分语法进行详细说明:
(1)SCHEMA 表示数据库名称,schema_name是可选的,如果schema_name省略不写,将从当前数据库中删除触发程序。
(2)Trigger_name是要删除的触发程序的名称。
(3)IF EXISTS用来阻止不存在的触发程序被删除的错误。如果待删除的触发程序不存在,系统会出现触发程序不存在的提示信息。

10.5 高手点拨

  1. 在触发程序的执行过程中,MySQL处理错误的方式有哪些 ?
    如果BEFORE触发程序失败,不执行相应行的操作。只有BEFORE触发程序和行操作均成功执行,才执行AFTER触发程序,如果BEFORE和AFTER触发程序的执行过程中出现错误,将会导致调用触发程序的整个语句的失败。
  2. MYSQL中触发程序中能不能对本表进行INSERT、UPDATE、DELETE操作?
    不能,以免递归循环被触发。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值