触发器

2020-01-13

触发器

  • 触发器是与表相关联的命名数据库对象,并在表发生特定事件时激活。触发器将与名为的表相关联。触发器不能关联TEMPORARY表或视图。
  • 触发器名称存在于模式名称空间中,这意味着所有触发器在模式内必须具有唯一的名称。不同架构中的触发器可以具有相同的名称。
  • 对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。(没有查询操作)
  • 触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

基本语法

CREATE
    [DEFINER = user]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

//触发顺序;FOLLOWS:新触发器将在现有触发器之后激活。PRECEDES:新触发器将在现有触发器之前激活。
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

触发器事件

  • DROP TABLE和 TRUNCATE TABLE表中的语句不会DELETE此触发器,因为它们未使用DELETE。删除分区也不会激活 DELETE触发器
  • INSERT、LOAD DATA和REPLACE语句都会激活INSERT触发器
  • INSERT INTO ... ON DUPLICATE KEY UPDATE ...语句插入数据时如果没有重复键,将会触发BEFORE INSERT、AFTER INSERT,如果有重复键将会触发BEFORE UPDATE和AFTER UPDATE

主体

  • 触发器可以使用BEGIN ... END 复合语句执行多个语句。
  • 在触发器主体内,可以使用别名OLD和NEW。OLD.col_name指在更新或删除现有行之前的列。 NEW.col_name指要插入的新行或更新后的现有行的列

所需权限

  • 创建时:TRIGGER
  • 触发时:TRIGGER、select表的select权限、update表的update权限,执行的语句所需的权限

注意

  • 触发器不能引用生成的列
  • 不指定DEFINER语句时将默认为当前用户,与显式指定DEFINER = CURRENT_USER相同
  • 可以为给定的表定义多个具有相同触发事件和动作时间的触发。例如,一个表可以有两个触发器BEFORE UPDATE。默认情况下,具有相同触发事件和动作时间的触发将按照创建顺序进行激活。
  • 创建触发器时将把sql_mode变量存储为有效的设置,始终在存储的sql_mode生效的情况下执行触发器,无论当前服务的sql_model的值是什么
  • 触发器主体内,CURRENT_USER函数返回是DEFINER指定的用户,用于在触发器激活时检查特权。
  • 如果使用LOCK TABLES锁定具有触发器的表,那么触发器中使用的表也会被锁定。

例子:

delimiter //
CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW
BEGIN

IF NEW.NAME == 'alex' THEN
    INSERT INTO tb2 (NEW.NAME)
VALUES
    ('aa')
END if
END//
delimiter ;

删除触发器

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

列出当前数据库中的表定义的触发器(默认数据库,除非FROM给出子句)

SHOW TRIGGERS
    [{FROM | IN} db_name]
    [LIKE 'pattern' | WHERE expr]

 

{/if}