首页 > 范文大全 > 正文

关于MySQL数据库中触发器的学习探讨

开篇:润墨网以专业的文秘视角,为您筛选了一篇关于MySQL数据库中触发器的学习探讨范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要: 触发器是一种特殊的存储过程,是数据库强制业务规则和控制数据完整性的一种主要方法。探讨了在MySQL数据库中通过触发器技术实现数据完整性控制机制,重点讨论了MySQL数据库中触发器的工作原理与实现过程,结合实例分析设计触发器的基本步骤。针对触发器这一数据库学习中的重点和难点,给出了在MySQL数据库中对触发器的理解和使用方法。

关键词: 数据库; 完整性; 触发器; MySQL

中图分类号:TP311 文献标志码:A 文章编号:1006-8228(2014)04-66-03

Abstract: The trigger is a special storing procedure, and a major method to force the business rules and control the data integrity. The control mechanism of data integrity according to trigger technology in MySQL is discussed, mainly work principle and implementation process with examples of analysis and design. In connection with the emphasis and difficulty of trigger in database learning, the understanding and using introduction of trigger in MySQL are given.

Key words: database; integrity; trigger; MySQL

0 引言

随着计算机技术的发展,数据已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。数据库技术已经成为计算机信息系统与应用系统的核心技术和重要基础。数据库是一门理论与实践紧密结合的课程,它作为计算机及相关专业的骨干课程,在教学中占有重要的位置[1]。触发器是这门课程中的一个重点,触发器的灵活性增加了学生学习的难度,是该门课程的难点之一[2]。

触发器是与表事件相关联的特殊存储过程,它们不能直接执行,只在发生针对表的insert、update、delete事件时触发。用户不能绕过触发器,除非触发器向客户端发送消息,否则最终用户将不会意识到触发器的存在。

触发器的开发涉及多种SQL技术。要开发出良好的触发器,必须理解事务的流程和锁定、SQL以及存储过程。触发器包含几个独特的元素,开发人员必须对其进行仔细规划,并通过触发器实现复杂的业务规则和数据验证功能。

有些DBA反对使用触发器,因为它们是专用的。如果将数据库移植到其他平台,必须重写大部分触发器代码。另外,触发器还被指责影响性能。然而,如果规则过于复杂,无法使用约束来实现,则只能使用触发器来实现。业务规则在服务器外实现就不是规则了,而只是建议。设计糟糕的触发器将影响性能,但设计良好的触发器不但可以确保数据完整性,还能提供良好的性能[3]。

1 基本概念

触发发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。与存储过程不同的是,存储过程通过其他程序来启动运行,而触发器由一个事件来启动运行,并且触发器不能接收参数[4]。

数据库触发器有以下作用。

⑴ 安全性:可以基于数据库的值使用户具有操作数据库的某种权利。

⑵ 审计:可以跟踪用户对数据库的操作,审计用户操作数据库的语句,把用户对数据库的更新写入审计表。

⑶ 实现复杂的数据完整性规则:实现非标准的数据完整性检查和约束,触发器可产生比规则更为复杂的限制,与规则不同,触发器可以引用列或数据库对象。例如,触发器可以回退任何借出去的书超过库存的数量。

⑷ 实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。

⑸ 同步实时地复制表中的数据。

⑹ 自动计算数据值。如果数据的值达到了一定的要求,则进行特定的处理。例如,某本书的库存低于一定指标,则立刻向图书管理员发出警告数据。

2 创建触发器

只有具备super权限的MySQL用户才能执行创建触发器的命令。创建触发器命令格式如下:

CREATE TRIGGER trigger_name BEFORE|AFTER

INSERT|UPDATE|DELETE ON table_name FOR

EACH ROW CODE.

触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发器与命名为table_name的表相关,table_name必须引用永久性表,MySQL中不能将触发器与TYEMPORARY表或视图关联起来。

{ BEFORE | AFTER }:触发器有执行的时间设置,可以设置为事件发生前或后。

{ INSERT | UPDATE | DELETE }:同样也能设定触发的事件,它们可以在执行INSERT、UPDATE或DELETE的过程中触发。

FOR EACH ROW:触发器的执行间隔,FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

触发器的触发事件可以是下列三种之一。

⑴ INSERT:将新行插入表时激活触发器程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

⑵ UPDATE:更改某一行时激活触发器,例如,通过UPDATE语句。

⑶ DELETE:从表中删除某一行时激活触发器,例如,通过DELETE和REPLACE语句。

请注意,触发事件与表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFRORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。

对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一张表,不能有两个BEFORE UPDATE触发程序。但可以有一个BEFORE UPDATE触发程序和一个BEFORE INSERT触发程序,或一个BEFORE UPDATE触发程序和一个AFTER UPDATE触发程序。

CODE是当触发程序激活时执行的语句。如果打算执行多个语句,可使用BEGIN…END复合语句结构。这样,就能使用存储子程序中允许的相同语句了。

另外,触发器执行的语句有以下两个限制。

限制⑴:触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过OUT或者INOUT类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。

限制⑵:不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或者ROLLBACK。

3 删除触发器

目前,并没有ALTER TRIGGER语句,不过可以先使用DROP TRIGGER语句(删除触发器),然后再使用CREATE TRIGGERA语句创建一个新的触发器。

删除触发器的命令格式如下:

DROP TRIGGER[IF EXISTS] trigger_name

这条语句用于删除触发器。当触发器不存在时,使用关键字IF EXISTS可以避免出现出错信息。若不使用该关键字,它会生成一个注释,在执行SHOW WARNINGS语句后,可以显示该注释。可以指定与触发器关联的数据库或模式。如果不指定,将使用当前默认数据库。从mysql5.1.6版本开始,该语句需要具有与给定触发器相关的表的TRIGGER权限,方能执行。在以前的MySQL版本中,它仅需要SUPER权限即可执行该语句。如果对MySQL5.0.10版本或更老版本升级时,请确保删除它的所有触发器,因为使用旧版本的触发器会带来问题。

4 OLD和NEW

NEW.column_name或者OLD.column_name,这样在技术上处理(NEW|OLD.column_name)新和旧的列名属于创建了过渡变量("transition variables")。对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE语句可以同时使用NEW和OLD。

5 触发器在图书管理系统中的应用

触发器程序将用到以下三张表:

⑴ Publiser(pub_id,pub_name,pub_tel,pub_web, pub_addr)

出版社(出版社_id,出版社名,电话,网址,地址)

⑵ Borrow_book(borrow_id,out_date,in_date,renew_count,renew_date,over_time,over_payment)

借阅(借阅_id,借出日期,归还日期,续借次数,续借日期,超期时间,超期费用)

⑶ Reader(reader_id,user,password,create_date,name,borrow_count)

读者(借书证号,用户名,密码,注册日期,姓名,借阅数量)

例1 当从publiser表中更新数据时,希望向另两个表中写入数据,保存更新前后的信息。

新建两张与publiser结构一样的表old_publiser与new_publisher。

DELIMITER |

CREATE TRIGGER tri_publisher_update

AFTER UPDATE

ON publisher FOR EACH ROW

/*保存更新前的信息*/

BEGIN

INSERT INTO old_publisher

(pub_id,pub_name,pub_tel,pub_web, pub_addr)

VALUES

(OLD.pub_id,OLD.pub_name,OLD.pub_tel,OLD.pub_web,

OLD.pub_addr);

/*保存更新后的信息*/

INSERT INTO new_publisher

(pub_id,pub_name,pub_tel,pub_web, pub_addr)

VALUES

(NEW.pub_id,NEW.pub_name,NEW.pub_tel,NEW.pub_web,

NEW.pub_addr);

END |

DELIMITER;

验证该触发器:

UPDATE publisher SET pub_tel=’010-6832629

4’ WHERE pub_id='P00002';

SELECT * FROM old_publisher;

SELECT * FROM new_publisher;

例2 借书触发器

DELIMITER |

CREATE TRIGGER tri_borrow_book_insertli

AFTER INSERT ON borrow_book

FOR EACH ROW

/*借书在borrow_book表插入新纪录时,自动更新读者表的已借数量*/

BEGIN

UPDATE reader SET borrow_count=borrow_count+1

WHERE reader_id=NEW.reader_id;

END |

DELIMITER;

例3 还书触发器

DELIMITER |

CREATE TRIGGER tri_borrow_book_update

AFTER UPDATE ON borrow_book

FOR EACH ROW

/*还书时更新borrow_book 表时,自动更新读者表的已借数量*/

BEGIN

IF ISNULL(OLD.return_date) AND NOT ISNULL

(NEW.return_date) THEN

UPDATE reader SET borrow_count=borrow_count-1

WHERE reader_id=NEW.reader_id;

END IF;

END |

DELIMITER;

6 结束语

本文从理论教学和实践教学两个方面对MySQL数据库中触发器的实现进行了探讨,并应用到了浙江农林大学数据库类课程的教学当中。实践表明该方法提高了学生对MySQL触发器学习的积极性,使他们能轻松掌握触发器的实现过程。教学效果和学生的学习效率得到了提高。

参考文献:

[1] 吴达胜,刘丽娟.《数据库原理与技术》的理论与实践教学的整体优化研究[J].计算机时代,2005.11:31-32

[2] 刘丽娟,吴达胜.滚动式分层教学在数据库课程中的应用[J].科技信息,2009.36:127-130

[3] 吕刚,蒋勇铭,马少恒.浅析SQL Server触发器的应用[J].信息与电脑,2012.10:109-110

[4] 兰萍.SQLServer触发器在数据完整性和安全方面的应用[J].电脑编程技巧与维护,2013.2:23-37