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 }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
复制
该语句创建一个新的触发器。触发器是与表关联的数据库对象,当表发生特定事件时,触发器将激活。触发器与名为 tbl_name 的表相关联,该表必须是一个永久表。不能将触发器与临时表或视图关联。触发器名称存在于模式命名空间中,这意味着在一个模式中所有触发器都必须有唯一的名称。不同模式中的触发器可以有相同的名称。执行 CREATE TRIGGER 语句需要与触发器关联的表的 TRIGGER 权限。如果存在 DEFINER 子句,则所需的权限取决于用户值。如果启用了二进制日志记录,CREATE TRIGGER 可能需要 SUPER 权限DEFINER 子句确定在触发器激活时检查访问权限时使用的安全上下文,本节稍后将对此进行描述。trigger_time 是触发器操作时间。它可以是 BEFORE 或 AFTER,表示触发器在要修改每行之前或之后激活。基本列值检查在触发器激活之前发生,因此不能使用 BEFORE 触发器将不适合列类型的值转换为有效值。trigger_event 表示激活触发器的操作类型。trigger_event 允许以下值:● INSERT: 每当在表中插入新行(例如,通过 INSERT、LOAD DATA 和 REPLACE 语句)时,触发器就会激活。● UPDATE: 每当行被修改时(例如,通过 UPDATE 语句),触发器就会激活。● DELETE: 每当从表中删除一行(例如,通过 DELETE 和 REPLACE 语句)时,触发器就会激活。DROP TABLE 和 TRUNCATE TABLE 语句不会激活这个触发器,因为它们不使用 DELETE。删除分区也不会激活 DELETE 触发器。trigger_event 并不表示激活触发器的SQL语句的字面量类型,而是表示表操作的类型。例如,INSERT 触发器不仅为 INSERT 语句激活,而且还为 LOAD DATA 语句激活,因为这两个语句都将行插入到表中。一个可能会让人混淆的例子是 INSERT INTO ... ON DUPLICATE KEY 语法: 每一行都激活一个 BEFORE INSERT 触发器,后面跟着一个 AFTER INSERT 触发器,或者同时触发 BEFORE UPDATE 和 AFTER UPDATE 触发器,这取决于该行是否存在重复键。可以为给定表定义多个具有相同触发器事件和操作时间的触发器。例如,可以为一个表设置两个 BEFORE UPDATE 触发器。默认情况下,具有相同触发事件和动作时间的触发器按创建顺序激活。要影响触发顺序,请指定 trigger_order 子句,指示 FOLLOWS 或 PRECEDES 以及具有相同触发事件和操作时间的现有触发器的名称。使用 FOLLOWS,新的触发器在现有触发器之后激活。使用 PRECEDES,新的触发器在现有触发器之前激活。trigger_body 是触发器激活时要执行的语句。要执行多个语句,请使用 BEGIN ... END 复合语句结构。这也使您能够使用存储例程中允许的语句。有些语句不允许在触发器中使用。在触发器主体中,可以使用别名 OLD 和 NEW 引用主题表(与触发器关联的表)中的列。OLD.col_name 在更新或删除现有行的列之前引用该列。NEW.col_name 引用要插入的新行中的列,或更新后的现有行。触发器不能使用 NEW.col_name 或使用 OLD.col_name 引用生成列。MySQL在创建触发器时存储当时有效的 sql_mode 系统变量设置,并始终以该设置生效的方式执行触发器主体,而不管触发器开始执行时当前服务器是何种SQL模式。DEFINER 子句指定在触发器激活时检查访问权限使用的 MySQL 帐户。如果存在 DEFINER 子句,则用户值应该指定为 'user_name'@'host_name'、CURRENT_USER 或 CURRENT_USER() 的 MySQL 帐户。允许的用户值取决于您拥有的权限。如果省略了 DEFINER 子句,则默认的定义者是执行 CREATE TRIGGER 语句的用户。这与显式指定 DEFINER = CURRENT_USER 相同。MySQL 在检查触发器权限时考虑了 DEFINER 用户,如下所示:● 在 CREATE TRIGGER 语句执行时,执行语句的用户必须具有 TRIGGER 权限。● 在触发器激活时,针对 DEFINER 用户检查权限。该用户必须具有以下权限:■ 如果在触发器主体中使用 OLD.col_name 或 NEW.col_name 引用表列,则需要主题表的 SELECT 权限。■ 如果在触发器主体中表列是 SET NEW.col_name = value 语句的赋值目标,则需要主题表的 UPDATE 权限。在触发器主体中,CURRENT_USER 函数返回用于在触发器激活时检查权限的帐户。这是 DEFINER 用户,而不是其操作导致触发器被激活的用户。如果使用 LOCK TABLES 来锁定具有触发器的表,那么触发器中使用的表也会被锁定。https://dev.mysql.com/doc/refman/8.0/en/create-trigger.html