第13章觸發(fā)器原理及使用_第1頁
第13章觸發(fā)器原理及使用_第2頁
第13章觸發(fā)器原理及使用_第3頁
第13章觸發(fā)器原理及使用_第4頁
第13章觸發(fā)器原理及使用_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 觸發(fā)器是一種特殊類型的存儲(chǔ)過程,觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它在用戶使用它在用戶使用UPDATEUPDATE、INSERTINSERT和和DELETEDELETE語句修改關(guān)系中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行。語句修改關(guān)系中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行。第第1313章章 觸發(fā)器原理及使用觸發(fā)器原理及使用 113.1 觸發(fā)器基本概念觸發(fā)器基本概念13.2 觸發(fā)器原理觸發(fā)器原理13.3 觸發(fā)器的創(chuàng)建和管理觸發(fā)器的創(chuàng)建和管理13.4 使用觸發(fā)器實(shí)現(xiàn)強(qiáng)制業(yè)務(wù)規(guī)則使用觸發(fā)器實(shí)現(xiàn)強(qiáng)制業(yè)務(wù)規(guī)則13.5 使用觸發(fā)器的使用觸發(fā)器的T-SQL限制限制13.6 觸發(fā)器應(yīng)用實(shí)例分析觸發(fā)器應(yīng)用實(shí)例分析213.1 13.1 觸發(fā)器基本概念觸發(fā)

2、器基本概念 13.1.1 13.1.1 觸發(fā)器的概念及作用觸發(fā)器的概念及作用觸發(fā)器可以看作是一類特殊的存儲(chǔ)過程,它在滿足某個(gè)特定觸發(fā)器可以看作是一類特殊的存儲(chǔ)過程,它在滿足某個(gè)特定條件時(shí)自動(dòng)觸發(fā)執(zhí)行。條件時(shí)自動(dòng)觸發(fā)執(zhí)行。 觸發(fā)器是為表上的更新、插入、刪除操作觸發(fā)器是為表上的更新、插入、刪除操作定義的,也就是說當(dāng)表上發(fā)生更新、插入或刪除操作時(shí)觸發(fā)器將定義的,也就是說當(dāng)表上發(fā)生更新、插入或刪除操作時(shí)觸發(fā)器將執(zhí)行。存儲(chǔ)過程和觸發(fā)器同是提高數(shù)據(jù)庫服務(wù)器性能的有力工具。執(zhí)行。存儲(chǔ)過程和觸發(fā)器同是提高數(shù)據(jù)庫服務(wù)器性能的有力工具。觸發(fā)器作為一種特殊類型的存儲(chǔ)過程,它不同于我們前面介觸發(fā)器作為一種特殊類型的存

3、儲(chǔ)過程,它不同于我們前面介紹過的存儲(chǔ)過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,紹過的存儲(chǔ)過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用。當(dāng)對(duì)某一表進(jìn)而存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用。當(dāng)對(duì)某一表進(jìn)行諸如行諸如UPDATE、INSERT、DELETE這些操作時(shí),這些操作時(shí),SQL Server就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL語句,從而確保對(duì)數(shù)據(jù)的處理語句,從而確保對(duì)數(shù)據(jù)的處理必須符合由這些必須符合由這些SQL語句所定義的規(guī)則。語句所定義的規(guī)則。 3觸發(fā)器還有其它許多不同的功能:觸發(fā)器還有其它許多不同的功能:(1)強(qiáng)化

4、約束()強(qiáng)化約束(Enforce restriction)觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的更新和變化??傻母潞妥兓?。(2)級(jí)聯(lián)運(yùn)行()級(jí)聯(lián)運(yùn)行(Cascaded Operation)觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級(jí)聯(lián)影響整個(gè)數(shù)據(jù)觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級(jí)聯(lián)影響整個(gè)數(shù)據(jù)庫的各項(xiàng)內(nèi)容。例如,某個(gè)表上的觸發(fā)器包含對(duì)另外一個(gè)表的庫的各項(xiàng)內(nèi)容。例如,某個(gè)表上的觸發(fā)器包含對(duì)另外一個(gè)表的數(shù)據(jù)操作(如刪除、更新、插入),而該操作又導(dǎo)致該表上的數(shù)據(jù)操作(如刪除、更新、插入),而該操作又導(dǎo)致該表上的觸發(fā)器被觸發(fā)

5、。觸發(fā)器被觸發(fā)。(3)存儲(chǔ)過程的調(diào)用()存儲(chǔ)過程的調(diào)用(Stored Procedure Invocation)為了響應(yīng))為了響應(yīng)數(shù)據(jù)庫更新,觸發(fā)器可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程,甚至可以數(shù)據(jù)庫更新,觸發(fā)器可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程,甚至可以通過外部過程的調(diào)用而在通過外部過程的調(diào)用而在DBMS之外進(jìn)行操作。之外進(jìn)行操作。4 13.1.2 13.1.2 觸發(fā)器的種類觸發(fā)器的種類 SQL Server 2000支持兩種類型的觸發(fā)器:支持兩種類型的觸發(fā)器:AFTER觸發(fā)器和觸發(fā)器和INSTEAD OF觸發(fā)器。觸發(fā)器。 (1)AFTER觸發(fā)器觸發(fā)器 即為即為SQL Server 2000版本以前所介紹的觸

6、發(fā)器。該類型觸發(fā)器要版本以前所介紹的觸發(fā)器。該類型觸發(fā)器要求只有執(zhí)行完某一操作(求只有執(zhí)行完某一操作(INSERT、UPDATE、DELETE),并),并處理過所有約束后,觸發(fā)器才被觸發(fā),且只能在表上定義。如果處理過所有約束后,觸發(fā)器才被觸發(fā),且只能在表上定義。如果操作違反約束條件,將導(dǎo)致事務(wù)回滾,這時(shí)就不會(huì)執(zhí)行后觸發(fā)器。操作違反約束條件,將導(dǎo)致事務(wù)回滾,這時(shí)就不會(huì)執(zhí)行后觸發(fā)器。513.1.2 13.1.2 觸發(fā)器的種類觸發(fā)器的種類 (2)INSTEAD OF觸發(fā)器觸發(fā)器 該類觸發(fā)器表示并不執(zhí)行其所定義的操作(該類觸發(fā)器表示并不執(zhí)行其所定義的操作(INSERT、UPDATE、DELETE),而

7、僅是執(zhí)行觸發(fā)器本身。既可在表上定義),而僅是執(zhí)行觸發(fā)器本身。既可在表上定義INSTEAD OF觸發(fā)器,也可以在視圖上定義觸發(fā)器,也可以在視圖上定義INSTEAD OF觸發(fā)器,觸發(fā)器,但對(duì)同一操作只能定義一個(gè)但對(duì)同一操作只能定義一個(gè)INSTEAD OF觸發(fā)器。觸發(fā)器。613.2 13.2 觸發(fā)器原理觸發(fā)器原理 從以上的介紹中我們可以已了解到觸發(fā)器具有強(qiáng)大從以上的介紹中我們可以已了解到觸發(fā)器具有強(qiáng)大的功能,那么的功能,那么MS SQL Server 是如何使得觸發(fā)器能夠感是如何使得觸發(fā)器能夠感知數(shù)據(jù)庫數(shù)據(jù)的變化、維護(hù)數(shù)據(jù)庫參照完整性及比知數(shù)據(jù)庫數(shù)據(jù)的變化、維護(hù)數(shù)據(jù)庫參照完整性及比CHECK約束更復(fù)

8、雜的約束呢?下面我們將對(duì)其工作原約束更復(fù)雜的約束呢?下面我們將對(duì)其工作原理及實(shí)現(xiàn)做較為詳細(xì)的介紹,以便大家學(xué)習(xí)創(chuàng)建、理解理及實(shí)現(xiàn)做較為詳細(xì)的介紹,以便大家學(xué)習(xí)創(chuàng)建、理解和使用各種類型的觸發(fā)器,完成各種任務(wù)。和使用各種類型的觸發(fā)器,完成各種任務(wù)。713.2.1 13.2.1 插入表的功能插入表的功能對(duì)一個(gè)定義了插入類型觸發(fā)器的表來講,一對(duì)一個(gè)定義了插入類型觸發(fā)器的表來講,一旦對(duì)該表執(zhí)行了插入(旦對(duì)該表執(zhí)行了插入(INSERT)操作,那么對(duì)該)操作,那么對(duì)該表插入的所有行來說,都有一個(gè)相應(yīng)的副本級(jí)存表插入的所有行來說,都有一個(gè)相應(yīng)的副本級(jí)存放到插入表(放到插入表(inserted)中,即插入表就是

9、用來存)中,即插入表就是用來存儲(chǔ)原表插入的新數(shù)據(jù)行。儲(chǔ)原表插入的新數(shù)據(jù)行。813.2.2 13.2.2 刪除表的功能刪除表的功能 對(duì)一個(gè)定義了刪除類型觸發(fā)器的表來講,一旦對(duì)該對(duì)一個(gè)定義了刪除類型觸發(fā)器的表來講,一旦對(duì)該表執(zhí)行了刪除(表執(zhí)行了刪除(DELETE)操作,則將所有的被刪)操作,則將所有的被刪除的行存放至刪除表(除的行存放至刪除表(deleted表)中。這樣做的目表)中。這樣做的目的是,一旦觸發(fā)器遇到了強(qiáng)迫它中止的語句被執(zhí)行的是,一旦觸發(fā)器遇到了強(qiáng)迫它中止的語句被執(zhí)行時(shí),刪除的那些行可以從刪除表(時(shí),刪除的那些行可以從刪除表(deleted表)中得表)中得以還原。以還原。 9更新(UP

10、DATE)操作 需要強(qiáng)調(diào)的是,更新(需要強(qiáng)調(diào)的是,更新(UPDATE)操作包括兩個(gè))操作包括兩個(gè)部分,即先將舊的內(nèi)容刪除,然后將新值插入。部分,即先將舊的內(nèi)容刪除,然后將新值插入。因此,對(duì)一個(gè)定義了更新類型觸發(fā)器的表來講,因此,對(duì)一個(gè)定義了更新類型觸發(fā)器的表來講,當(dāng)執(zhí)行更新操作時(shí),在刪除表中存放了修改之前當(dāng)執(zhí)行更新操作時(shí),在刪除表中存放了修改之前的舊值,然后在插入表中存放的是修改之后的新的舊值,然后在插入表中存放的是修改之后的新值。值。1013.2.3 13.2.3 插入視圖和刪除視圖插入視圖和刪除視圖 當(dāng)在定義了觸發(fā)器的表上發(fā)生修改操作時(shí)會(huì)自當(dāng)在定義了觸發(fā)器的表上發(fā)生修改操作時(shí)會(huì)自動(dòng)派生出兩

11、個(gè)視圖,一個(gè)是插入視圖,一個(gè)是刪除視動(dòng)派生出兩個(gè)視圖,一個(gè)是插入視圖,一個(gè)是刪除視圖。當(dāng)在表上發(fā)生插入操作時(shí),新插入的行將出現(xiàn)在圖。當(dāng)在表上發(fā)生插入操作時(shí),新插入的行將出現(xiàn)在inserted表中形成插入視圖;當(dāng)在表上發(fā)生刪除操作表中形成插入視圖;當(dāng)在表上發(fā)生刪除操作時(shí),被刪除的舊行將出現(xiàn)時(shí),被刪除的舊行將出現(xiàn)deleted表中,形成刪除視圖。表中,形成刪除視圖。而更新的實(shí)現(xiàn)過程是先刪除舊行,然后再插入新行。而更新的實(shí)現(xiàn)過程是先刪除舊行,然后再插入新行。1113.3.1 13.3.1 創(chuàng)建觸發(fā)器創(chuàng)建觸發(fā)器 上面介紹了有關(guān)觸發(fā)器的概念、作用和工作上面介紹了有關(guān)觸發(fā)器的概念、作用和工作原理,下面我們

12、將分別介紹在原理,下面我們將分別介紹在MS SQLServer 中如中如何用何用SQL Server管理工具管理工具Enterprise Manager和和Transaction_SQL來創(chuàng)建觸發(fā)器。來創(chuàng)建觸發(fā)器。13.3 13.3 觸發(fā)器的創(chuàng)建和管理觸發(fā)器的創(chuàng)建和管理121用對(duì)象資源管理器創(chuàng)建觸發(fā)器用對(duì)象資源管理器創(chuàng)建觸發(fā)器步驟如下:步驟如下: 啟動(dòng)對(duì)象資源管理器,登錄到要使用的服務(wù)器。啟動(dòng)對(duì)象資源管理器,登錄到要使用的服務(wù)器。 在對(duì)象資源管理器的左窗格中,展開要?jiǎng)?chuàng)建觸發(fā)器的數(shù)據(jù)庫文在對(duì)象資源管理器的左窗格中,展開要?jiǎng)?chuàng)建觸發(fā)器的數(shù)據(jù)庫文件夾,單擊件夾,單擊“表表”文件夾前面的文件夾前面的“+

13、”號(hào),此時(shí)在右窗格中顯號(hào),此時(shí)在右窗格中顯示該數(shù)據(jù)庫的所有表。示該數(shù)據(jù)庫的所有表。 選擇創(chuàng)建觸發(fā)器的表,單擊要?jiǎng)?chuàng)建觸發(fā)器的數(shù)據(jù)表前面的選擇創(chuàng)建觸發(fā)器的表,單擊要?jiǎng)?chuàng)建觸發(fā)器的數(shù)據(jù)表前面的“+”號(hào),右擊觸發(fā)器選項(xiàng),在出現(xiàn)的下一級(jí)子菜單中選擇號(hào),右擊觸發(fā)器選項(xiàng),在出現(xiàn)的下一級(jí)子菜單中選擇“新建觸新建觸發(fā)器發(fā)器”菜單項(xiàng)。菜單項(xiàng)。 132 2用用CREATE TRIGGERCREATE TRIGGER命令創(chuàng)建觸發(fā)器命令創(chuàng)建觸發(fā)器語法格式:語法格式: CREATE TRIGGER trigger_name ON table | view WITH ENCRYPTION FOR | AFTER | INST

14、EAD OF INSERT , UPDATE WITH APPEND NOT FOR REPLICATION 14AS IF UPDATE ( column ) AND | OR UPDATE ( column ) .n | IF ( COLUMNS_UPDATED ( ) bitwise_operator updated_bitmask ) comparison_operator column_bitmask .n Sql 語句語句 .n 15【例13-1】創(chuàng)建一個(gè)觸發(fā)器,當(dāng)向STUDENT表中插入一條學(xué)生記錄時(shí),自動(dòng)顯示該表中的記錄。USE 教學(xué)管理GOCREATE TRIGGER T_學(xué)

15、生表改變顯示 On 學(xué)生表FOR INSERTASBEGINIF (COLUMNS_UPDATED()&1=1) SELECT * FROM 學(xué)生表END-驗(yàn)證 BEGIN TRANSACTIONINSERT INTO 學(xué)生表VALUES(S090103, *19971021*, 李飛, 男, 130*12, 溫州, 計(jì)算機(jī), 信電學(xué)院, 160)ROLLBACK TRANSACTION 該觸發(fā)器建立完畢后,當(dāng)對(duì)學(xué)生表的插入操作執(zhí)行成功時(shí),將會(huì)顯示學(xué)生表中的全部記錄。1613.3.2 13.3.2 管理觸發(fā)器管理觸發(fā)器1使用對(duì)象資源管理器顯示觸發(fā)器信息使用對(duì)象資源管理器顯示觸發(fā)器信息步

16、驟如下。步驟如下。(1)啟動(dòng)對(duì)象資源管理器,登錄到要使用的服務(wù)器。)啟動(dòng)對(duì)象資源管理器,登錄到要使用的服務(wù)器。 (2)在對(duì)象資源管理器的左窗格中,展開要?jiǎng)?chuàng)建觸)在對(duì)象資源管理器的左窗格中,展開要?jiǎng)?chuàng)建觸發(fā)器的數(shù)據(jù)庫文件夾,單擊發(fā)器的數(shù)據(jù)庫文件夾,單擊“表表”文件夾前面的文件夾前面的“+”號(hào),在下面顯示該數(shù)據(jù)庫的所有表。號(hào),在下面顯示該數(shù)據(jù)庫的所有表。 (3)單擊要修改觸發(fā)器的數(shù)據(jù)表前面的)單擊要修改觸發(fā)器的數(shù)據(jù)表前面的“+”號(hào),出號(hào),出現(xiàn)觸發(fā)器選項(xiàng),再單擊觸發(fā)器前面的現(xiàn)觸發(fā)器選項(xiàng),再單擊觸發(fā)器前面的“+”號(hào),下面號(hào),下面顯示該表上建立的所有觸發(fā)器,將鼠標(biāo)指向要修改的顯示該表上建立的所有觸發(fā)器,將

17、鼠標(biāo)指向要修改的觸發(fā)器,單擊右鍵,在出現(xiàn)的下一級(jí)子菜單中選擇觸發(fā)器,單擊右鍵,在出現(xiàn)的下一級(jí)子菜單中選擇“修改修改”菜單項(xiàng),就會(huì)出現(xiàn)修改該觸發(fā)器的文本框菜單項(xiàng),就會(huì)出現(xiàn)修改該觸發(fā)器的文本框.172使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器(1)sp_help通過該系統(tǒng)過程,可以了解觸發(fā)器的一般信息,如觸發(fā)通過該系統(tǒng)過程,可以了解觸發(fā)器的一般信息,如觸發(fā)器的名字、屬性、類型、創(chuàng)建時(shí)間。使用器的名字、屬性、類型、創(chuàng)建時(shí)間。使用sp_help系系統(tǒng)過程的命令格式為:統(tǒng)過程的命令格式為: sp_help 觸發(fā)器名字觸發(fā)器名字【例【例13-2】查看我們已經(jīng)建立的】查看我們已經(jīng)建立的“T_表改變

18、顯示表改變顯示”觸發(fā)器。觸發(fā)器。 sp_help T_表改變顯示表改變顯示 18(2)sp_helptext通過通過sp_helptext查看觸發(fā)器的正文信息,其語法格式為:查看觸發(fā)器的正文信息,其語法格式為: sp_helptext 觸發(fā)器名觸發(fā)器名【例【例13-3】查看我們已經(jīng)建立的】查看我們已經(jīng)建立的chang_display觸發(fā)器的觸發(fā)器的命令文本。命令文本。 sp_helptext T_表改變顯示表改變顯示 (3)sp_depends通過通過sp_depends查看指定觸發(fā)器所引用的表或指定的表查看指定觸發(fā)器所引用的表或指定的表所涉及到的所有觸發(fā)器。其語法形式如下:所涉及到的所有觸發(fā)

19、器。其語法形式如下: sp_depends 觸發(fā)器名字觸發(fā)器名字 sp_depends 表名表名【例【例13-4】查看】查看T_表改變顯示表改變顯示觸發(fā)器所涉及的表。觸發(fā)器所涉及的表。 sp_depends T_表改變顯示表改變顯示 2使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器1913.3.3 13.3.3 修改、刪除觸發(fā)器修改、刪除觸發(fā)器1修改觸發(fā)器修改觸發(fā)器(1)使用)使用sp_rename命令,修改觸發(fā)器的名字命令,修改觸發(fā)器的名字sp_rename命令的語法格式為:命令的語法格式為:sp_rename oldname, newname20(2)使用)使用Alert trigg

20、er,修改觸發(fā)器的正文,修改觸發(fā)器的正文 語法格式:語法格式: ALTER TRIGGER trigger_name ON table | view WITH ENCRYPTION FOR | AFTER | INSTEAD OF INSERT , UPDATE WITH APPEND NOT FOR REPLICATION AS IF UPDATE ( column ) AND | OR UPDATE ( column ) .n | IF ( COLUMNS_UPDATED ( ) bitwise_operator updated_bitmask ) comparison_operator

21、column_bitmask .n Sql 語句語句 .n 21語法格式:語法格式:DROP TRIGGER trigger_name ,.n 【例【例13-5】除去】除去“T_表改變顯示表改變顯示”觸發(fā)器。觸發(fā)器。USE 教學(xué)管理教學(xué)管理GOIF EXISTS (SELECT name FROM sysobjects WHERE name =T_表改變顯示表改變顯示 AND type = TR) DROP TRIGGER T_表改變顯示表改變顯示GO2刪除觸發(fā)器刪除觸發(fā)器2213.4 13.4 使用觸發(fā)器實(shí)現(xiàn)強(qiáng)制業(yè)務(wù)規(guī)則使用觸發(fā)器實(shí)現(xiàn)強(qiáng)制業(yè)務(wù)規(guī)則13.4.1 INSERT13.4.1 INS

22、ERT觸發(fā)器觸發(fā)器 INSERTINSERT出發(fā)器當(dāng)向表中添加記錄時(shí)觸發(fā),為了維出發(fā)器當(dāng)向表中添加記錄時(shí)觸發(fā),為了維護(hù)數(shù)據(jù)完整性,當(dāng)表中添加了新的記錄后,應(yīng)該對(duì)其關(guān)護(hù)數(shù)據(jù)完整性,當(dāng)表中添加了新的記錄后,應(yīng)該對(duì)其關(guān)聯(lián)表的數(shù)據(jù)進(jìn)行調(diào)整,以實(shí)時(shí)反應(yīng)數(shù)據(jù)的變化。例如當(dāng)聯(lián)表的數(shù)據(jù)進(jìn)行調(diào)整,以實(shí)時(shí)反應(yīng)數(shù)據(jù)的變化。例如當(dāng)某個(gè)學(xué)生選定了某門課的開課計(jì)劃后,應(yīng)當(dāng)更新選課人某個(gè)學(xué)生選定了某門課的開課計(jì)劃后,應(yīng)當(dāng)更新選課人數(shù)。數(shù)。 需要用到需要用到insertedinserted表,因?yàn)樽霰?,因?yàn)樽鯥NSERTINSERT操作時(shí),在操作時(shí),在insertedinserted表中存放的是要增加到該觸發(fā)器作用的表中表中

23、存放的是要增加到該觸發(fā)器作用的表中的新的元組,而的新的元組,而deleteddeleted表示此時(shí)為空。表示此時(shí)為空。23 13.4.2 UPDATE觸發(fā)器觸發(fā)器 當(dāng)更新表中的元組時(shí)觸發(fā)執(zhí)行當(dāng)更新表中的元組時(shí)觸發(fā)執(zhí)行UPDATE觸發(fā)器??梢杂糜|發(fā)器??梢杂肬PDATE (column)測試在指定的列上進(jìn)行的測試在指定的列上進(jìn)行的INSERT或或UPDATE操作,不能用于操作,不能用于 DELETE 操作??梢灾付ǘ嗔?。因?yàn)樵诓僮鳌?梢灾付ǘ嗔小R驗(yàn)樵贠N子句子句中指定了表名,所以在中指定了表名,所以在IF UPDATE子句中的列名前不要包含表名。子句中的列名前不要包含表名。在在INSERT操作

24、中操作中IF UPDATE將返回將返回TRUE值,因?yàn)檫@些列插入值,因?yàn)檫@些列插入了顯式值或隱性(了顯式值或隱性(NULL)值。也可以用)值。也可以用COLUMNS_UPDATED()來測試是否更新了指定的列。來測試是否更新了指定的列。COLUMNS_UPDATED函數(shù)返回函數(shù)返回varbinary位模式,表示插入或位模式,表示插入或更新了表中的哪些列。更新了表中的哪些列。COLUMNS_UPDATED函數(shù)以從左到右的函數(shù)以從左到右的順序返回位,最右邊的位表示表中的第一列;向左的下一位表示順序返回位,最右邊的位表示表中的第一列;向左的下一位表示第二列,依此類推。第二列,依此類推。24 13.4

25、.3 DELETE 13.4.3 DELETE 觸發(fā)器觸發(fā)器 當(dāng)刪除表中數(shù)據(jù)時(shí)觸發(fā)執(zhí)行當(dāng)刪除表中數(shù)據(jù)時(shí)觸發(fā)執(zhí)行DELETEDELETE觸發(fā)器,用它可以實(shí)現(xiàn)觸發(fā)器,用它可以實(shí)現(xiàn)級(jí)聯(lián)刪除。此時(shí),用到級(jí)聯(lián)刪除。此時(shí),用到deleteddeleted表,該表中存放的是剛剛表,該表中存放的是剛剛被刪除的那些元組,而被刪除的那些元組,而insertedinserted表為空。表為空。2513.4.4 INSTEAD OF 觸發(fā)器觸發(fā)器 用用INSTEAD OF可以指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā)語句本可以指定執(zhí)行觸發(fā)器而不是執(zhí)行觸發(fā)語句本身,從而屏蔽原來的身,從而屏蔽原來的SQL語句,而轉(zhuǎn)向執(zhí)行觸發(fā)器內(nèi)部的語

26、句,而轉(zhuǎn)向執(zhí)行觸發(fā)器內(nèi)部的SQL語語句。對(duì)同一操作只能定義一個(gè)句。對(duì)同一操作只能定義一個(gè)INSTEAD OF觸發(fā)器。觸發(fā)器。 可以用可以用INSTEAD OF進(jìn)行業(yè)務(wù)規(guī)則的判斷,進(jìn)而決定是否執(zhí)進(jìn)行業(yè)務(wù)規(guī)則的判斷,進(jìn)而決定是否執(zhí)行觸發(fā)行觸發(fā)SQL語句。語句。2613.4.5 遞歸觸發(fā)器遞歸觸發(fā)器當(dāng)在當(dāng)在sp_dboption中啟用中啟用recursive triggers設(shè)置時(shí),設(shè)置時(shí),SQL Server還允許觸發(fā)器的遞歸調(diào)用。還允許觸發(fā)器的遞歸調(diào)用。遞歸觸發(fā)器允許發(fā)生兩種類型的遞歸:遞歸觸發(fā)器允許發(fā)生兩種類型的遞歸: p 間接遞歸間接遞歸p 直接遞歸直接遞歸 使用間接遞歸時(shí),應(yīng)用程序更新表使

27、用間接遞歸時(shí),應(yīng)用程序更新表T1,從而激發(fā)觸發(fā)器,從而激發(fā)觸發(fā)器TR1,該,該觸發(fā)器更新表觸發(fā)器更新表T2。在這種情況下,觸發(fā)器。在這種情況下,觸發(fā)器T2將激發(fā)并更新將激發(fā)并更新T1。使用直接遞歸時(shí),應(yīng)用程序更新表使用直接遞歸時(shí),應(yīng)用程序更新表T1,從而激發(fā)觸發(fā)器,從而激發(fā)觸發(fā)器TR1,該,該觸發(fā)器更新表觸發(fā)器更新表T1。由于表。由于表T1被更新,觸發(fā)器被更新,觸發(fā)器TR1再次激發(fā),再次激發(fā),依此類推。依此類推。2713.5 13.5 使用觸發(fā)器的使用觸發(fā)器的T-SQLT-SQL限制限制CREATE TRIGGER必須是批處理中的第一條語句,并且只能應(yīng)必須是批處理中的第一條語句,并且只能應(yīng)用到

28、一個(gè)表中。用到一個(gè)表中。觸發(fā)器只能在當(dāng)前的數(shù)據(jù)庫中創(chuàng)建,不過觸發(fā)器可以引用當(dāng)前數(shù)觸發(fā)器只能在當(dāng)前的數(shù)據(jù)庫中創(chuàng)建,不過觸發(fā)器可以引用當(dāng)前數(shù)據(jù)庫的外部對(duì)象。據(jù)庫的外部對(duì)象。如果指定觸發(fā)器所有者名稱以限定觸發(fā)器,請(qǐng)以相同的方式限定如果指定觸發(fā)器所有者名稱以限定觸發(fā)器,請(qǐng)以相同的方式限定表名。表名。在同一條在同一條CREATE TRIGGER語句中,可以為多種用戶操作(如語句中,可以為多種用戶操作(如INSERT和和UPDATE)定義相同的觸發(fā)器操作。)定義相同的觸發(fā)器操作。 2813.6 13.6 觸發(fā)器應(yīng)用實(shí)例分析觸發(fā)器應(yīng)用實(shí)例分析分析分析1 1:由于學(xué)生選課管理的實(shí)際情況,學(xué)生在期初或前一:由于

29、學(xué)生選課管理的實(shí)際情況,學(xué)生在期初或前一學(xué)期結(jié)束之前就進(jìn)行選課,而成績是在學(xué)期末考試后輸入,學(xué)期結(jié)束之前就進(jìn)行選課,而成績是在學(xué)期末考試后輸入,所以錄入成績實(shí)際上是對(duì)所以錄入成績實(shí)際上是對(duì)ENROLLENTENROLLENT表的數(shù)據(jù)的修改。故我表的數(shù)據(jù)的修改。故我們可以創(chuàng)建該表的修改觸發(fā)器,實(shí)現(xiàn)學(xué)分的自動(dòng)累計(jì)。由們可以創(chuàng)建該表的修改觸發(fā)器,實(shí)現(xiàn)學(xué)分的自動(dòng)累計(jì)。由于成績修改于成績修改UPDATEUPDATE語句可能涉及多個(gè)學(xué)生,故我們要在觸語句可能涉及多個(gè)學(xué)生,故我們要在觸發(fā)器中使用游標(biāo)對(duì)每個(gè)學(xué)生進(jìn)行判斷修改。發(fā)器中使用游標(biāo)對(duì)每個(gè)學(xué)生進(jìn)行判斷修改。29CREATE TRIGGER T_選課學(xué)分修

30、改選課學(xué)分修改ON 選課表選課表FOR UPDATEASBEGINIF (ROWCOUNT0) BEGIN DECLARE old_成績成績FLOAT, new_成績成績FLOAT DECLARE 學(xué)號(hào)學(xué)號(hào)_d CHAR(7),開課號(hào)開課號(hào)_d CHAR(6),學(xué)號(hào)學(xué)號(hào)_i CHAR(7),開課號(hào)開課號(hào)_i CHAR(6) DECLARE 學(xué)分學(xué)分INT DECLARE CUR_選課新信息選課新信息CURSOR FOR SELECT 學(xué)號(hào)學(xué)號(hào),開課號(hào)開課號(hào),成績成績 FROM inserted DECLARE CUR_選課舊信息選課舊信息CURSOR FOR SELECT 學(xué)號(hào)學(xué)號(hào),開課號(hào)開課

31、號(hào),成績成績 FROM deleted 【例【例13-1213-12】創(chuàng)建選課表的】創(chuàng)建選課表的UPDATEUPDATE觸發(fā)器,實(shí)現(xiàn)學(xué)分的級(jí)聯(lián)觸發(fā)器,實(shí)現(xiàn)學(xué)分的級(jí)聯(lián)修改。修改。30 OPEN CUR_選課新信息選課新信息 OPEN CUR_選課舊信息選課舊信息 FETCH NEXT FROM CUR_選課新信息選課新信息 INTO 學(xué)號(hào)學(xué)號(hào)_i, 開課號(hào)開課號(hào)_i,new_成績成績 FETCH NEXT FROM CUR_選課舊信息選課舊信息 INTO 學(xué)號(hào)學(xué)號(hào)_d, 開課號(hào)開課號(hào)_d,old_成績成績 SELECT 學(xué)分學(xué)分=學(xué)分學(xué)分 FROM 開課表開課表O,課程表課程表C WHERE O

32、.課號(hào)課號(hào)=C.課號(hào)課號(hào)AND 開課號(hào)開課號(hào)=開課號(hào)開課號(hào)_i WHILE fetch_status=0 BEGIN IF (old_成績成績is NULL) AND (new_成績成績=60) UPDATE 學(xué)生表學(xué)生表 SET 累計(jì)學(xué)分累計(jì)學(xué)分=累計(jì)學(xué)分累計(jì)學(xué)分+學(xué)分學(xué)分 WHERE 學(xué)號(hào)學(xué)號(hào)=學(xué)號(hào)學(xué)號(hào)_i IF (old_成績成績= 60) UPDATE 學(xué)生表學(xué)生表 SET 累計(jì)學(xué)分累計(jì)學(xué)分=累計(jì)學(xué)分累計(jì)學(xué)分+學(xué)分學(xué)分 WHERE 學(xué)號(hào)學(xué)號(hào)=學(xué)號(hào)學(xué)號(hào)_i 31IF (old_成績成績= 60) AND (new_成績成績0)BEGIN DECLARE 成績成績FLOAT DECLARE 學(xué)號(hào)學(xué)號(hào)CHAR(7),開課號(hào)開課號(hào)CHAR(6) DECLARE 學(xué)分學(xué)分INT DECLARE CUR_選課刪除選課刪除CURSOR FOR SELECT 學(xué)號(hào)學(xué)號(hào),開課號(hào)開課號(hào),成績成績 FROM deleted35OPEN CUR_選課刪除選課刪除FETCH NEXT FROM CUR_選課刪除選課刪除INTO 學(xué)號(hào)學(xué)號(hào), 開課號(hào)開課號(hào), 成績成績SELECT 學(xué)分學(xué)分=學(xué)分學(xué)分 FROM 開課表開課表O,課程表課程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論