CREATE
[DEFINER = user]
TRIGGER [IF NOT EXISTS] 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
的表关联,该表必须引用永久表。不能将触发器与 TEMPORARY
表或视图关联。
触发器名称存在于模式命名空间中,这意味着所有触发器在同一个模式中必须具有唯一的名称。不同模式中的触发器可以具有相同的名称。
IF NOT EXISTS
可防止在同一模式中存在具有相同名称的触发器(在同一表上)时发生错误。
本节介绍 CREATE TRIGGER
语法。有关其他讨论,请参见 第 27.3.1 节,“触发器语法和示例”。
CREATE TRIGGER
需要对与触发器关联的表具有 TRIGGER
权限。如果存在 DEFINER
子句,则所需的权限取决于 user
值,如 第 27.6 节“存储对象访问控制” 中所述。如果启用了二进制日志记录,则 CREATE TRIGGER
可能需要 SUPER
权限,如 第 27.7 节“存储程序二进制日志记录” 中所述。
DEFINER
子句确定在触发器激活时检查访问权限时要使用的安全上下文,如本节后面所述。
trigger_time
是触发器动作时间。它可以是 BEFORE
或 AFTER
,以指示触发器是在要修改的每行之前还是之后激活。
在触发器激活之前会执行基本的列值检查,因此您无法使用 BEFORE
触发器将不适合列类型的值转换为有效值。
trigger_event
指示激活触发器的操作类型。以下 trigger_event
值是允许的
trigger_event
不代表激活触发器的文字类型的 SQL 语句,而是代表一种类型的表操作。例如,INSERT
触发器不仅会针对 INSERT
语句激活,还会针对 LOAD DATA
语句激活,因为这两种语句都会将行插入到表中。
一个可能令人困惑的例子是 INSERT INTO ... ON DUPLICATE KEY UPDATE ...
语法:BEFORE INSERT
触发器会针对每行激活,然后是 AFTER INSERT
触发器,或者同时是 BEFORE UPDATE
和 AFTER UPDATE
触发器,这取决于该行是否存在重复键。
级联外键操作不会激活触发器。
可以为给定表定义多个具有相同触发器事件和操作时间的触发器。例如,您可以为一个表创建两个 BEFORE UPDATE
触发器。默认情况下,具有相同触发器事件和操作时间的触发器将按照创建顺序激活。要影响触发器顺序,请指定一个 trigger_order
子句,该子句指示 FOLLOWS
或 PRECEDES
以及具有相同触发器事件和操作时间的现有触发器的名称。对于 FOLLOWS
,新触发器将在现有触发器之后激活。对于 PRECEDES
,新触发器将在现有触发器之前激活。
trigger_body
是在触发器激活时要执行的语句。要执行多条语句,请使用 BEGIN ... END
复合语句结构。这还使您能够使用在存储例程中允许的相同语句。请参见 第 15.6.1 节“BEGIN ... END 复合语句”。触发器中不允许使用某些语句;请参见 第 27.8 节“存储程序的限制”。
在触发器主体中,您可以使用别名 OLD
和 NEW
来引用主体表(与触发器关联的表)中的列。 OLD.
指的是现有行在更新或删除之前的一列。 col_name
NEW.
指的是要插入的新行的一列或现有行在更新之后的一列。col_name
触发器无法使用 NEW.
或使用 col_name
OLD.
来引用生成列。有关生成列的信息,请参见 第 15.1.20.8 节“CREATE TABLE 和生成列”。col_name
MySQL 存储创建触发器时有效的 sql_mode
系统变量设置,并且始终使用此设置来执行触发器主体,无论触发器开始执行时当前服务器 SQL 模式是什么。
DEFINER
子句指定在触发器激活时检查访问权限时要使用的 MySQL 帐户。如果存在 DEFINER
子句,则 user
值应为以 '
、user_name
'@'host_name
'CURRENT_USER
或 CURRENT_USER()
格式指定的 MySQL 帐户。允许的 user
值取决于您拥有的权限,如 第 27.6 节“存储对象访问控制” 中所述。有关触发器安全性的更多信息,请参见该部分。
如果省略了 DEFINER
子句,则默认定义者是执行 CREATE TRIGGER
语句的用户。这与显式指定 DEFINER = CURRENT_USER
相同。
MySQL 会在检查触发器权限时考虑 DEFINER
用户,如下所示
在
CREATE TRIGGER
时,发出该语句的用户必须具有TRIGGER
权限。在触发器激活时,会针对
DEFINER
用户检查权限。该用户必须具有以下权限
在触发器主体中,CURRENT_USER
函数返回用于在触发器激活时检查权限的帐户。这是 DEFINER
用户,而不是导致触发器激活的用户。有关触发器中用户审核的信息,请参见 第 8.2.23 节“基于 SQL 的帐户活动审核”。
如果使用 LOCK TABLES
锁定具有触发器的表,则触发器中使用的表也将被锁定,如 LOCK TABLES 和触发器 中所述。
有关触发器使用的更多讨论,请参见 第 27.3.1 节“触发器语法和示例”。