创建[definer = .用户)引发trigger_nametrigger_timetrigger_event在tbl_name对于每一行[trigger_order]trigger_bodytrigger_time:{在|之前后}trigger_event: {insert | update | delete}trigger_order:{跟在|后面}other_trigger_name
这个语句创建了一个新的触发器。触发器是与表相关联的命名数据库对象,当表发生特定事件时触发。触发器与已命名的表相关联tbl_name
,它必须引用一个永久表。不能将触发器与临时
表或视图。
触发器名称存在于模式名称空间中,这意味着所有触发器在模式中必须具有惟一的名称。不同模式中的触发器可以具有相同的名称。
本节描述创建触发器
语法。有关其他讨论,请参见第25.3.1节“触发器语法和示例”.
创建触发器
要求触发
与触发器关联的表的特权。如果定义者
子句存在时,所需的特权取决于用户
价值,如在第25.6节,“存储对象访问控制”.如果启用了二进制日志记录,创建触发器
可能需要超级
特权,如在第25.7节“存储程序二进制日志记录”.
的定义者
子句确定在触发器激活时检查访问特权时要使用的安全上下文,如本节后面所述。
trigger_time
是触发动作时间。它可以是之前
或后
指示触发器在要修改的每一行之前或之后激活。
基本列值检查发生在触发器激活之前,因此不能使用之前
触发器将不适合列类型的值转换为有效值。
trigger_event
指示激活触发器的操作类型。这些trigger_event
允许的值:
的trigger_event
并不表示激活触发器的SQL语句的文字类型,而是表示表操作的类型。例如,插入
触发器激活的不仅仅是插入
声明,但也加载数据
语句,因为这两个语句都将行插入到表中。
一个可能令人困惑的例子是插入…重复密钥更新…
语法:之前插入
触发器为每一行激活,然后是后插入
触发或同时触发在更新之前
而且后更新
触发器,这取决于该行是否有重复的键。
级联外键动作不会激活触发器。
可以为具有相同触发器事件和操作时间的给定表定义多个触发器。例如,你可以有两个在更新之前
表的触发器。默认情况下,具有相同触发事件和操作时间的触发器按创建的顺序激活。要影响触发器顺序,请指定atrigger_order
指示遵循
或之前
以及具有相同触发事件和动作时间的现有触发器的名称。与遵循
,新触发器在现有触发器之后激活。与之前
,新触发在现有触发之前激活。
trigger_body
是触发器激活时要执行的语句。方法可执行多条语句开始……结束
复合语句结构。这还使您能够使用存储例程中允许使用的相同语句。看到第13.6.1节,“开始…复合语句".有些语句在触发器中是不允许的;看到第25.8节,“存储程序的限制”.
在触发器主体内,可以使用别名引用主题表(与触发器关联的表)中的列老
而且新
.老了。
指更新或删除现有行的列之前的列。col_name
新的。
引用要插入的新行或更新后的现有行的列。col_name
触发器不能使用新的。
或使用col_name
老了。
引用生成的列。有关已生成列的信息,请参见第13.1.20.8节“创建表和生成的列”.col_name
MySQL存储sql_mode
系统变量设置在触发器创建时生效,并且总是在此设置生效时执行触发器主体,不管触发器开始执行时的当前服务器SQL模式是什么.
的定义者
子句指定在触发器激活时检查访问权限时要使用的MySQL帐户。如果定义者
从句是存在的用户
值应该是MySQL帐户指定为'
,user_name
“@”host_name
'CURRENT_USER
,或CURRENT_USER ()
.允许用户
值取决于您持有的特权,如中所讨论的第25.6节,“存储对象访问控制”.有关触发器安全性的其他信息,请参见该部分。
如果定义者
子句时,默认定义者是执行创建触发器
声明。这与指定是一样的Definer = current_user
明确。
MySQL采用定义者
当检查触发器权限时,用户进入帐户如下:
在触发器体中CURRENT_USER
函数返回在触发器激活时用于检查特权的帐户。这是定义者
用户,而不是触发触发的用户。有关触发器内用户审计的信息,请参见第6.2.22节,“基于sql的帐户活动审计”.
如果你使用锁表
要锁定具有触发器的表,触发器中使用的表也会被锁定,如中所述锁表和触发器.
有关触发器使用的其他讨论,请参见第25.3.1节“触发器语法和示例”.