mysql的触发器怎么做 mysql触发器工作原理( 二 )


触发器应用完毕后,可有DROP TRIGGER命令轻松删除它 。
mysql DROP TRIGGER t1;
Query OK, 0 rows affected (0.00 sec)
注意:理想情况下 , 你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数 。这很容易做到,你可以把它当作练习来完成 。提示:应用BEFORE DELETE ON子句是其中一种方法 。
现在,要建立一个审计记录来追踪对这个表格所做的改变 。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间 。需要建立一个新表格来存储这一信息(表格名:audit),如下所示 。(列表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)
列表C
接下来,我将在accounts表格中定义一个触发器 。(列表D)
mysql CREATE TRIGGER t1 AFTER UPDATEON 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)
列表D
要是已经走到这一步,就很容易理解 。accounts表格每经历一次UPDATE , 触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称 。
实现中的例子:用触发器审计记录
既然了触发器的基本原理 , 来看一个稍稍复杂的例子 。常用触发器来建立一个自动“审计记录”,以记录各种用户对数据库的更改 。为了解审计记录的实际应用,请看下面的表格(表格名:accounts),它列出了一个用户的三个银行账户余额 。(表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)
表A
然后 , 检查触发器是否被激活:
mysql SHOW TRIGGERS \G
*************************** 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):
mysql UPDATE accounts SET balance = 500 WHERE id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1?Changed: 1?Warnings: 0
mysql UPDATE accounts SET 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
列表E
注意,对accounts表格所作的改变已被记录到audit表格中,将来如果出现问题 , 可以方便地从中进行恢复 。
mysql SELECT * FROM audit;
+------+---------+----------------+---------------------+
| id| balance | user| time|
+------+---------+----------------+---------------------+
|1 |500 | root@localhost | 2006-04-22 12:52:15 |
|3 |900 | root@localhost | 2006-04-22 12:53:15 |
|1 |1900 | root@localhost | 2006-04-22 12:53:23 |
+------+---------+----------------+---------------------+
3 rows in set (0.00 sec)
在Navicat for MySQL 中怎么创建触发器?将delimiter ; 更改为delimiter //\x0d\x0a如下:\x0d\x0amysql delimiter //\x0d\x0amysql create trigger insertArticle_Trigger after insert on article1\x0d\x0a- for each row\x0d\x0a- begin\x0d\x0a- update board1 set articleCount = articleCount+1 where id=new.bid;\x0d\x0a- end;\x0d\x0a- //\x0d\x0a\x0d\x0a执行如下语句,可查看到board1表articleCount被更改:\x0d\x0amysql delimiter ;\x0d\x0amysql insert into article1 values(1);\x0d\x0a\x0d\x0a其中delimiter作用:\x0d\x0a告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了 。\x0d\x0a默认情况下,delimiter是分号; 。在命令行客户端中,如果有一行命令以分号结束, 那么回车后,mysql将会执行该命令 。但有时候,不希望MySQL这么做 。在为可能输入较多的语句,且语句中包含有分号 。使用delimiter //,这样只有当//出现之后,mysql解释器才会执行这段语句 。详见

推荐阅读