日期:2011-05-02 15:21:00 来源:本站整理
《高性能的数据库》 第四讲 编程细节(2)[MSSQL防范]
本文“《高性能的数据库》 第四讲 编程细节(2)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
第四讲 编程细节(下部份)
1、触发器
2、游标
3、函数
4、存储历程
5、事件
---------------------
作者:懒虫 # SapphireStudio .
欢送拜候我们的站点www.chair3.com
欢送转载.
--------------------
上次得到不少朋友的捧场,信心大增了:),决意趁着五一期间把它写完,反正表面非典利害,也不好出去玩.这里讲到3、4、5了.
这里决意把4与3改换一下,先讲授4(存储历程,以下用sp来简称;函数,以下用fn来简称)
4、存储历程.
存储历程是数据库编程里面最重要的表现方法了.
呵呵,这里我要提到上次说道的:我回绝利用触发器.这里我要开始猛批一顿触发器了.
在SQL 2000里,说真话,我实在找不出触发器可以存在的来由.回想一下:触发器是一种特别的存储历程.它在一定的事件(Insert,Update,Delete 等)里自动履行.我倡议利用sp和级联来替换触发器.
在SQL 7 里面,触发器普通用于更新、或删除相关表的数据,以保护数据的完好.SQL 7里面,没有级联删除和级联改正的功效. 只能成立起关系.既然SQL 2000里面供应了级联,那么触发器就没有很好的存在来由.更多的情形下是作为一个向下兼容的技术而存在.
当然,也有人喜好把触发器作为处理数据逻辑,乃至是业务逻辑的自动存储历程. 这种办法并不足取.这里摆列以下利用触发器的一些害处:
a、"地下"运行 .
触发器没有很好的调试、管理环境.调试一段触发器,要比调试一段sp更耗费时间与精神.
b、近似于goto语句.(过度安闲的别的一个说法是:无政府主义!)
一个表,可以写入多个触发器,包含一样for Update的10个触发器!一样for Delete的10个触发器.也就是说,你每次要对这个表举行写操作的时刻,你要一个一个查抄你的触发器,看看他们是做什么的,有没有冲突.
大概,你会很牛B的对我说:我不会做那么傻B的事情,我记得住我做了些什么!3个月今后呢?10个月今后呢?你还会对我说你记得住么?
c、嵌套触发器、递归触发器
你敢说你这么多的触发器中不会存在Table1更新了Table2表,从而触发Table2表更新TAble3,TAble3的触发器再次触发Table1更新Table2…… ??
大概还会发生这种情形:你的程序更新了Table1.Fd1,触发器立马更新Table1.fd1,再次触发事件,触发器再次更新Table1.fd1……
当然,sql server可以设置和避免利用程序进入死循环,但是,得到的后果,大概就不是你想要的.
……
我想不出触发器更多的害处了,因为我早就丢弃了它.算了,不批它了,酸是各人爱好把!我倡议利用完好存储历程来实现数据逻辑和事件逻辑!
先讲讲sp的编写格局(我个人的编程习惯).杰出的习惯有助于日后的保护.
Create Proc spBuyBook( --@@存储历程头,包含名字、参数、阐明文档
@iBookID int, --书的ID --@@参数
@iOperatorID int --操作员ID
)
------------------------------------------------------- @@阐明文档
--Name : spBuyBook @@名字
--func : 购置一本书的业务逻辑 @@存储历程的功效
--Return: 0,精确;-1,没找到该书;-2,更新Book表出错;-3..... @@返回值注释
--Use : spDosomething,spDoSomething2.... @@引用了那些外部程序,比方sp,fn,vw等
--User : 懒虫 @@该存储历程的利用者
--Author: 懒虫 # SapphireStudio (www.chair3.com) @@作者
--Date : 2003-5-4 @@最后更新日期
--Memo : 暂时写写的,给大家作个Sample.没有调试阿. @@备注
-------------------------------------------------------
As --@@程序开始
begin
Begin Tran --@@激活事件
Exec spDoSomething --@@调用其他sp
if @@Error<>0 --@@判断能否错误
begin
Rollback Tran --@@回滚事件
RaisError ('SQL SERVER,spBuyBook: 调用spDoSomeThing发生错误.', 16, 1) with Log --@@记录日记
Return -1 --@@返回错误号
end
.... --更多其他代码
Commit Tran --@@提交事件
end
妈 的我怎么这么背啊我??什么时刻不死机,恰好在这时!!丢了不少……:(:(
下面默哀3分钟……
1……
2……
3……
好了,持续!回想方才写的内容ing ……
AA、存储历程的几个要素: a. 参数 b.变量 c.语句 d.返回值 e.管理存储历程
BB、更高级的编程要素: a.系统存储历程 b.系统表 c.非常处理 d.暂时表 e.动态SQL f.扩大存储历程 g.DBCC号令
AA.a 参数: 知识要点包含:输入参数,输出参数,参数默许值
Sample:
Create Proc spTest(
@i int =0 , --输入参数
@o int output --输出参数
)
As
Set @o=@i*2 --对输出参数付值
Use the Sample:
Declare @o int
Exec spTest 33,@o output
Select @o --此时@o应当等于33*2=66.
----------------------------------------------------------------------
以上代码没有测试,顺手写写的.但愿不会出错:)
--懒虫 # SapphireStudio
精彩世界,尽在3腿软件网(www.chair3.com)!!
-----------------------------------------------------------------------
AA.b 变量:AA.a中已经有声明变量的例子了,就是Declare @o int
AA.c 语句:在Sql Server 中,假如仅仅利用尺度SQL语句将是不可想象的,普通认为,尺度的SQL 语句就那么几条,如:
Select, Update, Delete
因此,我们需求引入更多更强盛的功效,那就是T-SQL语句:
赋值语句:Set
循环语句:While
分支语句:if , Case ( Case语句不能单独利用,与普通高级语言的差别)
一同举个例子吧:
Sample :
Declare @i int
Set @i=0
While @i<100
begin
if @i<=20
begin
Select Case Cast(@i As Float)/2 When (@i/2) then Cast(@i As varchar(3)) + '是双数'
else Cast(@i As varchar(3)) + '是单数'
end
end
Set @i=@i+1
end
----------------------------------------------------------------------
以上代码判断20之内的单数与双数.
--懒虫 # SapphireStudio
精彩世界,尽在3腿软件网(www.chair3.com)!!
-----------------------------------------------------------------------
AA.d 返回值
Sample:
Create Proc spTest2
As
Return 22
Use the Sample
Declare @i int
Exec @i=spTest2
Select @i
AA.e 管理存储历程: 成立,改正,删除.
辨别为:
Create Proc ... , Alter Proc ... , Drop Proc ...
BB、更高级的编程要素: a.系统存储历程 b.系统表 c.非常处理 d.暂时表 e.动态SQL f.扩大存储历程 g.DBCC号令
哈哈,以下课程收费!!(玩笑,实际上打算放到背面去讲了.)
3、函数.
函数是SQL 2000的新功效.普通的编程语言都有函数,我就不用注释函数是什么东东了.:)
大概不少朋友会问:我用存储历程不便可以了么,我为什么要利用函数?
这里分外指出的一点:fn可以嵌套在Select语句中利用,而sp不可以.
这里不打算大批特批一番游标了,当然,在我的程序里面,基本丢弃了游标(这里分外阐明,是"基本"!因为还是有很多地方费用导游表不可的.),转而采取了fn.游标太损耗资源了.受不了……我将近打动得要堕泪了…
fn其实要比sp要简单得多.因为它的不肯定性,从而也使他遭到了不少的限制.
举个函数的小粒子:
Create Function fnTest ( @i int )
Returns bit
As
begin
Declare @b bit
if (Cast(@i As Float)/2)=(@i/2)
Set @b= 1
else
Set @b= 0
Return @b
end
----------------------------------------------------------------------
以上代码判断@i是单数还是双数.
--懒虫 # SapphireStudio
精彩世界,尽在3腿软件网(www.chair3.com)!!
-----------------------------------------------------------------------
Use the Sample:
Create Table #TT( fd1 int)
Declare @i int
Set @i=0
While @i<=20
begin
Insert Into #tt Values(@i)
Set @i=@i+1
end
Select fd1,
'能否双数'=dbo.fnTest(fd1) --在这里调用了函数,注意哈:函数之前一定要加上他的owner.
From #tt
Drop Table #tt
----------------------------------------------------------------------
以上代码虚拟一段数据,然后判断数据表中是单数还是双数.
--懒虫 # SapphireStudio
精彩世界,尽在3腿软件网(www.chair3.com)!!
-----------------------------------------------------------------------
有了sp的编程底子,写fn也就不是什么很难的事情了.方才我提到了,fn遭到限制颇多,这里稍稍摆列:
chair1. 只能调用肯定性函数,不可以调用不肯定函数. 比方,不可以调用GetDate(),以及自己定义的不肯定性函数.
chair2. 不可以利用动态SQL .如:Execute, sp_ExecuteSQL (这是我最痛楚的事情了,痛哭中……)
chair3. 不可以调用扩大存储历程
chair4. 不可以调用Update语句对表举行更新
chair5. 不可以在函数内部成立表(Create TAble ),改正表(Alter TAble)
等等……头脑发昏中……反正略微一些不可猜测后果,无法返回后果的都不能用.
5.事件
什么叫事件? 这些就是数据库特有的术语了.懒虫在这里口头注释:就是把多件事情当作一件事情来处理.也就是大家同在一条船上,要活一同活,要over一同over !
我为什么要利用事件? 俺这里再举个很俗很俗的例子:
俺到银行存钱,于是有这么几个步骤:
1、把钱交给工作人员;2、工作人员填单;3、将单子给我签字;4、工作人员确认并输入电脑.
如果,如果我把钱交给工作人员之后,举行到3我签字了.那哥们忽然心脏病爆发,over掉了,那,我的钱还没有输入电脑,但我却交了钱又签字确认了,而并没有其他任何记录.我岂不是要亏死了???我的血汗钱啊!赶忙退给我!!
于是,在数据库里产生了这么一个术语:事件(Transaction),也就是要末成功,要末失利,并恢答复状.
还是写程序把:
Create Proc sp我去存款(@M Money , @iOperator Int)
As
Begin
Declare @i int
Begin Tran --激活事件
Exec @i=sp交钱 @m,@iOperator
if @i<>0 --这里普通用系统错误号 @@Error. 我这里为了举例子没有效到.需求按照实际情形.
begin
Rollback Tran --回滚事件
RaisError ('银行的窗口太少了,我懒得列队,不交了!:( ', 16, 1) with Log --记录日记
Return -1 --返回错误号
end
Exec @i=sp填单 @m,@iOperator
if @i<>0
begin
Rollback Tran --回滚事件
RaisError ('银行的哥们打印机出了点弊端,打印不出单子来,把钱退回来给我吧??', 16, 1) with Log
Return -2
end
Exec @i=sp签字 @m
if @i<>0
begin
Rollback Tran --回滚事件
RaisError ('我 靠?什么烂银行,换了3支笔都写不出水来!!老子不存了!!不签!', 16, 1) with Log
Return -3
end
Exec @i=sp输入电脑 @m,@iOperator
if @i<>0
begin
Rollback Tran --回滚事件
RaisError ('什么意思?磁盘空间已满?好了好了,把钱给我,我到旁边的这家银行!', 16, 1) with Log
Return -4
end
Commit Tran --提交事件
Return 0
End
----------------------------------------------------------------------
以上是伪代码,模拟我去存款的历程.
--懒虫 # SapphireStudio
精彩世界,尽在3腿软件网(www.chair3.com)!!
-----------------------------------------------------------------------
事件的几个要点 Begin Tran , @@Error(我这里没有效到,见上面的注释) , Rollback Tran , Commit Tran.
另:事件可以嵌套利用.这个时刻需求命名.请拜见sql server online help .
算是完成第四讲了,写这么一篇也要几个小时呢,挺累的
以上是“《高性能的数据库》 第四讲 编程细节(2)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论