首页 >  应用与开发  >  数据库

浅谈SQL-SERVER数据库中的游标、存储过程和触发器

作者:刘俊姝   发布日期:2010-06-08 

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
FETCH 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语句。
                                                                                                                                                                                                                                                          &n