首页 理论教育MySQL数据库创建触发器功能

MySQL数据库创建触发器功能

【摘要】:如果出现提示使用MySQL 5.1.6之前的版本,则需要SUPER权限才能创建触发器;而从5.1.6开始,账户有TRIGGER权限就可以创建触发器。关于这个前缀及类似前缀的更多信息,请参见补充内容“触发器命名约定”。触发器命名虽然没有要求,但为触发器采用某种命名约定是一个好主意,这样可以更快地确定每个触发器的作用。例如,可以考虑为每个触发器加上如下字符串作为前缀,触发器创建示例中就采用了这种做法。au,在UPDATE查询发生之后执行触发器。

MySQL触发器是使用非常简单的SQL语句创建的。其语法形式如下:

从形式中可以看出,可以指定触发器是在查询之前还是之后执行,应当在记录插入、修改还是删除时发生,还可以确定触发器应用于哪个表。

DEFINER子句确定将查看哪个用户账户来确定是否有适当的权限执行触发器中定义的查询。如果定义了DEFINER子句,需要采用'user'@'host'语法指定用户名和主机名(例如,'jason'@'localhost')。如果使用CURRENT_USER(默认值),就会查看导致执行这个触发器的用户账户的权限。只有拥有SUPER权限的用户才能够为另一个用户指定DEFINER。

如果出现提示使用MySQL 5.1.6之前的版本,则需要SUPER权限才能创建触发器;而从5.1.6开始,账户有TRIGGER权限就可以创建触发器。

下面实现本章前面描述的问讯处触发器:

注解可能不清楚触发器名中的au前缀。关于这个前缀及类似前缀的更多信息,请参见补充内容“触发器命名约定”。

对于被technician表更新所影响的每条记录,此触发器将更新tickets表,如果ticket+technicianID等于更新查询中指定的technicianID值,则将ticket.technicianID设置为0。应该知道,这里使用了查询值,因为在列名前加上了别名NEW。也可以在列名前面加上OLD别名来使用列的原始值。

创建触发器之后,就可以通过向tickets表中插入一些记录,再执行一条UPDATE查询,将技术员的availability列设置为0来进行测试:

现在查看tickets表,将看到原先分配给Jason的两张票证不再分配给他。(www.chuimin.cn)

触发器命名虽然没有要求,但为触发器采用某种命名约定是一个好主意,这样可以更快地确定每个触发器的作用。例如,可以考虑为每个触发器加上如下字符串作为前缀,触发器创建示例中就采用了这种做法。

➢ ad,在DELETE查询发生之后执行触发器。

➢ ai,在INSERT查询发生之后执行触发器。

➢ au,在UPDATE查询发生之后执行触发器。

➢ bd,在DELETE查询发生之前执行触发器。

➢ di,在INSERT查询发生之前执行触发器。

➢ bu,在UPDATE查询发生之前执行触发器。