手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mysql>列表

妙用触发器有效管理MySQL数据库

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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

  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)

  接下来,我将在accounts表格中定义一个触发器。

  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)

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

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

  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 \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)

  再来看最后的结果:

  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

  注意,对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)

  如上面的例子所示,触发器是个强大的新功能,他大大增强了RDBMS的自动化程度。


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!