SQL-SERVER是一种关系型数据库管理系统,可以与WINDOWS平台紧密集成,以一种简单的方式来完成各类复杂的任务。SQL-SERVER管 理大量数据,容许大量用户进行并发访问,维护数据的完整性和安全性。本文正是从游标、存储过程、触发器三个方面论述SQL-SERVER高效处理数据的方法。数据库
1 SQL-SERVER数据库简介 SQL-SERVER是一个功能完备而强大的数据库管理系统。在SQL-SERVER中,数据和程序被划分为不一样的逻辑组件,称为数据库对象,经过访问和管理数据库对象来访问和管理SQL-SERVER中的信息。表是SQL-SERVER中的最重要的数据库对象。数据库被存储在一个或者多个数据库文件中。关系数据库系统是让用户用语句来得到和修改与实体相关的信息。全部的主流数据库都支持用标准的SQL语言来做业。 2 SQL-SERVER数据库中的游标、存储过程、触发器 2.1 游标的做用、功能及其优势 SQL-SERVER中的“游标”是一种数据库对象,应用程序用它来对结果集实行“行集”操做。 SQL-SERVER支持CLIENT游标、API SERVER游标和T-SQL游标。T-SQL游标和其它种类的游标区别是:T-SQL游标在存储过程、批处理、函数、或触发器中使用,用于重复对光标每一行的定制的处理。其它种类的游标被设计用于从客户应用程序中访问数据库信息。本文以T-SQL游标为例。 下面,声明一个FORWARD_ONLY游标,该游标容许对其数据进行修改。在查询分析器中执行下列语句: DECLARE JobsCursor CURSOR FORWARD_ONLY FOR SELECT * FROM jobs WHERE min_lvl=75 FOR UPDATE OPEN JobsCursor FET CH JobsCursor UPDATE jobs SET max_lvl=100 WHERE CURRENT OF JobsCursor SELECT * FROM jobs WHERE min_lvl=75 CLOSE JobsCursor DEALLOCATE JobsCursor 游标的优势: 游标的这种行集设计方法是处理数据的一个强有力的工具。 2.2 存储过程的做用、功能及其优势 SQL-SERVER中的“存储过程”是一组预编译的SQL语句。T-SQL语句是充当SQL-SERVER数据库和用户应用程序间的编程接口。存储和执行T-SQL程序的方法有两种,一种是本地存储程序,另外一种是将程序存储为SQL-SERVER中的“存储过程”,而后建立应用程序执行存储过程。 经过编写存储过程来运行常常执行的管理任务,或者应用复杂的业务规则。SQL-SERVER中的存储过程分为“系统存储过程”和“用户定义的存储过程”。系统存储过程用以管理SQL-SERVER和显示有关数据库和用户的信息,系统存储过程充当从系统表中检索信息的快捷方式,如:sp-stored-procedures列出当前环境中的全部存储过程。 SQL-SERVER存储过程具备如下几点功能: a. 经过输入,输出参数与调用程序通信; b. 返回一个称为返回代码的整型值,以代表过程的执行状态; c. 具备方便的从新编译其过程的方法,用EXECUTE与WITH RECOMPILE 子句; 下面,声明一个简单的存储过程。在查询分析器中执行下列语句: create procedure ss @intvalue1 int,@intvalue2 int,@inttotal int output as select @inttotal=@intvalue1+@intvalue2 go declare @inttotal int exec ss 15,9, @inttotal output print ‘the total of 15 and 9 is’+convert(char(8), @inttotal) 执行结果为:the total of 15 and 9 is 25 存储过程具备如下优势: a. 容许模块化程序设计。 b. 只需建立过程一次并将其存储在数据库中,之后便可在程序中调用该过程任意次。存储过程可独立于程序源代码而单独修改。 c. 运行速度快。存储过程将比T-SQL批代码的执行要快。存储过程是被编译后存放在数据库服务器的过程高速缓存中,当使用时,服务器没必要再从新分析和编译它们。 d. 减小网络流量。在网络中要发送的数百行代码,可由一条执行其过程代码的一条单独语句就可实现。 e. 有安全机制。可授予没有直接执行存储过程当中语句的权限的用户,也可执行该存储过程的权限。另外能够防止用户直接访问表,强制用户使用存储过程执行特定的任务。 2.3 触发器的做用、功能及其优势 SQL-SERVER中的“触发器”是一种强制业务规则和数据完整性的一种类型机制,它是一种特殊类型的存储过程。SQL-SERVER有两种类型的触发器:“AFTER触发器”和 “INSTEAD OF触发器”。 触发器具备如下几点功能: a. 以“侦测”数据库内的操做,确保输入表中的数据的有效性; b. 实现“层叠删除” ,如在表INVENTORY和INVENTORY PROPERTY之间不存在外键,但用一个触发器能够监视INVENTORY表中记录的删除状况,及另外一个表与之有关联的记录; c. 访问“INSERTED表”和”DELETED表中的内容。如对更新类型触发器的表来说,将在“删除表”中存放旧值,而在“插入表”中存放新值。删除表和插入表是每一个触发器都有的两个特殊的虚拟表,这两个表是逻辑表,并动态存贮在内存中; 下面,将建立一个UPDATE触发器,以确保PRODUCTS表中现有的UnitsOnOrder和ReorderLevel列不会被修改成小于10的值。每次执行此操做时,都执行该触发器。如下是在查询分析器中实现的T-SQL块: CREATE TRIGGER CheckProductUpdate ON Products For UPDATE AS IF((SELECT UnitsOnOrder FROM INSERTED)<10) OR((SELECT ReorderLevel FROM INSERTED)<10) BEGIN PRINT ‘错误,不能小于10!’ ROLLBACK TRANSACTION END 执行下面的语句: UPDATE Products SET UnitsOnOrder=5 WHERE ProductID=5 执行结果为:错误,不能小于10! 保证了UnitsOnOrder和ReorderLevel列不会被修改成小于10的值。 d. “INSEAD OF触发器”提供了基于联接条件的视图所“不支持”的数据删除操做。INSTEAD OF触发器能够基于一个数据修改操做。这是SQL-SERVER触发器的另外一个重要功能之一; 下面建立一个基于employee表和publisher表的视图,要使对此视图进行更新,必须经过INSTEAD OF触发器来删除数据。 如下是在查询分析器中的T-SQL块: CREATE VIEW Emp_pub As SELECT emp_id,lname,job_id,pub_name FROM employee e,publishers p WHERE e.pub_id=p.pub_id CREATE TRIGGER del_emp ON Emp_pub INSERTED OF DELETE AS DELETE employee WHERE emp_id IN (SELECT emp_id FROM DELETED) 执行下面的语句,删除数据。 DELETE Emp_pub WHERE emp_id=’POK93028M’ e. 触发器与存储过程相似,亦可进行加密处理。以保证代码的安全。 触发器的优缺点:触发器经常使用于强制业务规则和数据完整性的强大工具。据资料分析,提倡简化使用触发器,没有必要使代码太复杂而让人费解。也不要太多使用触发器,由于触发器的执行,高度和管理很复杂。 3 游标、存储过程、触发器三者的联系 SQL-SERVER数据库中的游标、存储过程、触发器三者从不一样方面提升了数据处理能力。参见下面的图1. 触发器是一种特殊类型的存储过程,它主要是经过事件进行触发而被执行的,而存储过程是经过存储过程的名字而被直接调用;游标可提供脚本,存储过程和触发器中使用的访问结果集中的数据的T-SQL语句。 图1 高效处理数据图 4 结 论 SQL-SERVER是一个关系数据库,用于各类企业组织及专业数据库和应用开发环境中。能迅速地设计和开发客户/服务器。 游标的行集操做设计方法是一个强有力的工具,要合理使用游标。游标主要用于实现一些不能使用面向集合的语句实现的操做。 T-SQL的存储过程的功能强大,甚至能够实现最复杂的商业事务,存储过程结合了过程和非过程两种方法。具备通信、模块设计、执行快等优势。 “触发器”是一种强制业务规则和数据完整性的一种类型机制,它是一种特殊类型的存储过程。触发器中的两个虚拟表及SQL-SERVER 2000新应用的INSEAD OF 触发器都是SQL-SERVER中强制业务规则的强有力工具。 总之,SQL-SERVER中的游标、存储过程和触发器是SQL-SERVER数据库灵魂的三个重要方面。另外,它们 “高效处理数据库中数据”的方法,是学习其它数据库的一个重要启示!