li
  当前位置:主页 > 基础知识 > 文章内容
li
教你如何使用触发器管理MySQL数据库(2)
来源: www.ixdba.net  作者: ixdba.net技术社区    时间:2008-03-23   阅读:2  
本文章共3266字,分3页,当前第2页,快速翻页:
 

  触发器应用完毕后,可有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 |



阅读更多内容<<上一页 · 1 · 2 · 3 · 下一页>>


  上一篇: 用新的PHP插件实现MySQL为基础的...   下一篇: 在MySQL中获得更好的全文搜索结果
li
 §相关评论  
 热点文章

·RewriteRule重写规则的语法:A
·apache配置文件httpd.conf参数
·Apache的配置文件http.conf参数
·HTTP协议中POST、GET、HEAD等参
·XAMPP命令之LAMPP
·Linux中安装XAMPP(LAMPP)服务器
·网页禁止右键、禁止复制等代码
·java.lang.OutOfMemoryError:
·Mysql数据库在Linux系统常用命
·mysql问答:MySQL数据库连接过多
·MySQL数据库中Show命令的用法
li
 编辑推荐
·RewriteRule重写规则的语法:A
·apache配置文件httpd.conf参数
·Apache的配置文件http.conf参数
·HTTP协议中POST、GET、HEAD等参
·XAMPP命令之LAMPP
·Linux中安装XAMPP(LAMPP)服务器
·网页禁止右键、禁止复制等代码
·java.lang.OutOfMemoryError:
·Mysql数据库在Linux系统常用命
·mysql问答:MySQL数据库连接过多
·MySQL数据库中Show命令的用法
li
 相关篇章
·用新的PHP插件实现MySQL为基础的...
·保护MySQL数据库中重要的数据注意...
·教你编写高质量、高性能的MySQL语...
·用Apache与MySQL整合实现基本身份...
·MySQL 4.1数据库中数据转换注意事...
·用Perl DBI连接MySQL数据库
·优化MySQL数据库查询的三种方法简...
·六大步保护MySQL数据库中重要数据
·如何修改遗失的MySQL的ROOT用户密...
·通过PHP连接My SQL的两种方法简介
·在MySQL中获得更好的全文搜索结果
·关于MySQL数据库的用户认证系统分...
·通过数据库引擎来加速MySQL数据库
·针对于MySQL新增的复制特性的测试
·关于MySQL数据库的存储引擎详细介...
·SQL Server数据库导入MySQL数据库...
·MySQL服务器内部安全数据目录访问
·MySQL数据库应该如何对抗解密高手
·利用图形界面从SQL导入导出到MyS...
·如何使用MySQL系统的发布与安装
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接