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数据库灵魂的三个重要方面。另外,它们 “高效处理数据库中数据”的方法,是学习其它数据库的一个重要启示!