教学:数据库-存储过程资料(共14篇)
教学:数据库-存储过程资料 篇1
12.3.1 查看存储过程
存储过程被创建以后,它的名字存储在系统表sysobjects 中;它的源代码存放在系统表syscomments 中,可以通过MS SQL Server 提供的系统存储过程来查看关于用户创建的存储过程信息。
1通过Enterprise Manager 管理工具同样可以查看存储过程的源代码
其操作如下:
(1) 启动Enterprise Manager, 登录到要使用的服务器。
(2) 选择要创建存储过程的数据库,在左窗格中单击Stored Procedure 文件夹,此时在右窗格中显示该数据库的所有存储过程。
(3) 在右窗格中,右击要查看源代码的存储过程,在弹出的菜单中选择Properties选项,此时便可看到存储过程的源代码。如图12-4 所示:
2 使用sp_helptext 存储过程查看存储过程的源代码
其语法格式如下:
sp_helptext 存储过程名称
例如要查看数据库pubs 是否是存储过程reptq1 的源代码,则执行sp_helptext reptq1。
注意:如果在创建存储过程时使用了WITH ENCRYPTION选项,那么无论是使用Enterprise Manager还是系统存储过程sp_helptext都无法查看到存储过程的源代码。
12.3.2 重新命名存储过程
修改存储过程的名字使用系统存储过程sp_rename。 其命令格式为:
sp_rename 原存储过程名, 新存储过程名
例12-4 :将存储过程reptq1 修改为newproc 其语句为:
sp_rename reptq1, newproc
另外,通过Enterprise Manager 也可修改存储过程的名字,其操作过程与WINDOWS 下修改文件名字的操作类似。即首先选中需修改名字的存储过程,然后右击鼠标,在弹出菜单中选取rename 选项,最后输入新存储过程的名字。
12.3.3 删除存储过程
删除存储过程使用drop 命令,drop 命令可将一个或多个存储过程或者存储过程组从
当前数据库中删除。其语法规则为:
DROP PROCEDURE {procedure}} [,…n]
例12-5: 如将存储过程reptq1 从数据库中删除,则执行:
drop procedure reptq1
12.3.4 执行存储过程
执行已创建的存储过程使用EXECUTE 命令,其语法如下:
[EXECUTE]
{[@return_statur=]
{procedure_name[;number] | @procedure_name_var}
[[@parameter=] {value | @variable [OUTPUT] | [DEFAULT] [,…n]
[WITH RECOMPILE]
各参数的含义如下:
@return_status
是可选的整型变量,用来存储存储过程向调用者返回的值,
@procedure_name_var
是一变量名用来代表存储过程的名字。
其它参数据和保留字的含义与CREATE PROCEDURE 中介绍的一样。
例12-6: 该存储过程被用来将两个字符串连接成一个字符串,并将结果返回。创建存储过程:
12.3.5 修改存储过程
修改以前用CREATE PROCEDURE 命令创建的存储过程,并且不改变权限的授予情况以及不影响任何其它的独立的存储过程或触发器常使用ALTER PROCEDURE 命令。其语法规则是:
ALTER PROC[EDURE] procedure_name [;number]
[ {@parameter data_type } [VARYING] [= default] [OUTPUT]] [,...n]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION}]
[FOR REPLICATION]
AS
sql_statement [...n]
其中各参数和保留字的具体含义请参看CREATE PROCEDURE 命令。
下面将举一个例子使读者对该命令有更为深刻的理解。
将该段代码输入到SQL Server Query Analyzer 窗口中运行后结果为:
注意:由于在ALERT PROCEDURE中使用了WITH ENCTYPTION保留字,所以在查看修改后的存储过程源代码时看到是一些代码。
教学:数据库-存储过程资料 篇2
使用“组装工具”概念引入存储过程
在讲解中,教师可向学生举例,在日常生活中存在这样一种工具,该工具经常会被用到,但是它是由几个零件组装而成。如果将工具提前组装好,需要时直接取出使用,就能极大地提高工作效率,同时也能杜绝因为错误组装造成工作失误。而存储过程就是数据库技术中数据处理的这样一个工具,它是由流程控制语句和SQL语句书写的过程组成,经编译和优化后存储在数据库服务器中以完成特定功能,可以被其他程序调用,用于执行频繁使用的查询、业务规则和其他过程使用的公共例行程序。概念中“流程控制语句、SQL语句”是组件,“编译、优化”是组装,“数据库、服务器”是其存储位置,“被其他程序调用、频繁使用”是其应用场合。
使用“可变组装工具”概念来介绍带参数的存储过程
而在介绍带参数的存储过程时,教师可以举例假设,在保持工具基础不变的情况下,通过调整若干个组件型号的方式来迎合不同的工作对象,这样就让组装工具更加灵活、应用更加广泛,如多用螺丝刀,不同型号的钻头针对不同的螺丝。带参数的存储过程就类似于“多用螺丝刀”,参数就是钻头工具包。参数名是数据表中的字段名,参数值也就是字段对应的、存在于数据表中的值。理解起来就是:钻头必须是螺丝刀的组件,且用到的型号必须存在于工具包中。
结合家用电器的自动调节功能引入触发器
教师在针对触发器的讲解时应明确,触发器包含了存储过程这种工具的基本特性,另外还具备特有的功能。我们知道“电冰箱、空调、洗衣机”等家用电器在满足一定设定条件后才能够完成自动调节功能。触发器就与这些家用电器相似,需要满足一定条件才能触发,从而执行指定操作。例如,电冰箱“达到设定温度”是条件,“停机”是触发结果。触发器创建语法中“insert,update,delete,drop,alter”等关键字就是触发条件,“as”关键字之后的内容就是触发后执行的操作,即触发结果。
案例
下面笔者以“学生成绩管理系统”开发为例,通过实例演示来讲解存储过程的应用。取出数据库中学生基本信息、课程信息、学生成绩三个表,详细信息如下:
学生基本信息表(student):学号(stuno)、姓名(stuname)、班级(class)、状态(state);课程信息表(course):课程号(couno)、课程名(couname);学生成绩表(results):学号(stuno)、课程号(couno)、成绩(score)、状态(state)。三个表之间通过主外键建立数据关系。(注:仅用于方法说明需要)
1.学生成绩查询功能
学生根据学号查询自己的成绩,实现的SQL语句为:“select stuname,class,coun ame,score from student a,course b,results c where a.stuno=c.stuno and b.couno=c.counoand a.stuno=@stuno”@stuno为学号变量。
当不使用存储过程时,是在应用端直接为学号变量赋值后将SQL语句提交给数据库服务器,数据库服务器执行SQL语句,在数据库中找到这些表以及相应的字段后将查询结果返回给应用端这个过程极其浪费时间和资源,违背程序设计的原则。
在使用存储过程时,首先在数据库服务器上创建名为checkresult的存储过程,SQL语句如下:
create procedure check result
@stuno nvarchar(30)--定义学号变量,针对不同学号学生查询
as
select stuname,class,couname,score from student a,course b,results c where a.stuno=c.stuno and b.couno=c.couno and a.stuno=@stuno
go
这样checkresult存储过程就被存储于数据库服务器上,形成一个组装工具,并且可以更换不同型号的组件;存储过程执行结果会以一个虚拟表的形式存在于数据库服务器上。
在应用程序端,调用存储过程:“declare @xh nvarchar(30) set @xh=`应用程序中对应的学号变量值`executecheckresult @xh go”,就可以直接从虚拟表中查询数据,速度快,效率高。
2.学生休学功能
学生申请休学后,将基本信息表中的状态字段(state)修改为休学,同时学生成绩表中对应该学生的成绩状态修改为不可查。SQL语句为:“update studentset state='休学` where stuno=@stuno”、“update results set state='不可查`where stuno=@stuno”,在应用程序端,先执行第一段SQL语句,再执行第二段,就可以实现该功能。不过这样需要与数据库服务器有两次交互,并且必须保证第一段SQL语句正确执行,否则就会造成数据一致性出错。另外,如果学生成绩表中无该生成绩,应用程序还可能报错,这样在应用程序端就需要增加验错功能,给程序员增加了工作量,也同时增加了数据库服务器和应用程序服务器的负担。
在使用触发器时,在数据库服务器端创建触发器suspend,针对学生基本信息表的“修改”操作触发后,针对学生成绩表的状态字段进行自动修改。SQL语句如下:
create trigger suspend
on student--执行修改操作的数据表
after update
as
update results set state='不可查'where stuno=(select stuno from deleted)
go
deleted表是建在数据库服务器的内存中,由系统管理的逻辑表,对于修改记录(update)操作,deleted表里存放的是修改前的记录(修改完成后即被删除);对于删除记录(delete)操作,deleted表里存放的是被删除的旧记录。
教学:数据库-存储过程资料 篇3
【关键词】分级存储;地震资料处理;并行存储;数据备份
一、建设地震资料处理数据分级存储系统的必要性
随着勘探难度增加和技术的发展,野外三维高精度采集的数据量大规模的增长,加之地震资料处理新技术、新方法的应用,地震资料处理对存储系统的存储容量和存储性能有了更高的需求,目前河南油田地震资料处理的存储系统在性能和容量上还有待提高,但是存储系统的设计要考虑容量、速度和成本三个问题。容量是存储系统的基础,都希望配置尽可能大的存储系统;同时要求存储系统的读写速度能与处理器的速度相匹配;成本也应该在一个合适的范围之内。但这三个目标不可能同时达到最优。一般情况下,存储设备读写速度越快,平均单位容量的价格越高,存储容量越小;反之,存储设备读写速度越慢,平均单位容量的价格越低,存储容量越大。
分析地震资料处理的数据流特点,我们发现:
1、在进行叠前时间偏移、深度偏移、逆时偏移等并行作业处理时,数据流表现为高并发IO和大聚合带宽,需要高性能存储系统的支撑。
2、在常规处理中的数据流相对平稳,IO吞吐量相对小,对带宽和存储的性能要求相对较低。
3、需要备份的原始数据及成果数据,需要一定数量安全级别较高的存储系统进行数据备份。
为了在容量、速度和成本这三者之间取得平衡,需要根据其地震资料处理数据的特点,采用分级存储为不同的应用提供不同性能的服务,建成高效实用的并行存储环境。
二、分级存储方案设计
(一)体系架构
地震资料处理数据分级存储系统采用开放式的存储体系架构,基于分布式的Glusterfs并行文件系统,将多台存储设备的存储容量虚拟成一个具有统一访问接口的存储空间。按照一定的负载均衡策略存储用户的数据,将数据条带化的存储到多台物理存储设备上,从而获得更高的并发数据访问性能,同时可以制定存储策略进行数据分级存储,对所有的存储设备可以实现统一的管理和监控。
分级存储系统包含管理控制器、索引控制器、数据控制器和应用服务客户端四类组件:
管理控制器:安装并行存储管理软件,提供统一的控制管理界面,实现存储系统的集中化部署、管理、监控和维护。
索引控制器:内嵌高性能数据索引引擎,管理存储系统的所有索引数据和命名空间,实现全局统一命名空间,实现数据索引的负载均衡和故障冗余。
数据控制器:提供数据存储空间,并实现数据存取的动作。
应用服务客户端:向上层应用提供数据访问接口。
(二)配置方案
整个存储系统包括2台管理控制器、2台索引控制器、22个数据控制器,总容量1197TB。分为三级存储结构:
一部分为高速存储,高速为主要特点,由容量较小、价格较贵而性能较高的SSD固态硬盘构成,为实时提供高性能的数据IO能力;
一部分为在线存储,采用容量较大、价格较便宜而读写速度较慢的SAS硬盘构成,支持一般性数据读写;
一部分为备份存储,采用容量大,价格低廉,读写速度慢的SATA硬盘,创建高安全备份卷,存储我们的原始、阶段性数据、成果数据和磁带库数据备份。
三、关键技术
(一)虚拟化管理平台Ovirt
oVirt是一个基于x86架构上的KVM虚拟化技术的开源云服务平台。它在架构设计上由ovirt-engine和ovirt-node两部分组成,这种Node/Engine分离的结构,方便功能的划分与管理。
Engine是系统的管理者,并对外提供管理服务,它挂载了自己的数据库,记录系统中虚拟机的配置,各个存储节点的状态信息,网络状态等。通过在Engine中的设置实现系统的管理逻辑,状态及策略控制。本存储系统通过在管理控制器上安装ovirt-engine来实现管理功能。
Node只负责功能上的实现,不进行状态的记录和策略的实现。oVirt里的Node可以由一个普通的Linux上安装VDSM(Virtual Desktop Server Manager)构成,也可以由一个专为oVirt定制的Linux系统构成。本存储系统采用安装VDSM的方法配置数据控制器作为node节点,实现网络、存储器、虚拟机的创建与修改。VDSM的功能包括组织数据,实现存储集群的数据共享与数据保护,故障恢复。
(二)GlusterFS集群文件系统
GlusterFS是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS通过TCP/IP或者InfiniBand网络将多个物理存储资源汇聚在一起,使用全局统一命名空间来管理数据。GlusterFS可为各种不同的数据负载提供优异的性能。
GlusterFS文件系统支持标准的网络访问协议,用户可以使用NFS/CIFS等标准协议访问数据。GlusterFS使得用户摆脱原有的独立、高成本的封闭存储系统,利用普通廉价的存储设备也可以部署可拥有集中管理、横向扩展、虚拟化的存储系统。
四、生产应用
地震资料分级存储系统采用的Glusterfs文件系统,支持五种逻辑卷,即Distribute卷(分布式卷)、Stripe卷(条带卷)、Replica卷(镜像卷)、Distribute stripe卷(分布式条带卷)和Distribute replica卷(分布式镜像卷)。分级存储系统搭建完成后,根据地震资料处理需要创建逻辑卷,创建分布式条带卷来满足并行处理作业时高并发IO和大聚合带宽数据流对高性能存储的需要。创建分布式镜像卷作为备份存储卷来存储地震资料原始数据和成果数据,满足数据高安全性的需要。投入生产运行后,多个处理项目使用了该套存储系统进行生产,在项目结束后成果数据直接转移至备份存储卷,回收存储空间。
五、结束语
根据河南油田地震资料处理的数据特点,采用分级存储系统满足地震资料处理中不同应用对存储性能的不同需求,在存储容量、存储速度和成本之间取得了平衡,建成了高效实用的分级存储环境。分级存储系统在存储性能、功能上满足了生产项目的需要,取得了良好的应用效果。
参考文献:
[1]杨传辉 大规模分布式存储系统:原理解析与架构实战 机械工业出版社 2013
[2]G.Somasundaram Alok Shrivastava 信息存储与管理 人民邮电出版社 2013
教学:数据库-存储过程资料 篇4
SQL Server 的扩展存储过程,其实就是一个普通的 Windows DLL,只不过按照某种规则实现了某些函数而已,
编写安全的SQL Server扩展存储过程数据库教程
。
近日在写一个扩展存储过程时,发现再写这类动态库时,还是有一些需要特别注意的地方。之所以会特别注意,是因为DLL运行于SQL Server的地址空间,而SQL Server到底是怎么进行线程调度的,却不是我们能了解的,即便了解也无法控制。
我们写动态库一般是自己用,即便给别人用,也很少像SQL Server这样,一个动态库很有可能加载多次,并且都是加载到一个进程的地址空间中。我们知道,当一个动态库加载到进程的地址空间时,DLL所有全局与局部变量初始化且仅初始化一次,以后再次调用 LoadLibrary函数时,仅仅增加其引用计数而已,那么很显然,假如有一全局 int ,初始化为0,调用一个函数另其自加,此时其值为1,然后再调用LoadLibray,并利用返回的句柄调用输出函数输出该值,虽然调用者觉得自己加载后立即输出,然后该值确实1而不是0。windows是进程独立的,而在线程方面,假如不注意,上面的情况很可能会程序员带来麻烦。
介绍一下我的扩展存储过程,该动态库导出了三个函数: Init,work,Final,Init读文件,存储信息于内存,work简单的只是向该内存检索信息,Final回收内存。如上所说,假如不考虑同一进程空间多次加载问题,两次调用Init将造成无谓的浪费,因为我第一次已经读进了内存,要是通过堆分配内存,还会造成内存泄露。
我使用的引用计数解决的该问题,代码很短,直接贴上来:
#include “stdafx.h”
#include
using namespace std;
extern “C” {
RETCODE __declspec(dllexport) xp_part_init(SRV_PROC *srvproc);
RETCODE __declspec(dllexport) xp_part_process(SRV_PROC *srvproc);
RETCODE __declspec(dllexport) xp_part_finalize(SRV_PROC *srvproc);
}
#define XP_NOERROR 0
#define XP_ERROR 1
HINSTANCE hInst = NULL;
int nRef = 0;
void printError (SRV_PROC *pSrvProc, CHAR* szErrorMsg);
ULONG __GetXpVersion{ return ODS_VERSION;}
SRVRETCODE xp_part_init(SRV_PROC* pSrvProc){
typedef bool (*Func)();
if(nRef == 0){
hInst = ::LoadLibrary(“part.dll”);
if(hInst == NULL){
printError(pSrvProc,“不能加载part.dll”);
return XP_ERROR;
}
Func theFunc = (Func)::GetProcAddress(hInst,“Init”);
if(!theFunc()){
::FreeLibrary(hInst);
printError(pSrvProc,“不能获得分类号与专辑的对应表”);
return XP_ERROR;
}
}
++ nRef;
return (XP_NOERROR);
}
SRVRETCODE xp_part_process(SRV_PROC* pSrvProc){
typedef bool (*Func)(char*);
if(nRef == 0){
printError(pSrvProc,“函数尚未初始化,请首先调用xp_part_init”);
return XP_ERROR;
}
Func theFunc = (Func)::GetProcAddress(hInst,“Get”);
BYTE bType;
ULONG cbMaxLen,cbActualLen;
BOOL fNull;
char szInput[256] = {0};
if (srv_paraminfo(pSrvProc, 1, &bType, (ULONG*)&cbMaxLen, (ULONG*)&cbActualLen, (BYTE*)szInput, &fNull) == FAIL){
printError(pSrvProc,“srv_paraminfo 返回 FAIL”);
return XP_ERROR;
}
szInput[cbActualLen] = 0;
string strInput = szInput;
string strOutput = “;”;
int cur,old = 0;
while(string::npos != (cur = strInput.find(’;’,old)) ){
strncpy(szInput,strInput.c_str() + old,cur - old);
szInput[cur - old] = 0;
ld = cur + 1;
theFunc(szInput);
if(string::npos ==strOutput.find((string)“;” + szInput))
strOutput += szInput;
}
strcpy(szInput,strOutput.c_str());
if (FAIL == srv_paramsetoutput(pSrvProc, 1, (BYTE*)(szInput + 1), strlen(szInput) - 1,FALSE)){
printError (pSrvProc, “srv_paramsetoutput 调用失败”);
return XP_ERROR;
}
srv_senddone(pSrvProc, (SRV_DONE_COUNT | SRV_DONE_MORE), 0, 0);
return XP_NOERROR;
}
SRVRETCODE xp_part_finalize(SRV_PROC* pSrvProc){
typedef void (*Func)();
if(nRef == 0)
return XP_NOERROR;
Func theFunc = (Func)::GetProcAddress(hInst,“Fin”);
if((--nRef) == 0){
theFunc();
::FreeLibrary(hInst);
hInst = NULL;
}
return (XP_NOERROR);
}
我想虽然看上去不是很高明,然而问题应该是解决了的,
还有一点说明,为什么不使用Tls,老实说,我考虑过使用的,因为其实代码是有一点问题的,假如一个用户调用xp_part_init,然后另一个用户也调用xp_part_init,注意我们的存储过程可是服务器端的,然后第一个用户调用xp_part_finalize,那么会怎样,他仍然可以正常使用xp_part_process,这倒无所谓,然而第一个用户调用两次xp_part_finalize,就能够影响第二个用户了,他的xp_part_process将返回错误。
使用Tls 似乎可以解决这问题,例如再添加一个tls_index变量,调用 TlsSetValue保存用户私人数据,TlsGetValue检索私人数据,当xp_part_init时,假如该私人数据为0,执行正常的初始化过程,(即上面的xp_part_init)执行成功后存储私人数据为1,假如是1,直接返回,xp_part_finalize时,假如私人数据为1,则执行正常的xp_part_finalize,然后设私人数据为0,假如是0,直接返回。
教学:数据库-存储过程资料 篇5
因为它比SQL语句执行快.
②存储过程是什么?
把一堆SQL语句罗在一起,还可以根据条件执行不通SQL语句.(AX写作本文时观点)
③来一个最简单的存储过程
CREATE PROCEDURE dbo.testProcedure_AX
AS
select userID from USERS order by userid desc
注:dbo.testProcedure_AX是你创建的存储过程名,可以改为:AXzhz等,别跟关键字冲突就行了.AS下面就是一条SQL语句,不会写SQL语句的请回避.
④我怎么在ASP.NET中调用这个存储过程?
下面黄底的这两行就够使了.
public static string GetCustomerCName(ref ArrayList arrayCName,ref ArrayList arrayID)
{
SqlConnection con=ADConnection.createConnection;
SqlCommand cmd=new SqlCommand(“testProcedure_AX”,con);
cmd.CommandType=CommandType.StoredProcedure;
con.Open();
try
{
SqlDataReader dr=cmd.ExecuteReader();
while(dr.Read())
{
if(dr[0].ToString()==“”)
{
arrayCName.Add(dr[1].ToString());
}
}
con.Close();
return “OK!”;
}
catch(Exception ex)
{
con.Close();
return ex.ToString();
}
}
注:其实就是把以前
SqlCommand cmd=new SqlCommand(“select userID from USERS order by userid desc”,con);
中的SQL语句替换为存储过程名,再把cmd的类型标注为CommandType.StoredProcedure(存储过程)
⑤写个带参数的存储过程吧,上面这个简单得有点惨不忍睹,不过还是蛮实用的.
参数带就带两,一个的没面子,太小家子气了.
CREATE PROCEDURE dbo.AXzhz
/*
这里写注释
*/
@startDate varchar(16),
@endDate varchar(16)
AS
select id from table_AX where commentDateTime>@startDate and commentDateTime
<@endDate order by contentownerid DESC
注:@startDate varchar(16)是声明@startDate 这个变量,多个变量名间用【,】隔开.后面的SQL就可以使用这个变量了.
⑥我怎么在ASP.NET中调用这个带参数的存储过程?
public static string GetCustomerCNameCount(string startDate,string endDate,ref DataSet ds)
sybase的存储过程 篇6
基本语法:
Create Procedure[owner.]过程名
[@参数名 数据类型[=默认值][Output]]
[,@参数名 数据类型[=默认值][Output]]
[……]
AS
Begin
SQL语句(块)
End
存储过程是数据库对象,和表、索引是一个级别的;是SQL语句和控制流语言的集合,存储过程在首次运行时被编译,并驻留在过程高速缓存的内存中,所以存储过程的招待非常快。存储过程可以带参数,可以调用其他过程,返回状态值,返回参数值,并且可以在远程SQL Server执行。可以在远程SQL Server执行对数据库设计有特别重要的意义。SQL Server提供的存储过程称为系统过程。
存储过程大大增强了SQL的能力、效率和灵活性,经过编译的存储过程极大地改善SQL语句和批处理的性能。
存储过程有很多优点:
●存储过程在第一次执行时编译,并存储在过程高速缓存的内存中。编译时系统对其进行优化,以选择最佳的路径来访问数据集中的数据,这种优化考虑了数据集的实际数据结构。因此存储过程大大提高了系统的性能。
●存储过程可以跨服务器运行。这一点是通过触发器来实现的,当然,首先存储过程要能登录到该远程服务器。
●应用程序也能执行存储过程,从而实现服务器和客户之间的协同作业。
●存储过程减少了网络的交通。这是因为存储过程的文本存储在数据库里,调用存储过程时通过网络的只是存储过程的过程名。
●利用存储过程可以提供一个附加的安全层。
如(该例子取自pubs2数据库):
Create proc titleid_proc(@title_id varchar(80))
As
Begin
Select @title_id=lower(@title_id) ”%”
Select title,title_id,price
Form. titles
Where lower(title_id) like @title_id
Return @@rowcount
End
注意例子中的黑体部分,这实际上是一条赋值语句。该存储过程有返回值。
存储过程可以变得非常复杂。我们认为,创建存储过程还是要遵循“最简单就是最好”的原则。建议在创建存储过程时采用缩进风格,否则创建的存储过程三天之后连自己都看不懂。
需要对存储过程作些说明:
●Create procedure 语句不能和其他语句在同一个批命令里,
●Create procedure 语句不能包括下列语句:
use
Create View
Create default
Create rule
Create trigger
Create procedure
不能使用use语句好理解,存储过程是针对数据库的,不能在一个数据库里访问另外的数据库。如果在存储过程里访问另外的数据库,则数据库表的参照完整性难于得到保障。
从另外几条语句看,在存储过程里一般不能创建新的数据库对象。但可以创建表和索引,以及和表相关联的键,表是临时表,在存储过程结束后不能看见创建的临时表;否则的话每运行一次存储过程就创建一个表,结果可想而知。
存储过程里不能创建一个对象,删除它;然后又在同一存储过程里用相同的名字创建新的对象。实际上,SQL Server在存储过程运行时而不是在编译时创建对象的。
●如果存储过程调用另外的存储过程,则第二个存储过程可以调用在第一个存储过程里创建的对象。
●存储过程包含的最多参数为255个,对存储过程里的局部和全局变量没有限制。
最后讨论一下系统存储过程。系统存储过程以sp_开头,当然用户创建的存储过程也可以以sp_开头;系统过程保存在sybsystemprocs数据库里。系统过程的使用有权限,如果打入系统过程名但没有出现预期的结果,要么是命令名错,要么是使用者没有该过程的权限。一般可通过系统管理员或数据库所有者对系统过程的execute授权。
系统过程繁多,大致有几类:
a. 用户标志和授权。这一类的过程主要由于:增加、删除或报告在SQL Server上的登录,增加、删除或报告某数据库的用户、分组或别名等。这类过程有sp_addlogin,sp_adduser,sp_helpgroup,sp_dropuser等。
b. 远程过程的调用。这类过程用于:增加、删除或报告能存取本SQL Server的远程服务器;增加能从远程服务器上存取本SQL Server的用户名。这类过程有:sp_addremotelogin,sp_addserver,sp_dropserver等。
c. 数据定义和数据库对象。这类存储过程用于:连接和定义规则和缺省值,增加、删除或报告主码、外码和公共码;增加、删除或报告用户定义的数据类型。这类存储过程有:sp_bindfault, sp_bindrule, sp_help, sp_helpdb, sp_foreignkey, sp_helptext等。
教学:数据库-存储过程资料 篇7
存储过程(Stored Procedure)是SQL Server中一个重要的数据库对象,是指数据库服务器端经过预编译的、需要反复使用的SQL语句的集合,是一种封装重复任务操作的方法,支持用户提供的参数变量,具有强大的编程能力。存储过程可以将T_SQL语句和流程控制语句预编译到集合并保存到服务器端,使得管理数据库、显示关于数据库及用户信息的工作变得更为容易。
触发器是一种特殊类型的存储过程。一般的存储过程通过存储名称被直接调用,触发器主要通过事件进行触发而被执行。存储过程是在运算时生成执行方式,因此,之后对其进行再运行时,执行速度会非常快。存储过程的种类是多种多样的,主要包括以下几种:
(1)系统存储过程:多是以sp_开头,可以实现对系统各项参数的设定、系统信息的采集和管理等功能。
(2)本地存储过程:是一般意义上所说的存储过程,是由用户创建,完成某一个特定功能的存储过程。
(3)临时存储过程:其一,本地临时存储过程,一般以“#”号作为名称的第一个字符,存放在tempdb数据库中,只有创建者才能够执行,因此限制性相对较大;其二,全局临时存储过程,多以“##”号为名称的开始,同样存放在tempdb数据库中,连接到服务器的任意用户,都可以对其进行执行,不需要具备特定的权限。
(4)扩展存储过程:是指使用某种编程语言(如C语言)创建的外部例程,是可以在SQL Server实例中动态加载和运行的DDL。
(5)远程存储过程:位于远程服务器上,一般可以使用EXECUTE以及分布式查询来执行。
2 存储过程在数据库设计和管理中的优势和不足
在数据库的设计和管理中,存储过程的重要性是不容忽视的,直接影响着数据库功能的充分发挥。存储过程在实际应用中,具有非常显著的优势,但是也存在相应的缺点和不足,需要相关人员的充分重视。
2.1 优势
(1)性能优越:存储过程可以用流程控制语句编写,完成一些复杂判断和运算。存储过程要经过编译之后才进行首次运行,服务器对其进行语法和语义分析,并给出优化执行方案(预编译)。再次调用时,直接使用上次的优化执行方案,所以能以极快的速度执行,能极大增强SQL语句的功能、效率和灵活性。
(2)网络流量少:执行存储过程时,只有调用存储过程的命令、返回的运算结果及状态信息在网络上传送。因此,可以有效降低网络传输的数据流量,同样能够在一定程度上提升数据库的执行速度。
(3)安全性强:存储过程中可以包含各种完整性检查,使没有权限的用户在有效的控制之下间接地存取数据,更好地保证了数据的安全性和完整性。
(4)成本低廉:一个存储过程虽然只能够用于完成某个特定的任务,但是在任务逻辑改变后,也只需要改变存储过程即可,不需要对客户端代码进行改变,从而可以有效降低数据库维护的成本。
2.2 缺点
(1)调试麻烦:在对存储过程进行调试时,需要进行大量的语言编译,非常麻烦,但是目前PL/SQL Developer的应用,可以有效弥补这一缺点。
(2)重新编译问题:存储过程的后端代表是在运行前编译的,如果带有引用关系的对象发生改变,则受影响的存储过程必须进行重新编译,工作量相对较大。
(3)维护困难:假如在一个程序系统中,存在大量的存储过程,当程序交付使用时,随着用户需求的增加,会带动数据结构的变化,进而引发系统的相关问题,要想对该系统进行维护,不仅非常困难,而且需要付出空前的代价。
3 基于存储过程的数据库安全性实践
3.1 存储过程的结构
在SQL-99的相关标准中,对关于过程的第一方法进行了明确,但是一般情况下,数据库系统都具备各自独特的过程语言,例如,在Oracle中的PL/SQL以及MS SQL Server中的T-SQL,这些过程语言与SQL-99中的相关规范存在很大的相似性,但是在语义和语法方面存在一定的区别。这里以PL/SQL为例,对存储过程的结构进行分析和说明。PL/SQL存储过程,通常会作为一个单独的程序编译到Oracle数据库中,可以对相应的参数进行接收和输出,存储过程的创建主要是通过CREATE PROCEDURE语句进行,其主要组成部分如下:
其中,声明部分主要是用于变量的声明,也可以进行类型的定义,而程序体则包括含了采用PL/SQL控制结构实现的控制算法,通过PL/SQL提供的流程控制语句,实现对存储过程的控制。异常处理程序可以根据实际需求进行选择,针对特定类型的异常和错误信息进行处理。触发器的基本结构与存储过程类似,只是在调用方面存在一定的区别,一般是被相应的事件触发而自动执行的,因此,触发器可以有效保证数据的一致性。
3.2 数据库安全性实践
在实践应用中,基于存储过程的数据库安全主要体现在以下几个方面:
(1)防止SQL注入式攻击
使用存储过程,替代SQL语句,能够在很大程度上防止SQL注入式攻击。例如,对于一个数据库的应用系统而言,在应用过程中,为了保证安全,通常都需要对用户名和密码进行验证,许多程序员都是通过SQL语句实现验证功能,但是这种验证存在着比较致命的缺陷,假如用户在录入用户代码时,加入相应的语句,就可能绕过用户名和密码的验证。采用存储过程,用户在验证过程中只能接触到用户名、密码以及相应的用户代码,从而有效防治了SQL注入式攻击,保障了数据库的安全性。
(2)实现审计功能
当数据库的安全级别达到C2级以上时,审计功能就是确保系统安全的重要指标,但是通常来讲,审计功能主要是针对用户对于数据库表或者视图的操作,对于一些特定信息的记录则无能为力。通过存储过程,可以有效满足用户对于特定信息记录的要求。
(3)数据库加密
利用加密技术,对数据库文件进行加密,可以有效保证数据安全,即使黑客的恶意攻击取得了关键的数据信息,也只是一段经过加密处理的密文,需要解密后才能查阅。同时,实现数据库加密后,用户的数据由用户使用各自的密钥进行加密,可以保证用户自身的信息安全。不仅如此,经过加密后的敏感数据,在数据库中的备份同样是以密文的形式存在,能够有效减少由于存储介质失窃或者丢失、损坏等造成的损失,因此,数据加密对于保障数据库的数据安全而言是非常重要的。数据库加密可以在操作系统、DBMS内层和外层上实现。以DBMS内层的数据库加密为例,大型的数据库管理系统通常都附带有响应的数据加密包,利用这个加密包,可以对数据进行DES或者MD5加密,实现数据库数据信息的加密和解密。
4 结语
总而言之,在当前的信息时代,数据库技术的普及和应用使得其安全问题受到了社会各界的充分重视。存储过程在数据库安全性方面发挥着极其重要的作用,具有非常显著的优势。但是在实际应用过程中,过多的存储过程可能会在一定程度上降低数据库的整体性能,因此,对于设计人员而言,要切实做好存储过程的编译和处理,确保其用在最为有效的位置,以保障数据库的运行安全。
摘要:在当前的信息时代,计算机技术的飞速发展,使得数据库技术得到了普遍应用。对于一个功能齐全、性能良好的数据库,在设计时,都应该用到存储过程。存储过程是一种数据库对象,具有运行速度快、安全性能好以及网络流量少等优点,通过对存储过程的合理应用,可以有效提高数据库的安全性和可靠性。本文结合存储过程的相关概念,对基于存储过程的数据库安全性进行了分析和研究。
关键词:存储过程,数据库,安全性,实践
参考文献
[1]孙娜,曹君.存储过程的数据库安全性应用研究[J].计算机与数字工程.2009.
[2]赵卫利,周听,熊前兴,鲍勇.基于扩展存储过程的数据库加密技术研究[J].计算机工程与设计.2007.
[3]汪维富,黄海于,陈娟,曾阳红.基于存储过程的高性能数据库应用模型研究[J].计算机工程与设计.2008.
[4]梁红硕.存储过程在C#数据库编程中的应用[J].科技风.2014.
[5]孙璐.Java存储过程在异构数据库访问中的应用[J].武汉理工大学学报:信息与管理工程版.2010.
机房收费系统之存储过程 篇8
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它,存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
使用存储过程的优缺点:
优点:
①重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量。②提高性能。存储过程在创建的时候在进行了编译,将来使用的时候不再重新翻译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率。
③减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量,
④安全性。参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。
简单讲:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权。
缺点:
1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
关于存储过程的编写的一些体会 篇9
2012-08-08SQL临时表递归查询子信息并返回记录的代码
2014-01-01sql集合运算符使用方法
2011-06-06MySQL 多表查询实现分析
2007-01-01如何强制删除或恢复SQLServer正在使用的数据库
2013-11-11SQLServer 2008 CDC功能实现数据变更捕获脚本
2010-07-07错误22022 SQLServerAgent当前未运行的解决方法
2011-08-08SQL学习笔记五去重,给新加字段赋值的方法
2009-07-07sqlserver 比较两个表的列
教学:数据库-存储过程资料 篇10
存储过程是一组预先编译好的、能实现特定数据操作功能的SQL代码集。它与特定数据库相关联,一起被存储在SQL Server服务器上。客户端通过应用程序调用执行,可以象使用函数一样重复使用这些代码集,实现所定义的操作。
存储过程需要先编译后运行,而再次调用该存储过程时,不需再次编译。存储过程能够接受参数、嵌套调用另一存储过程、返回状态值和调用结果,还可以被远程数据库服务器执行。有以下特点 :
⑴能极大增强SQL语句的功能、效率和灵活性
⑵更好地保证数据的完整性和安全性
⑶能降低网络的通信流量
⑷能提高应用的开发效率和系统的可维护性
1. 创建存储过程
在SQL Server2008中创建存储过程的语句如下 :
每个存储过程应该完成一项单独的工作,这符合软件工程的思想。为防止其他用户看到自己所编写的存储过程脚本,创建存储过程时使用参数WITH ENCRYPTION加密存储过程的定义。
使用T-SQL最常用的执行存储过程的方法,是使用EXECUTE语句(系统存储过程可不使用EXECUTE关键字)。基本语法如下 :
其中 :
1 procedure_name执行的存储过程名。
2 value_list输入参数要带入存储过程的参数值列表。
3 parameter_vari1ble output参数变量。若存储过程返回一个输出参数,则把其值交给某一参数变量,带回客户端。
4 with recompile强制每次运行都先重新编译存储过程。
下面结合教学管理信息系统的数据库jxgl,通过具体实例说明存储过程的功能与使用方法。
例1 :创建存储过程stu,要求该存储过程返回学生基本信息。代码如下 :
例1的存储过程是一个不带参数的存储过程。
例2 :创建存储过程xm,查询某个学生信息。
例2的存储过程是一个带参数的存储过程。
调用该存储过程 :
例3 :从jxgl数据库中查询某人指定课程的成绩。使用存储过程实现,该存储过程接受与传递参数精确匹配的值。
执行存储过程st :
例4 :创建指定存储过程st_info, 返回指定姓氏的学生学号、姓名、所选课程名称及该课程的成绩。
例5 :创建存储过程xh_pingjun,查询某名学生的平均成绩。
例5创建的是带输出参数的存储过程。在创建存储过程中定义输出参数,使存储过程返回一个或多个值。
调用以上存储过程 :
例6 :为jxgl数据库创建一个带重编译选项的存储过程psc,用于查询某学生的成绩信息。代码如下 :
2.修改存储过程
使用ALTER PROCEDURE语句修改已经创建的存储过程,不会更改权限,也不影响相关的存储过程或触发器。
3.删除存储过程
使用DROP PROCEDUR语句从当前数据库中删除一个或多个存储过程,基本语法如下 :
本文结合教学管理信息系统介绍了存储过程的创建,执行,修改和删除等操作,存储过程在系统中的灵活应用体现了存储过程的强大功能。
摘要:本文以教学管理信息系统为例,介绍该系统中存储过程的使用,突出了存储过程的强大功能。客户端通过应用程序调用执行,可以象使用函数一样重复使用存储过程里的代码集,实现所定义的操作,加快了运行的速度。
数据存储主要优点建议 篇11
随着集团网络的数据量不断增加,网络数据的安全性是极为重要的,一旦重要的数据被破坏或丢失,就会对企业造成重大的影响,甚至是难以弥补的损失。数据存储备份除了拷贝外,还包括更重要的内容即管理。备份管理包括备份的可计划性,磁盘的自动化操作、历史记录的保存以及日志记录等。所有的硬件备份都不能代替数据存储备份,硬件备份(双机热备份、磁盘阵列备份以及磁盘镜象备份等硬件备份)只是拿一个系统、一个设备等作牺牲来换取另一台系统或设备在短暂时间内的安全。若发生人为的错误、自然灾害、电源故障、病毒黑客侵袭等,引起的后果就不堪设想,如造成系统瘫痪,所有设备将无法运行,由此引起的数据丢失也就无法恢复了。只有数据存储备份才能为我们提供万无一失的数据安全保护。
我们早先采用数据存储为“DAS(Direct Attached Storage,直接外挂存储)”的存储方式。这种数据存储的服务器结构如同PC机架构,外部数据存储设备都直接挂接在服务器内部总线上,数据存储设备是整个服务器结构的一部分,同样服务器也担负着整个网络的数据存储职责。DAS这种直连方式,只能够解决单台服务器的存储空间扩展、传输需求,无法满足多台服务器备份的需要。为了满足现在多台服务器所需要的网络存储必须采取支持以下两种方式的存储设备:
一、NAS(Network Attached Storage,网络附加存储)方式则全面改进了以前低效的DAS数据存储方案,它是采用独立于PC服务器,单独为网络数据存储而开发的一种文件服务器。NAS服务器中集中连接了所有的网络数据存储设备(如各种磁盘阵列、磁带、光盘机等),存储容量可以较好地扩展,同时由于这种网络存储方式是NAS服务器独立承担的,所以,对原来的网络服务器性能基本上没什么影响,以确保整个网络性能不受影响。它提供了一个简单、高性价比、高可用性、高扩展性和低总拥有成本(TCO)的数据存储方案。
二、SAN(Storage Area Network,存储域网络)与NAS则是完全不同,它不是把所有的存储设备集中安装在一个专门的NAS服务器中,而是将这些存储设备单独通过光纤交换机连接起来,形成一个光纤通道的网络,然后这个网络再与企业现有局域网进行连接,在这种数据存储方案中,起着核心作用的当然就是光纤交换机了,它的支撑技术就是Fibre Channel(FC,光纤通道)协议,这是ANSI为网络和通道I/O接口建立的一个标准集成,支持HIPPI、IPI、SCSI、IP、ATM等多种高级协议。在SAN中,数据以集中的方式进行存储,加强了数据的可管理性,同时适应于多操作系统下的数据共享同一存储池,降低了总拥有成本。
目前在数据存储方面几大主要品牌:EMC、IBM、HP、DELL等,与其他公司相比中EMC是专业从事数据方面的公司,在数据存储方面有其专业的优势。
利用 EMC 恢复管理解决方案,可以从任何中断或事件中快速、轻松、可靠地恢复业务数据。利用 EMC 恢复管理,您可采用一种全方位的做法,即利用集成式软件的备份、复制、连续数据保护(CDP)、分析和报告来保护数据。它结合了简化的管理,以提供关键业务信息的更高级别的可靠性和恢复能力。
主要优点
一、集中化备份管理 — 跨不同操作系统保护您的关键应用程序和数据库,同时集中执行管理并加快总体备份速度。
二、集中化复制管理 — 以实时或接近于实时的方式将电子数据拷贝移动到本地或远程信息存储库。
三、连续数据保护 — 自动为每一次数据更改保存一个拷贝,以便您能够将数据恢复到任一时间点。
四、分析和报告 — 收集、关联备份操作相关信息并发出警报,包括对备份失败执行根本原因分析。
五、简化管理 — 使用管理控制台查看保护和恢复活动,并确定向何处分配更多资源
EMC 同时有针对 Microsoft SQL Server 的数据保护可满足 SQL Server 的可用性和可恢复性要求。利用 EMC 针对 Microsoft SQL Server 的数据保护,并可利用 SQL Server 中的本机功能实现数据恢复和保护。利用 EMC 行之有效的专业技能满足备份和恢复、SLA 遵守能力、人员职责和基础架构规划等方面的要求。
主要优点
一、提高了数据库可用性 — 使用数据库镜像直接在服务器之间传输事务日志记录,并可快速故障切换到备用服务器。
二、增加了应用程序正常运行时间 — 减少备份窗口以减少对应用程序和系统可用性的影响。
三、减少了业务风险 — 通过内置的硬件冗余、RAID 保护和高可用性确保数据能够快速而准确地恢复。
我们通过对存储方式、存储空间、存储性能的比较,推荐选择的数据存储型号为:
教学:数据库-存储过程资料 篇12
由于要给同学分享一些关于数据库中存储过程和触发器的知识,我想了想,这是很细节的技术,一般只要用了都会很快掌握其使用方法,经过这么多年,我一般在设计数据库的时候也都会或多或少的使用存储过程和触发器,原因很简单:良好的性能,业务也好实现。可是在做上次的项目的时候,由于业务很复杂,存储过程和触发器的数量均都达到上百之多,这是一件很恐怖的事情,尤其是在出了错调试维护的时候,就会想没有这些东西多好。下面我从经验角度梳理一下对存储过程和触发器的看法。
1、触发器是特殊的存储过程。
这句话在教科书中会经常出现,这就说明二者是有很大的联系的,我的一般理解就是触发器是一个隐藏的存储过程,因为它不需要参数,不需要显示调用,往往在你不知情的情况下已经做了很多操作。从这个角度来说,由于是隐藏的,无形中增加了系统的复杂性,非DBA人员理解起来数据库就会有困难,因为它不执行根本感觉不到它的存在。再有,涉及到复杂的逻辑的时候,触发器的嵌套是避免不了的,如果再涉及几个存储过程,再加上事务等等,很容易出现死锁现象,再调试的时候也会经常性的从一个触发器转到另外一个,级联关系的不断追溯,很容易使人头大。其实,从性能上,触发器并没有提升多少性能,只是从代码上来说,可能在coding的时候很容易实现业务,所以我的观点是:摒弃触发器!触发器的功能基本都可以用存储过程来实现。
2、存储过程优点很多,可以经常使用
可以封装数据逻辑和业务规则,以便用户可以仅通过开发人员和数据库管理员打算使用的方式访问数据和对象。
验证所有用户输入的参数化存储过程可用于阻止 SQL 注入攻击。 如果使用动态 SQL,请确保将命令参数化,并绝对不能将参数值直接包括在查询字符串中。
可禁止即席查询和数据修改。 这样将阻止用户恶意或无意中损坏数据或执行查询,以避免降低服务器或网络的性能。
可以在过程代码中处理错误,而无需将错误直接传递给客户端应用程序。 这样可防止返回错误消息,以避免其可能有助于探测攻击,
在服务器上记录错误并对其进行处理。
存储过程只能编写一次,可由很多应用程序访问。
客户端应用程序不需要知道有关基础数据结构的任何信息。 只要更改不影响参数列表或返回的数据类型,就可以更改存储过程代码,而无需在客户端应用程序中进行更改。
存储过程可通过将多个操作组合到一个过程调用中来减少网络通讯。
安全性好—可以访问执行存储过程而不必拥有直接操作基础表的权限
减少网络通信流—存储过程可以包含多条SQL语句,但只要用一条语句来执行该存储过程,从而减少了客户端应用程序对服务器的调用次数和长度
快速执行—存储过程在第一次执行时进行语法检查和编译,编译好的版本存储在高速缓存中,用于再次调用
保证一致性—如果用户只通过存储过程修改数据,则可以消除偶然修改带来的问题减少操作人员和编程人员的错误—由于传递信息少,因此执行复杂任务更容易,不易出现SQL错误
3、考虑移植性,存储过程的致命伤
如果一个系统过多的使用了存储过程,那系统的业务逻辑过于依赖数据库,这样就会给系统额外的增加一层数据库中的业务逻辑层,如果开发的时候用的sql server,后来发现数据量过大,需要提高性能移植到oracle或者mysql,这样就会很麻烦,相当于把存储过程重写一遍,这是不能忍受的。我们平时在做项目的时候,往往一个功能在客户端实现起来很费劲,在服务端很容易就可以实现,这样好多人就会选择在服务端做,却为以后留下隐患。在分析项目的需求的时候,一定要考虑性能问题,多久有可能会升级, 如果数据量很小,几十年用sql server都没问题,那就可以多用存储过程;但是数据量有可能会逐渐累积成千万条甚至更多,就不得不考虑系统的可移植性,这时候尽量不要用存储过程,全部代码控制。
4、存储过程的代码可复用性差。
面向对象的思维在存储过程这毫无用武之地,两个很相似的功能在也需要两个存储过程,因为他们是互相独立的,可以互相调用,但是不能继承等面向对象的操作,这也就增加了代码量。
调用存储过程的通用方法 篇13
在VB.NET中存储过程分为有返回值的和无返回值的, 不论哪种存储过程, 它的调用方法都可以概括为下面的几步:
(1) 声明一个Sql Connection实例。
(2) 声明一个Sql Command实例, 并且设置其Connection属性为刚声明的Sql Connection实例, 设置Command Name为存储过程名, Command Type为存储过程。
(3) 向声明的Sql Command实例的Parameters集合中添加所有的存储过程调用需要的参数。
(4) 声明Sql Data Adapter和Data Set, 设置Sq Data Adapter的Select Command属性为2中声明的Sq Command实例, 再调用其Fill方法来把返回的行集填充到Data Set中。
(5) 关闭Sql Connection实例。
(6) 释放声明的各个实例。
调用不同的存储过程, 只是第二步的Command Name和第三步中的参数不同。
我们要写一个通用的调用存储过程的方法, 该方法只需要提供要调用的存储过程名字和提供具体的参数值就可实现任何存储过程的调用, 那么就要自动实现如何根据存储过程名来得到它所有的参数信息, 再根据这些参数信息自动创建各个参数。在每个SQL Server数据库中都有自己的系统表。这些系统表被用来保存配置和对象信息。从这些系统表中, 可以得到每个存储过程的所有参数的信息, 其中syscolumns表就保存了包括参数名、类型、长度、方向等需要用到的存储过程的信息。不过, 系统表中的字段会随着SQL Server版本的变化而变化。比如syscolumns中的type和xtype, 它们都保存了类型的信息。要让我们的方法适应SQL Server的版本变化要求, 就要用到信息结构视图。
ANSI-92将信息结构视图定义为一组提供系统数据的视图。利用该视图, 可以将实际系统表在应用程序中隐藏起来, 这样系统表的改变就不会影响到应用程序, 应用程序就可以独立于数据库厂家和版本。
ANSI-92和SQL Server支持用三段命名结构引用本地服务器上的对象。ANSI-92术语称为catalog schema.object, 而SQL Server称为database.owner object。例如, 要找到某个存储过程的所有参数信息, 就用:
那么如何编程实现通用的调用存储过程的方法呢?其部分程序如下:
首先定义两个类:一个是用来作为返回值的载体的, 用一个Data Set返回查询出的数据, 用一个Hashtable返回存储过程的返回值和输出参数;另一个类用来完成声明Sql Connection、Sql Command、Sq Parameter, 创建各个Sql Parameter的功能。
在VB.NET中常用的返回结果集的类为Sql Data Reader和Data Set, 而Sql Data Reader必须在保持连接的状态下才可以使用, Data Set却不需要。在本文的实现方法中, 连接应该在调用之后就断开, 因此采用Data Set来保存返回结果集。
这样用户只需提供存储过程的名字和各个参数值就可以调用存储过程。
摘要:在VB.NET中存储过程的调用模式几乎一样, 不同之处是每个存储过程的参数不同, 所以每调用一次存储过程重复代码很多, 这在做项目时很麻烦。笔者经过实践实现了在VB.NET中调用存储过程的简单方法, 该方法只需要提供要调用的存储过程名字和提供具体的参数值就可实现任何存储过程的调用。
中小企业如何走出数据存储误区 篇14
回归本源充分了解技术机制市场上的存储产品,就像是包装精美的礼品,礼品盒中的东西是否实用其实和包装没有任何关系。判断存储产品的性能,就像是在拆礼物,一定要拆掉所有包装发现它的实质功能。不管包装如何华丽,这些根本的功能都要好用才行。
对于存储产品来说,数据备份功能是个很好的评判标准。作为存储产品的本源功能,它一直决定着存储产品的优劣,很多新技术的应用实际都是在为提高数据备份的性能而服务的。纵观存储领域各领风骚两三年的技术,如虚拟磁带库(VTL)、持续数据保护(CDP),乃至时下热门的重复数据删除,都直接或间接地与备份有着密切的联系。对企业用户来说,一味求新和追赶潮流是无法解决企业的实际问题的,把握好几项基本原则,选择适合自身实际情况的解决方案才是正确的方法。
目前,由于成本的限制,大多企业都在使用磁带进行数据备份。为缩短备份窗口,通常采用增量备份方式来减少数据量。某大型国企IT部的陈经理告诉记者:“这样的备份方式在进行数据恢复时,需要来回倒带,一遍遍地恢复,速度非常慢。”
因此,VTL 和CDP 在宣传之初都以此为突破口,喊出了“备份应当以恢复为目的”的口号,强调自身在缩短备份窗口的同时不影响恢复速度的优势。然而,在实际使用时,增量备份的不可持续性问题又渐渐开始困扰企业。“增量备份几天之后,就需要进行一次全备份作为新的起点继续增量备份。而在恢复时,又一定要找到之前的一个全量备份,再一步步做增量备份的恢复,因此恢复的时间反而更长。”陈经理对记者说。
可见,很多新技术只是在缓解问题,没有根本的地解决问题。“通常的增量备份在恢复的时候,是从多个全量备份和增量备份中做很多次的恢复,一直累积到当前要恢复的时间点。”IBM 系统与科技事业部存储架构师樊华介绍说,“而永久增量备份技术就可以解决这个问题。除在初始时进行一次所有数据的全备份外,以后只需对新增加或改动过的数据做增量备份。由于增量备份可以一直进行下去,就会大幅度缩减备份时间和存储容量。而在恢复的时候,由于永久增量备份的机制本身是建立在一个关系时间数据表索引之上的,因此可以一步到位地直接恢复出指定时间点的文件,这就不会影响恢复速度。其实,是否能解决客户的问题,还是要看产品宣传背后是否具备可行的技术机制。”
不难看出,若要选择到正确的产品,往往需要更多的去了解它们得以运作的技术本质,这才能帮助企业正确判断存储产品是否真的适合自身的需求。当然,适合的新技术也不是可以解决一切问题的万能灵药,细致了解它们的应用范围和补充技术,才能避免陷入“买了用不上,贵却不好用”的采购误区。
选择产品既要经济又要安全随着数据存储容量的激增,企业计算存储成本的方式早已不能再按设备总价计算,存储投入正在以存储介质的单位容量成本进行评估,
因此,尽管磁盘价格在不断下滑,单位容量成本明显低于磁盘的磁带依旧处在主流地位,这是磁盘备份的拥护者也不得不承认的事实。然而,磁带虽然便宜,也不一定就能创造最经济的存储环境。因为对于磁带来说,备份和恢复性能一直是个巨大问题,而存储的性能决定着存储的价值,如果不能高效地完成备份,又或者无法及时恢复,成本再低也将毫无意义。因此,解决困扰磁带备份和恢复的难题之后,磁带的经济性优势才能充分体现出来。
“选择产品的时候,用户应该注意其是否拥有很好的介质管理能力,是否能帮助节省备份所用的磁带数量,这样的产品才是经济的产品。比如,用户在备份了较长时间之后,一盘磁带上可能会备份了很多个不同的版本,而其中有些版本已经过期,好的产品都是可以把所占用的空间释放出来重新使用的。”樊华说,“但是,往往这盘磁带上还会有其他的一些数据,所以不能直接重用。
例如IBM 的TSM 就为此提供了一种策略,当可以被重新使用的空间达到一定程度的时候,它可以把多盘磁带上可用的数据集中在一起,腾出可以被重用的整盘磁带,这种管理策略可节省不少磁带。”
除了考虑综合经济性因素外,存储产品对数据的保护能力也是企业选择产品的关键。由于数据外泄所造成的损失正在超乎企业的想象,针对大量采用磁带存储数据的用户,不少存储厂商已经在数据安全性上做了大量的工作。但是市场上的产品鱼龙混杂,数据加密能力水平不一,企业往往很难作出选择。
樊华认为:“在选择相关产品时,加密往往都是出现在数据传输、数据保存环节。是否需要这样的产品,需要依据对数据安全级别的要求来选择。比如说:当需要把备份数据从机房送到容灾中心长期保存,就有可能会交由第三方(如快递公司)来完成,在途中磁带实际上处于不可控的状态,为了保证信息的安全性就非常适合采用加密存储,即便磁带有遗失,起码信息还是安全的,不会造成企业机密信息的泄露。另外,一些数据安全要求比较高的行业如研究机构、知识产权保护等行业,就非常适合采用加密存储解决方案。”
存储管理注重统一和便捷在使用磁带产品进行存储时,好的存储管理工具往往能使存储介质本身更具威力。不管采用哪种备份技术,要想自如地应用,一个功能完善而又简单易用的管理工具必不可少。
“能够在同一个界面里实现企业级整体备份和恢复的管理工具往往才是企业所需要的。”樊华说。很多企业的管理人员,都存在技术水平有限的问题,过于繁琐的管理环境会对他们使用存储产品造成障碍。因此,简单的管理系统使管理人员不需要什么特殊的技能也能轻松完成工作。
此外据了解,在功能方面,一些产品所包含的智能管理功能,还可以帮助企业完成应急处理工作,比如:在备份过程中发生故障时,可以马上把信息通过事件平台发送到管理员的手机等设备中,可以及时通知相关人员处理。
【教学:数据库-存储过程资料】推荐阅读:
触发器与存储过程互调数据库09-07
数据挖掘数据存储07-01
数据存储与数据管理07-05
基于关系数据库的地籍空间数据存储结构07-18
高速数据存储07-27
数据存储平台08-16
数据存储模型08-19
空间数据存储08-26
数据存储标准09-17
数据存储优化10-13