当前位置:首页 > 系统运维 > 正文内容

MySQL触发器的正确使用与案例分析

a8116255316年前 (2010-05-19)系统运维7

以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时该篇文章也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴。

触发器案例

mysql> select * from a; +------+------+------+ 

 

理解上面代码的关键在于CREATE TRIGGER命令,它被用来定义一个新触发器。这个命令建立一个新触发器,假定的名称为t1,每次有一个新记录插入到data表格中时,t1就被激活。

在这个触发器中有两个重要的子句:

AFTER INSERT子句表明触发器在新记录插入data表格后激活。

UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)子句表示触发器激活后执行的SQL命令。在本例中,该命令表明用新插入的data.name域的字符数来更新 chars.count栏。这一信息可通过内置的MySQL函数CHAR_LENGTH()获得。

放在源表格域名前面的NEW关键字也值得注意。这个关键字表明触发器应考虑域的new值(也就是说,刚 *** 入到域中的值)。MySQL还支持相应的OLD前缀,可用它来指域以前的值。

你可以通过调用SHOW TRIGGER命令来检查触发器是否被激活。

mysql> SHOW TRIGGERS; *************************** 

1. row *************************** 

Trigger: t1  Event: INSERT  Table: data statement: 

UPDATE chars SET countcount = count + CHAR_LENGTH(NEW.name) 

Timing: AFTER  Created: NULL ql_mode: 1 row in set (0.01 sec)  

激活触发器后,开始对它进行测试。试着在data表格中插入几个记录:

mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane'); 

Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 

然后检查chars表格看MySQL触发器是否完成它该完成的任务:

mysql> SELECT * FROM chars; +-------+ 

| count | +-------+ | 7| +-------+ 1 row in set (0.00 sec) 

如你所见,data表格中的INSERT命令激活触发器,它计算插入记录的字符数,并将结果存储在chars表格中。如果你往data表格中增加另外的记录,chars.count值也会相应增加。

触发器应用完毕后,可有DROP TRIGGER命令轻松删除它。

mysql> DROP TRIGGER t1; Query OK, 0 rows affected (0.00 sec) 

注意:理想情况下,你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数。这很容易做到,你可以把它当作练习来完成。提示:应用BEFORE DELETE ON子句是其中一种 *** 。

自写(已测试)

mysql> create trigger t2 before delete on 

data for each row update chars set countcount=count-char_length(old.name); 

Query OK, 0 rows affected (0.03 sec) 

现在,我想建立一个审计记录来追踪对这个表格所做的改变。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间。我需要建立一个新表格来存储这一信息(表格名:audit),如下所示。(列表C)

列表C

mysql> CREATE TABLE audit (id INT(7), balance FLOAT, 

user VARCHAR(50) NOT NULL, time TIMESTAMP NOT NULL); 

Query OK, 0 rows affected (0.09 sec) 

mysql> create table accounts(id int(7),label VARCHAR(45),balance float); 

接下来,我将在accounts表格中定义一个MySQL触发器。(列表D)

列表D

mysql> CREATE TRIGGER t3 AFTER UPDATE ON accounts 

FOR EACH ROW INSERT INTO audit (id, balance, user, time) 

VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()); 

Query OK, 0 rows affected (0.04 sec) 

如果你已经走到这一步,就很容易理解。accounts表格每经历一次UPDATE,触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称。

实现中的例子:用触发器审计记录

既然你了解了触发器的基本原理,让我们来看一个稍稍复杂的例子。我们常用触发器来建立一个自动“审计记录”,以记录各种用户对数据库的更改。为了解审计记录的实际应用,请看下面的表格(表格名:accounts),它列出了一个用户的三个银行账户余额。(表A)

表A

mysql> SELECT * FROM accounts; +----+------------+---------+ 

| id | label| balance | +----+------------+---------+ 

|1 | Savings #1 |500 | |2 | Current #1 |2000 | |3 | 

Current #2 |3500 | +----+------------+---------+ 3 rows in set (0.00 sec) 

然后,检查触发器是否被激活:

mysql> SHOW TRIGGERS ; *************************** 

1. row ***************************  Trigger: t1  Event: 

UPDATE  Table: accounts Statement: INSERT INTO audit (id, balance, user, time) 

VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW()) Timing: AFTER  Created: NULL Sql_mode: 1 row in set (0.01 sec) 

再来看最后的结果(列表E):

列表E

balance = 900 WHERE id = 3; Query OK, 1 row affected 

(0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> 

UPDATE accounts SET balance = 1900 WHERE id = 1; Query OK, 

1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0  

注意,对accounts表格所作的改变已被记录到audit表格中,将来如果出现问题,我们可以方便地从中进行恢复。

mysql> SELECT * FROM audit; +------+---------+----------------+---------------------+ 

| id| balance | user| time| +------+---------+----------------+---------------------+ 

|1 |500 | chinastor.com-root@localhost | 2006-04-22 12:52:15 | |3 |900 | chinastor.com-root@localhost | 2006-04-22 12:53:15 

| |1 |1900 | chinastor.com-root@localhost | 2006-04-22 12:53:23 | +------+---------+----------------+---------------------+ 3 rows in set (0.00 sec)  

如上面的例子所示,MySQL触发器是一个强大的新功能,它大大增强了RDBMS的自动化程度。自己去试验,练习吧!

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/20413.html

分享给朋友:

“MySQL触发器的正确使用与案例分析” 的相关文章

windows 7查看电脑近期使用情况确定有没有被他人使用

windows 7查看电脑近期使用情况确定有没有被他人使用

我一个朋友最近装装了Windows 7,他总感觉有人用了他的电脑,但是一直不确定,他想知道有没有人动用他的电脑,问我有没有办法 我说设置一下就行了: 启动Windows 7,在搜索栏中输入编辑组,马上就搜索到了编辑组策略,点击即可启动程序编辑组策略。依次展开组策略左侧树形列表的计算机配置/管理模...

微软今天正式停止对windows 7的主流支持

微软今天正式停止对windows 7的主流支持

北京时间1月13日消息,根据计划,微软将于2015年1月13日正式结束对Windows 7SP1的“主流支持”,而这也标志着“扩展支持”阶段的开始,这个阶段将于2020年1月14日结束。 2013年10月份,微软终止销售独立的Windows 7系统安装包,并要求制造商于2014年10月份停止生...

Skylake平台不能通过USB接口装windows 7系统

Skylake平台不能通过USB接口装windows 7系统

Intel会在2015年推出Broadwell、Skylake两代14nm处理器,前者可以使用9系芯片组,Skylake升级到了LGA1151插槽,需要搭配新的100系列芯片组,但初期的Skylake-S又不能超倍频,所以今年Q2季度开始会很混杂。Skylake一代会支持DDR4,100系列芯片组升...

windows 7系统开机后出现黑屏提示Windows无法启动

windows 7系统开机后出现黑屏提示Windows无法启动

一些用户的Windows 7系统开机后出现黑屏,代码为 Windows无法启动: WindowsSystem32ConfigSystem”。这个问题该如何修复呢?现在小编就给大家分析一下吧。 其实这个代码的意思是引导文件丢失了,引导文件(NTLDR)一般存放于C盘根目录下,是一个具有隐藏和只读属性...

windows 7旗舰版系统提示应用程序错误代码0xc0000409的故障原因

windows 7旗舰版系统提示应用程序错误代码0xc0000409的故障原因

问题现象,具体如下所示:  故障分析: 一般来说,出现这种情况是因为电脑误删系统文件或者是系统文件被顽固木马破坏。       解决方法: 1、下载360安全卫士,找到里面的急救箱开始急救,然后进行修复,完成后重新启动; 2、下载瑞...

windows 7系统下Windows服务被流氓软件注册怎么办?Windows服务

windows 7系统下Windows服务被流氓软件注册怎么办?Windows服务

解决方法: 其实处理这些使用流氓软件,需要将相关的.exe文件删除,使它不能再运行,或者直接清除这个服务本身,使计算机重启的时候,它不会再启动。比如Hijackthis扫描,在扫描日志中,一般会把非Windows系统的服务以023的方式列出来,如下面这段: O23 - ...