直播中
1、觸發(fā)器
2、游標(biāo)
3、函數(shù)
4、存儲(chǔ)過程
5、事務(wù)
---------------------
作者:懶蟲 # SapphireStudio .
歡迎訪問我們的站點(diǎn):www.chair3.com
歡迎轉(zhuǎn)載。
--------------------
這里只打算講解四部分了,也就最簡單、最常用的四部分。
1、觸發(fā)器。
定義: 何為觸發(fā)器?在SQL Server里面也就是對(duì)某一個(gè)表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個(gè)特殊的存儲(chǔ)過程。
常見的觸發(fā)器有三種:分別應(yīng)用于Insert , Update , Delete 事件。(SQL Server 2000定義了新的觸發(fā)器,這里不提)
我為什么要使用觸發(fā)器?比如,這么兩個(gè)表:
Create Table Student( --學(xué)生表
StudentID int primary key, --學(xué)號(hào)
....
)
Create Table BorrowRecord( --學(xué)生借書記錄表
BorrowRecord int identity(1,1), --流水號(hào)
StudentID int , --學(xué)號(hào)
BorrowDate datetime, --借出時(shí)間
ReturnDAte Datetime, --歸還時(shí)間
...
)
用到的功能有:
1.如果我更改了學(xué)生的學(xué)號(hào),我希望他的借書記錄仍然與這個(gè)學(xué)生相關(guān)(也就是同時(shí)更改借書記錄表的學(xué)號(hào));
2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號(hào)的同時(shí),也刪除它的借書記錄。
等等。
這時(shí)候可以用到觸發(fā)器。對(duì)于1,創(chuàng)建一個(gè)Update觸發(fā)器:
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 : 臨時(shí)寫寫的,給大家作個(gè)Sample。沒有調(diào)試阿。
-------------------------------------------------------
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
理解觸發(fā)器里面的兩個(gè)臨時(shí)的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個(gè)Update 的過程可以看作為:生成新的記錄到Inserted表,復(fù)制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀(jì)錄。
對(duì)于2,創(chuàng)建一個(gè)Delete觸發(fā)器
Create trigger trdStudent
On Student
for Delete
-------------------------------------------------------
--Name:trdStudent
--func:同時(shí)刪除 BorrowRecord 的數(shù)據(jù)
--Use :None
--User:System
--Author: 懶蟲 # SapphireStudio (www.chair3.com)
--Date : 2003-4-16
--Memo : 臨時(shí)寫寫的,給大家作個(gè)Sample。沒有調(diào)試阿。
-------------------------------------------------------
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
從這兩個(gè)例子我們可以看到了觸發(fā)器的關(guān)鍵:A.2個(gè)臨時(shí)的表;B.觸發(fā)機(jī)制。
這里我們只講解最簡單的觸發(fā)器。復(fù)雜的容后說明。
事實(shí)上,我不鼓勵(lì)使用觸發(fā)器。觸發(fā)器的初始設(shè)計(jì)思想,已經(jīng)被“級(jí)聯(lián)”所替代。
2.游標(biāo)
在SQL 2000之前,游標(biāo)可謂是SQL Server心中的痛: 老牛般的速度(CPU),河馬般的胃口(內(nèi)存)。可你卻不能不用他。
什么叫游標(biāo)呢?說白了就是像高級(jí)語言一樣,是存放數(shù)據(jù)集,并逐條訪問的一種機(jī)制。
比如在Delphi里面,要實(shí)現(xiàn)類似于這樣的功能:(呵呵,不好意思,我只會(huì)Delphi,所以只能舉一個(gè)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 并沒有很好的數(shù)據(jù)逐條訪問機(jī)制,如果有,那就是游標(biāo)。
還是舉例子:
對(duì)于表
Create Table BorrowRecord( --學(xué)生借書記錄表
BorrowRecord int identity(1,1), --流水號(hào)
StudentID int , --學(xué)號(hào)
StudentFeeID int , --費(fèi)用結(jié)算號(hào) (外鍵)
BorrowDate datetime, --借出時(shí)間
ReturnDAte Datetime, --歸還時(shí)間
Fee Money --借書費(fèi)用
...
)
Create Table StudentFee( --學(xué)生費(fèi)用結(jié)算表
StudentFeeID int primarykey , --費(fèi)用結(jié)算號(hào) (主鍵)
StudentID int , --學(xué)號(hào)
BorrowBookAllFee Money, --所有借書總費(fèi)用
...
)
兩者關(guān)系為多對(duì)一的關(guān)系,關(guān)聯(lián)字段為StudentFeeID
由于某種原因StudentFee表的數(shù)據(jù)遭到了破壞,我想StudentFee循環(huán)一遍將“所有借書總費(fèi)用”重算 。
-----------------------------------------------------------------------
-------------------------------------------------------
--Name:一部分代碼
--func:更新學(xué)生借書總費(fèi)用
--Use :
--User:
--Author: 懶蟲 # SapphireStudio (www.chair3.com)
--Date : 2003-4-16
--Memo : 臨時(shí)寫寫的,給大家作個(gè)Sample。沒有調(diào)試阿。
-------------------------------------------------------
--聲明一個(gè)游標(biāo)
Declare curStudentFee Cursor
for
Select StudentFeeID From StudentFee
--聲明兩個(gè)費(fèi)用變量
Declare @mBorrowBookAllFee Money --總費(fèi)用
Declare @iStudentFeeID Int --借書結(jié)算號(hào)
--初始化
Set @mBorrowBookAllFee=0
Set @iStudentFeeID=0
--打開游標(biāo)
Open curStudentFee
--循環(huán)并提取記錄
Fetch Next From curStudentFee Into @iStudentFeeID
While ( @@Fetch_Status=0 )
begin
--從借書記錄中計(jì)算某一學(xué)生的借書總記錄的總費(fèi)用
Select @mBorrowBookAllFee=Sum(BorrowBookAllFee)
From BorrowRecord
Where StudentFeeID=@iStudentFeeID
--更新到匯總表。
Update StudentFee Set BorrowBookAllFee=@mBorrowBookAllFee
Where StudentFeeID=@iStudnetFeeID
Fetch Next From curStudentFee Into @mFee
end
--關(guān)閉游標(biāo)
Close curStudentFee
--釋放游標(biāo)
Deallocate curStudentFee
-----------------------------------------------------------------------
關(guān)注游標(biāo)的要點(diǎn):1、聲明、打開、關(guān)閉、釋放 ; 2、@@Fetch_Status 游標(biāo)提取狀態(tài)標(biāo)志,0表示正確
這里,我也要提到,我不鼓勵(lì)使用游標(biāo)。更多的情況下,在SQL 2000 里面 ,函數(shù)已經(jīng)能夠?qū)崿F(xiàn)絕大部分游標(biāo)的功能。
好累,好不容易算是將1、2點(diǎn)講完,算是上部分把。后面的幾點(diǎn)等會(huì)再說了……:(:(。
大家給點(diǎn)鼓勵(lì)?
懶蟲 # SapphireStudio ,精彩世界,盡在 3腿網(wǎng) ( www.chair3.com )。