定義: 何為觸發(fā)器?在sql server里面也就是對(duì)某一個(gè)表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個(gè)特殊的存儲(chǔ)過(guò)程。
常見(jiàn)的觸發(fā)器有三種:分別應(yīng)用于insert , update , delete 事件。(sql server 2000定義了新的觸發(fā)器,這里不提)
我為什么要使用觸發(fā)器?比如,這么兩個(gè)表:
用到的功能有:1.如果我更改了學(xué)生的學(xué)號(hào),我希望他的借書(shū)記錄仍然與這個(gè)學(xué)生相關(guān)(也就是同時(shí)更改借書(shū)記錄表的學(xué)號(hào));2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號(hào)的同時(shí),也刪除它的借書(shū)記錄,等等。
這時(shí)候可以用到觸發(fā)器。對(duì)于1,創(chuàng)建一個(gè)update觸發(fā)器:
create trigger trustudent on student--在student表中創(chuàng)建觸發(fā)器 for update--為什么事件觸發(fā)as--事件觸發(fā)后所要做的事情 if update(studentid) begin update borrowrecordset studentid=i.studentidfrom borrowrecord br , deletedd ,inserted i--deleted和inserted臨時(shí)表where br.studentid=d.studentid end
理解觸發(fā)器里面的兩個(gè)臨時(shí)的表:deleted , inserted 。注意deleted 與inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中有兩個(gè)虛擬表用于存儲(chǔ)在表中記錄改動(dòng)的信息,分別是:
虛擬表inserted 虛擬表deleted
在表記錄新增時(shí)存放新增的記錄 不存儲(chǔ)記錄
修改時(shí)存放用來(lái)更新的新記錄 存放更新前的記錄
刪除時(shí)不存儲(chǔ)記錄 存放被刪除的記錄
一個(gè)update 的過(guò)程可以看作為:生成新的記錄到inserted表,復(fù)制舊的記錄到deleted表,然后刪除student記錄并寫(xiě)入新紀(jì)錄。
對(duì)于2,創(chuàng)建一個(gè)delete觸發(fā)器
create trigger trdstudent on student for deleteas delete borrowrecord from borrowrecord br , delted d where br.studentid=d.studentid
從這兩個(gè)例子我們可以看到了觸發(fā)器的關(guān)鍵:a.2個(gè)臨時(shí)的表;b.觸發(fā)機(jī)制。
這里我們只講解最簡(jiǎn)單的觸發(fā)器。復(fù)雜的容后說(shuō)明。
事實(shí)上,我不鼓勵(lì)使用觸發(fā)器。觸發(fā)器的初始設(shè)計(jì)思想,已經(jīng)被“級(jí)聯(lián)”所替代。
常見(jiàn)的觸發(fā)器有三種:分別應(yīng)用于insert , update , delete 事件。(sql server 2000定義了新的觸發(fā)器,這里不提)
我為什么要使用觸發(fā)器?比如,這么兩個(gè)表:
用到的功能有:1.如果我更改了學(xué)生的學(xué)號(hào),我希望他的借書(shū)記錄仍然與這個(gè)學(xué)生相關(guān)(也就是同時(shí)更改借書(shū)記錄表的學(xué)號(hào));2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號(hào)的同時(shí),也刪除它的借書(shū)記錄,等等。
這時(shí)候可以用到觸發(fā)器。對(duì)于1,創(chuàng)建一個(gè)update觸發(fā)器:
create trigger trustudent on student--在student表中創(chuàng)建觸發(fā)器 for update--為什么事件觸發(fā)as--事件觸發(fā)后所要做的事情 if update(studentid) begin update borrowrecordset studentid=i.studentidfrom borrowrecord br , deletedd ,inserted i--deleted和inserted臨時(shí)表where br.studentid=d.studentid end
理解觸發(fā)器里面的兩個(gè)臨時(shí)的表:deleted , inserted 。注意deleted 與inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)中有兩個(gè)虛擬表用于存儲(chǔ)在表中記錄改動(dòng)的信息,分別是:
虛擬表inserted 虛擬表deleted
在表記錄新增時(shí)存放新增的記錄 不存儲(chǔ)記錄
修改時(shí)存放用來(lái)更新的新記錄 存放更新前的記錄
刪除時(shí)不存儲(chǔ)記錄 存放被刪除的記錄
一個(gè)update 的過(guò)程可以看作為:生成新的記錄到inserted表,復(fù)制舊的記錄到deleted表,然后刪除student記錄并寫(xiě)入新紀(jì)錄。
對(duì)于2,創(chuàng)建一個(gè)delete觸發(fā)器
create trigger trdstudent on student for deleteas delete borrowrecord from borrowrecord br , delted d where br.studentid=d.studentid
從這兩個(gè)例子我們可以看到了觸發(fā)器的關(guān)鍵:a.2個(gè)臨時(shí)的表;b.觸發(fā)機(jī)制。
這里我們只講解最簡(jiǎn)單的觸發(fā)器。復(fù)雜的容后說(shuō)明。
事實(shí)上,我不鼓勵(lì)使用觸發(fā)器。觸發(fā)器的初始設(shè)計(jì)思想,已經(jīng)被“級(jí)聯(lián)”所替代。