Sqlserver技術(shù)知識(shí)點(diǎn)之二十_第1頁
Sqlserver技術(shù)知識(shí)點(diǎn)之二十_第2頁
Sqlserver技術(shù)知識(shí)點(diǎn)之二十_第3頁
Sqlserver技術(shù)知識(shí)點(diǎn)之二十_第4頁
Sqlserver技術(shù)知識(shí)點(diǎn)之二十_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Sqlserver 技術(shù)知識(shí)點(diǎn)之二十系統(tǒng)存儲(chǔ)過程就是系統(tǒng)創(chuàng)建的存儲(chǔ)過程,目的在于能夠方便地從系統(tǒng)表中查詢信息或完成與更新數(shù)據(jù)庫表相關(guān)的管理任務(wù)或其它的系統(tǒng)管理任務(wù)。系統(tǒng)過程以“sp_"_ 為開頭,在Master 數(shù)據(jù)庫中創(chuàng)建并保存在該數(shù)據(jù)庫中,為數(shù)據(jù)庫管理者所有。一些系統(tǒng)過程只能由系統(tǒng)管理員使用,而有些系統(tǒng)過程通過授權(quán)可以被其它用戶所使用。系統(tǒng)存儲(chǔ)過程主要包括以下幾類:(這里主要給出每類系統(tǒng)過程中經(jīng)常使用的系統(tǒng)過程)在上面幾節(jié)我們介紹了一般意義的存儲(chǔ)過程,即用戶自定義的存儲(chǔ)過程和系統(tǒng)存儲(chǔ)過程。本節(jié)將介紹一種特殊的存儲(chǔ)過程,即觸發(fā)器。在余下各節(jié)中我們將對(duì)觸發(fā)器的概念、作用以及對(duì)其的使用

2、方法作詳盡介紹,使讀者了解如何定義觸發(fā)器,創(chuàng)建和使用各種不同復(fù)雜程度的觸發(fā)器。 觸發(fā)器的概念及作用    觸發(fā)器是一種特殊類型的存儲(chǔ)過程,它不同于我們前面介紹過的存儲(chǔ)過程。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,而存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用。當(dāng)對(duì)某一表進(jìn)行諸如UPDATE、 INSERT、 DELETE 這些操作時(shí),SQL Server 就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL 語句,從而確保對(duì)數(shù)據(jù)的處理必須符合由這些SQL 語句所定義的規(guī)則。    觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜

3、的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:(1) 強(qiáng)化約束(Enforce restriction)觸發(fā)器能夠?qū)崿F(xiàn)比CHECK 語句更為復(fù)雜的約束。 (2) 跟蹤變化Auditing changes觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。(3) 級(jí)聯(lián)運(yùn)行(Cascaded operation)。觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動(dòng)地級(jí)聯(lián)影響整個(gè)數(shù)據(jù)庫的各項(xiàng)內(nèi)容。例如,某個(gè)表上的觸發(fā)器中包含有對(duì)另外一個(gè)表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導(dǎo)致該表上觸發(fā)器被觸發(fā)。 (4) 存儲(chǔ)過程的調(diào)用(Stored procedure invo

4、cation)。為了響應(yīng)數(shù)據(jù)庫更新觸,發(fā)器可以調(diào)用一個(gè)或多個(gè)存儲(chǔ)過程,甚至可以通過外部過程的調(diào)用而在DBMS( 數(shù)據(jù)庫管理系統(tǒng))本身之外進(jìn)行操作。    由此可見,觸發(fā)器可以解決高級(jí)形式的業(yè)務(wù)規(guī)則或復(fù)雜行為限制以及實(shí)現(xiàn)定制記錄等一些方面的問題。例如,觸發(fā)器能夠找出某一表在數(shù)據(jù)修改前后狀態(tài)發(fā)生的差異,并根據(jù)這種差異執(zhí)行一定的處理。此外一個(gè)表的同一類型(INSERT、 UPDATE、 DELETE)的多個(gè)觸發(fā)器能夠?qū)ν环N數(shù)據(jù)操作采取多種不同的處理。    總體而言,觸發(fā)器性能通常比較低。當(dāng)運(yùn)行觸發(fā)器時(shí),系統(tǒng)處理的大部

5、分時(shí)間花費(fèi)在參照其它表的這一處理上,因?yàn)檫@些表既不在內(nèi)存中也不在數(shù)據(jù)庫設(shè)備上,而刪除表和插入表總是位于內(nèi)存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費(fèi)的時(shí)間長短。 觸發(fā)器的種類    SQL Server 2000 支持兩種類型的觸發(fā)器:AFTER 觸發(fā)器和INSTEAD OF 觸發(fā)器。其中AFTER 觸發(fā)器即為SQL Server 2000 版本以前所介紹的觸發(fā)器。該類型觸發(fā)器要求只有執(zhí)行某一操作(INSERT UPDATE DELETE) 之后,觸發(fā)器才被觸發(fā),且只能在表上定義??梢詾獒槍?duì)表的同一操作定義多個(gè)觸發(fā)器。對(duì)于AFTER 觸發(fā)器,可以

6、定義哪一個(gè)觸發(fā)器被最先觸發(fā),哪一個(gè)被最后觸發(fā),通常使用系統(tǒng)過程sp_settriggerorder 來完成此任務(wù)。    INSTEAD OF 觸發(fā)器表示并不執(zhí)行其所定義的操作(INSERT、 UPDATE、 DELETE),而僅是執(zhí)行觸發(fā)器本身。既可在表上定義INSTEAD OF 觸發(fā)器,也可以在視圖上定義INSTEAD OF 觸發(fā)器,但對(duì)同一操作只能定義一個(gè)INSTEAD OF 觸發(fā)器。上面介紹了有關(guān)觸發(fā)器的概念、作用和一些基本問題,下面我們將分別介紹在MS SQLServer 中如何用SQL Server 管理工具Enterprise Manage

7、r 和Transaction_SQL 來創(chuàng)建觸發(fā)器。在創(chuàng)建觸發(fā)器以前必須考慮到以下幾個(gè)方面: · CREATE TRIGGER 語句必須是批處理的第一個(gè)語句; · 表的所有者具有創(chuàng)建觸發(fā)器的缺省權(quán)限,表的所有者不能把該權(quán)限傳給其它用戶; · 觸發(fā)器是數(shù)據(jù)庫對(duì)象,所以其命名必須符合命名規(guī)則; · 盡管在觸發(fā)器的SQL 語句中可以參照其它數(shù)據(jù)庫中的對(duì)象,但是,觸發(fā)器只能創(chuàng)建在當(dāng)前數(shù)據(jù)庫中; · 雖然觸發(fā)器可以參照視圖或臨時(shí)表,但不能在視圖或臨時(shí)表上創(chuàng)建觸發(fā)器,而只能在基表或在創(chuàng)建視圖的表上創(chuàng)建觸發(fā)器; · 一個(gè)觸發(fā)器只能對(duì)應(yīng)一個(gè)表,這是由

8、觸發(fā)器的機(jī)制決定的; · 盡管TRUNCATE TABLE 語句如同沒有WHERE 從句的DELETE 語句,但是由于TRUNCATE TABLE 語句沒有被記入日志,所以該語句不能觸發(fā)DELETE 型觸發(fā)器; · WRITETEXT 語句不能觸發(fā)INSERT 或UPDATE 型的觸發(fā)器。      當(dāng)創(chuàng)建一個(gè)觸發(fā)器時(shí),必須指定觸發(fā)器的名字,在哪一個(gè)表上定義觸發(fā)器,激活觸發(fā) 器的修改語句,如INSERT、 DELETE、 UPDATE。 當(dāng)然兩個(gè)或三個(gè)不同的修改語句也可 以都觸發(fā)同一個(gè)觸發(fā)器,如INSERT 和UPDATE 語句都能激

9、活同一個(gè)觸發(fā)器。 用管理工具Enterprise Manger 創(chuàng)建觸發(fā)器其操作步驟如下:1. 啟動(dòng)Enterprise Manger, 登錄到指定的服務(wù)器上。 2. 展開數(shù)據(jù)庫,然后展開要在其上創(chuàng)建觸發(fā)器的表所在的數(shù)據(jù)庫,然后單擊該表。 3. 右擊鼠標(biāo),在彈出菜單中選擇ALL Tasks, 然后單擊Manage Triggers。 4. 在名字框中選擇new, 在文本框中輸入觸發(fā)器文本,如圖12-5 所示。 5. 單擊Check Syntax 檢查語句是否正確。 6. 單擊Apply, 在Name 下拉列表中會(huì)有新創(chuàng)建的觸發(fā)器名字。 7. 單擊OK, 關(guān)閉窗口創(chuàng)建成功。 用CREATE TR

10、IGGER 命令創(chuàng)建觸發(fā)器各參數(shù)的說明如下:· trigger_name是用戶要?jiǎng)?chuàng)建的觸發(fā)器的名字觸發(fā)器的名字,必須符合MS SQL Server 的命名規(guī)則,且其名字在當(dāng)前數(shù)據(jù)庫中必須是惟一的。 · Table是與用戶創(chuàng)建的觸發(fā)器相關(guān)聯(lián)的表的名字,并且該表已經(jīng)存在。 · WITH ENCRYPTION表示對(duì)包含有CREATE TRIGGER 文本的syscomments 表進(jìn)行加密。 · AFTER表示只有在執(zhí)行了指定的操作(INSERT、 DELETE、 UPDATE)之后觸發(fā)器才被激活,執(zhí)行觸發(fā)器中的SQL 語句。若使用關(guān)鍵字FOR, 則表示為AF

11、TER 觸發(fā)器,且該類型觸發(fā)器僅能在表上創(chuàng)建。 · INSTEAD OF請(qǐng)參看“12.8 INSTEAD OF 觸發(fā)器” · DELETE , INSERT , UPDATE關(guān)鍵字用來指明哪種數(shù)據(jù)操作將激活觸發(fā)器。至少要指明一個(gè)選項(xiàng),在觸發(fā)器的定義中三者的順序不受限制,且各選項(xiàng)要用逗號(hào)隔開。 · WITH APPEND表明增加另外一個(gè)已存在某一類型觸發(fā)器。只有在兼容性水平(指某一數(shù)據(jù)庫行為與以前版本的MS SQL Server 兼容程度)不大于65 時(shí)才使用該選項(xiàng)。 · NOT FOR REPLICATION表明當(dāng)復(fù)制處理修改與觸發(fā)器相關(guān)聯(lián)的表時(shí),觸發(fā)器

12、不能被執(zhí)行。 · AS是觸發(fā)器將要執(zhí)行的動(dòng)作。 · Sql_statement是包含在觸發(fā)器中的條件語句或處理語句。觸發(fā)器的條件語句定義了另外的標(biāo)準(zhǔn)來決定將被執(zhí)行的INSERT、 DELETE、 UPDATE 語句是否激活觸發(fā)器。 · IF UPDATE (column)用來測定對(duì)某一確定列是插入操作還是更新操作,但不與刪除操作用在一起。 · IF (COLUMNS_UPDATED()僅在INSERT 和UPDATE 類型的觸發(fā)器中使用,用其來檢查所涉及的列是被更新還是被插入。 · Bitwise_operatorj是在比較中使用的位邏輯運(yùn)算符

13、。 · Pdated_bitmask是那些被更新或插入的列的整形位掩碼。例如,如果表T 包括C1, C2, C3, C4, C5五列。為了確定是否只有C2 列被修改,可用2 來做位掩碼,如果想確定是否C1, C2, C3,C4 都被修改,可用14 來做位掩碼。 · Comparison_operator是一比較操作符用“= ”表示檢查在updated_bitmask 中定義的所有列是否都被更新,用“>” 表示檢查是否在updated_bitmask 中定義的某些列被更新。 · Column_bitmask指那些被檢查是否被更新的列的位掩碼。從以上的介紹中我們

14、可以看出觸發(fā)器具有強(qiáng)大的功能,那么MS SQL Server 是如何管理觸發(fā)器來完成這些任務(wù)呢?下面我們將對(duì)其工作原理及實(shí)現(xiàn)做較為詳細(xì)的介紹。    每個(gè)觸發(fā)器有兩個(gè)特殊的表:插入表和刪除表。這兩個(gè)表是邏輯表,并且這兩個(gè)表是由系統(tǒng)管理的,存儲(chǔ)在內(nèi)存中,不是存儲(chǔ)在數(shù)據(jù)庫中,因此不允許用戶直接對(duì)其修改。這兩個(gè)表的結(jié)構(gòu)總是與被該觸發(fā)器作用的表有相同的表結(jié)構(gòu)。這兩個(gè)表是動(dòng)態(tài)駐留在內(nèi)存中的,當(dāng)觸發(fā)器工作完成,這兩個(gè)表也被刪除。這兩個(gè)表主要保存因用戶操作而被影響到的原數(shù)據(jù)值或新數(shù)據(jù)值。另外,這兩個(gè)表是只讀的,即用戶不能向這兩個(gè)表寫入內(nèi)容,但可以引用表中的數(shù)據(jù)。例如可

15、用如下語句查看DELETED 表中的信息:select * from deleted下面詳細(xì)介紹這兩個(gè)表的功能: 插入表的功能    對(duì)一個(gè)定義了插入類型觸發(fā)器的表來講,一旦對(duì)該表執(zhí)行了插入操作,那么對(duì)向該表插入的所有行來說,都有一個(gè)相應(yīng)的副本存放到插入表中。即插入表就是用來存儲(chǔ)向原表插入的內(nèi)容。 刪除表的功能    對(duì)一個(gè)定義了刪除類型觸發(fā)器的表來講,一旦對(duì)該表執(zhí)行了刪除操作,則將所有的刪除行存放至刪除表中。這樣做的目的是,一旦觸發(fā)器遇到了強(qiáng)迫它中止的語句被執(zhí)行時(shí),刪除的那些行可以從刪除表中得以恢復(fù)。    需要強(qiáng)調(diào)的是,更新操作包括兩個(gè)部分,即先將更新的內(nèi)容去掉,然后將新值插入。因此對(duì)一個(gè)定義了更新類型觸發(fā)器的表來講,當(dāng)報(bào)告會(huì)更新操作時(shí),在刪除表中存放了舊

溫馨提示

  • 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)論