触发器
- 触发器是与表相关联的命名数据库对象,并在表发生特定事件时激活。触发器将与名为的表相关联。触发器不能关联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]