
2.3 触发器
触发器是对应用动作的响应机制,当应用对一个对象发起DML操作时,就会产生一个触发事件(Event)。如果该对象上拥有该事件对应的触发器,那么就会检查触发器的触发条件(Condition)是否满足,如果满足触发条件,那么就会执行触发动作(Action),如表2-13所示。
表2-13 触发器说明

通过CREATE TRIGGER命令可以创建一个触发器,在CREATE TRIGGER命令中可以指定触发器的事件、条件和动作。
例2-58:创建触发器。具体语句如下:

触发事件满足时,还需要考虑触发器的执行时机,触发器语法中提供了两个触发时机:
BEFORE和AFTER。顾名思义,BEFORE就是在触发器事件执行之前检查触发条件以及执行触发动作,而AFTER则是在触发事件之后检查触发条件以及执行触发动作。
例2-59:在UPDATE事件发生之前执行触发器。具体语句如下:

例2-60:在INSERT事件发生之后执行触发器。具体语句如下:

触发器可以对应到元组(一个SQL语句可以更新多个元组),也可以对应到SQL语句级,默认是SQL语句级。
例2-61:针对SQL语句级的触发器。具体语句如下:

例2-62:针对元组级的触发器。具体语句如下:

针对触发对象的触发事件一旦发生,就会激活触发器,触发器首先会检查触发条件,只有在满足触发条件的情况下,才会被真正地执行。其中,元组级的触发器可以将更新前后的值嵌入到触发器的触发条件中,如表2-14所示。
表2-14 “新”“老”元组值触发条件说明

例2-63:触发条件中包含NEW元组对应的列值。具体语句如下:

触发器的动作主要是执行一个函数,在创建触发器之前,需要创建一个函数,如果返回值是Trigger,那么该函数就是触发器函数,否则是普通函数。同一个触发器可以指定多个触发事件,每个事件发生时都能激活触发器来执行触发器的动作。
例2-64:在warehouse表上创建一个完整的触发器,触发器的工作是在wh_log表中记录DELETE/UPDATE/INSERT操作的具体信息。实现的语句如下:

如果需要删除触发器,可以使用SQL中的DROP TIGGER命令。
例2-65:删除触发器。具体语句如下:
