《高性能的数据库》 第四讲 编程细节(1)

《高性能的数据库》 第四讲 编程细节(1) - 应用软件 - 电脑教程网

《高性能的数据库》 第四讲 编程细节(1)

日期:2007-10-27   荐:
  第四讲 编程细节(上部分) 1、触发器 2、游标 3、函数  4、存储过程 5、事务---------------------作者:懒虫 # SapphireStudio . 欢迎访问我们的站点:www.chair3.com欢迎转载。--------------------这里只打算讲解四部分了,也就最简单、最常用的四部分。 1、触发器。   定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。   常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)   我为什么要使用触发器?比如,这么两个表:   Create Table Student(       --学生表    StudentID int primary key,   --学号    ....   )   Create Table BorrowRecord(       --学生借书记录表    BorrowRecord int identity(1,1),   --流水号     StudentID   int ,          --学号    BorrowDate  datetime,        --借出时间    ReturnDAte  Datetime,        --归还时间    ...   )  用到的功能有:    1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);    2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。  等等。  这时候可以用到触发器。对于1,创建一个Update触发器:  Create Trigger truStudent   On Student   for Update  -------------------------------------------------------  --Name:truStudent  --func:更新BorrowRecord 的StudentID,与Student同步。  --Use :None  --User:System  --Author: 懒虫 # SapphireStudio (www.chair3.com)  --Date : 2003-4-16  --Memo : 临时写写的,给大家作个Sample。没有调试阿。  -------------------------------------------------------  As   if Update(StudentID)   begin    Update BorrowRecord      Set br.StudentID=i.StudentID     From BorrowRecord br , Deleted d ,Inserted i      Where br.StudentID=d.StudentID   end              理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。  一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。  对于2,创建一个Delete触发器  Create trigger trdStudent   On Student   for Delete  -------------------------------------------------------  --Name:trdStudent  --func:同时删除 BorrowRecord 的数据  --Use :None  --User:System  --Author: 懒虫 # SapphireStudio (www.chair3.com)  --Date : 2003-4-16  --Memo : 临时写写的,给大家作个Sample。没有调试阿。  -------------------------------------------------------  As   Delete BorrowRecord     From BorrowRecord br , Delted d    Where br.StudentID=d.StudentID  从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。  这里我们只讲解最简单的触发器。复杂的容后说明。  事实上,我不鼓励使用触发器。触发器的初始设计思想,已经被“级联”所替代。 2.游标    在SQL 2000之前,游标可谓是SQL Server心中的痛: 老牛般的速度(CPU),河马般的胃口(内存)。可你却不能不用他。  什么叫游标呢?说白了就是像高级语言一样,是存放数据集,并逐条访问的一种机制。  比如在Delphi里面,要实现类似于这样的功能:(呵呵,不好意思,我只会Delphi,所以只能举一个Delphi的例子)    //这是一段Delphi的源代码  adoDataSet1.Close;  adoDataSet1.CommandText:=' Select * From Student order by StudentID ';  adoDataSet1.Open;  While Not adoDAtaSet1.Eof Do  Begin     YourVar:=adoDAtaSet1.FieldByName('StudentID').AsInteger;   DoSomeThing();   ....    adoDataSet1.Next;  End     在SQL Server 并没有很好的数据逐条访问机制,如果有,那就是游标。  还是举例子:  对于表   Create Table BorrowRecord(       --学生借书记录表    BorrowRecord int identity(1,1),   --流水号     StudentID   int ,          --学号    StudentFeeID int ,          --费用结算号  (外键)    BorrowDate  datetime,        --借出时间    ReturnDAte  Datetime,        --归还时间    Fee      Money          --借书费用     ...   )   Create Table StudentFee(        --学生费用结算表    StudentFeeID int primarykey ,    --费用结算号  (主键)    StudentID int ,            --学号    BorrowBookAllFee      Money,   --所有借书总费用      ...   )   两者关系为多对一的关系,关联字段为StudentFeeID    由于某种原因StudentFee表的数据遭到了破坏,我想StudentFee循环一遍将“所有借书总费用”重算 。  -----------------------------------------------------------------------  -------------------------------------------------------  --Name:一部分代码  --func:更新学生借书总费用  --Use :  --User:  --Author: 懒虫 # SapphireStudio (www.chair3.com)  --Date : 2003-4-16  --Memo : 临时写写的,给大家作个Sample。没有调试阿。  -------------------------------------------------------   --声明一个游标   Declare curStudentFee Cursor    for     Select StudentFeeID From StudentFee      --声明两个费用变量   Declare @mBorrowBookAllFee Money --总费用   Declare @iStudentFeeID   Int  --借书结算号   --初始化    Set @mBorrowBookAllFee=0   Set @iStudentFeeID=0   --打开游标   Open curStudentFee    --循环并提取记录   Fetch Next From curStudentFee Into @iStudentFeeID      While ( @@Fetch_Status=0 )     begin    --从借书记录中计算某一学生的借书总记录的总费用    Select @mBorrowBookAllFee=Sum(BorrowBookAllFee)     From BorrowRecord      Where StudentFeeID=@iStudentFeeID       --更新到汇总表。    Update StudentFee Set BorrowBookAllFee=@mBorrowBookAllFee     Where StudentFeeID=@iStudnetFeeID          Fetch Next From curStudentFee Into @mFee   end   --关闭游标     Close curStudentFee   --释放游标   Deallocate curStudentFee   -----------------------------------------------------------------------  关注游标的要点:1、声明、打开、关闭、释放 ; 2、@@Fetch_Status 游标提取状态标志,0表示正确  这里,我也要提到,我不鼓励使用游标。更多的情况下,在SQL 2000 里面 ,函数已经能够实现绝大部分游标的功能。    好累,好不容易算是将1、2点讲完,算是上部分把。后面的几点等会再说了……:(:(。  大家给点鼓励?  懒虫 # SapphireStudio ,精彩世界,尽在 3腿网 ( www.chair3.com )。
标签: