暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据定义语句(16)- CREATE TRIGGER 语句

林员外聊编程 2020-08-25
166
CREATE TRIGGER 语句
 
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: 每当在表中插入新行(例如,通过 INSERTLOAD 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 用户检查权限。该用户必须具有以下权限:
 
■ 主题表的 TRIGGER 权限。
 
■ 如果在触发器主体中使用 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
 

文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论