Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103780932
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Mysql/postgreSQL

2008-04-19 23:23:02

 

  MySQL 从5.0.2版开始引入触发器,触发器就是一个已命名的数据库对象,这个对象和某张表相关,而且当这张表发生某种特定事件后,触发器将被激活执行相应的动作,触发器允许这些动作在这张表中的一行或多行的数据被操作的前后执行。在流行业务系统的处理过程中,开发和管理人员可以用触发器来实现数据审计和其他安全相关的功能,如在运行中的数据执行加密功能。

  举个例子来说:一个客户数据库中包含客户的社会保险号,企业的安全和审计人员必须将这些信息加密后存入磁盘。针对这种情况,管理员可以通过创建一个触发器来自动获取并加密这些数据然后再插入相应的数据库表中。如下所示:

  mysql> delimiter // 
  mysql> create trigger t_customer_insert before insert on customer
  -> for each row
  -> begin 
  -> set NEW.customer_ssn = aes_encrypt(NEW.customer_ssn,'password');
  -> end; 
  -> //
  Query OK, 0 rows affected (0.00 sec)
  mysql> delimiter 

  mysql> insert into customer values (1,'fred','smith','456097234');
  Query OK, 1 row affected (0.00 sec)
  mysql> select * from customer;

  可以看出存在磁盘数据库表中的社会保险号ssn已经变成加密后的不可读乱码格式。

  另外MySQL5也引进了对游标的支持,在第一个发行版本中游标有向前翻阅结果集和不可执行数据更新语句的特点。游标可以用在MySQL5的新编码对象,如存储过程和触发器,甚至是独立的存储过程逻辑块中。以下是一个在存储过程中的使用游标的简单例子:

  mysql> delimiter // 
  mysql> CREATE PROCEDURE cursor_demo()
  -> BEGIN 
  -> DECLARE a, b CHAR(16); 
  -> DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  -> OPEN cur1; 
  -> REPEAT 
  -> FETCH cur1 INTO a,b;
  -> UNDONE END REPEAT;
  -> CLOSE cur1; 
  -> END
  -> //

  下面再举一个触发器的例子,该例子可以计算所有插入某表的某个列中的数值的和:

  mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
  mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
  -> FOR EACH ROW SET @sum = @sum + NEW.amount;

  可见触发器功能可以提高管理人员管理数据库的灵活性。
阅读(520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~