存儲(chǔ)過程和觸發(fā)器_第1頁
存儲(chǔ)過程和觸發(fā)器_第2頁
存儲(chǔ)過程和觸發(fā)器_第3頁
存儲(chǔ)過程和觸發(fā)器_第4頁
存儲(chǔ)過程和觸發(fā)器_第5頁
已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

存儲(chǔ)過程和觸發(fā)器第一頁,共六十七頁,2022年,8月28日任務(wù)掌握存儲(chǔ)過程,觸發(fā)器的概念和使用方法;掌握運(yùn)用T-SQL編寫基本的存儲(chǔ)過程、觸發(fā)器。(☆

*)理解存儲(chǔ)過程、觸發(fā)器的用途;進(jìn)一步理解數(shù)據(jù)完整性的含義(☆)了解數(shù)據(jù)完整性的規(guī)則、默認(rèn)值等使用。第二頁,共六十七頁,2022年,8月28日5.1存儲(chǔ)過程5.1.1存儲(chǔ)過程的基本概念5.1.2存儲(chǔ)過程的優(yōu)點(diǎn)5.1.3存儲(chǔ)過程的分類5.1.4存儲(chǔ)過程的使用方法第三頁,共六十七頁,2022年,8月28日5.1存儲(chǔ)過程傳統(tǒng)的數(shù)據(jù)庫(kù)結(jié)構(gòu)管理數(shù)據(jù)等共享資源,所有的應(yīng)用程序都在用戶端,都與用戶實(shí)際運(yùn)行的應(yīng)用程序捆綁在一起;客戶/服務(wù)器數(shù)據(jù)庫(kù)管理數(shù)據(jù)等共享資源承擔(dān)一些應(yīng)用邏輯,完成來自客戶端的一些處理請(qǐng)求,在數(shù)據(jù)庫(kù)中還可以存放程序,即存儲(chǔ)過程。第四頁,共六十七頁,2022年,8月28日5.1.1存儲(chǔ)過程的基本概念是什么:是事先編好的、存儲(chǔ)在服務(wù)器端的數(shù)據(jù)庫(kù)中的程序(預(yù)編譯的SQL集合),這些程序用來完成對(duì)數(shù)據(jù)庫(kù)的指定操作。怎么使用:這些程序可以由應(yīng)用程序的調(diào)用啟動(dòng),或由數(shù)據(jù)完整性規(guī)則和觸發(fā)器調(diào)用。怎么理解:存儲(chǔ)過程是用戶可以簡(jiǎn)單地將其作為一個(gè)函數(shù)來調(diào)用,無須重復(fù)執(zhí)行存儲(chǔ)過程的SQL語句。它包含一組經(jīng)常執(zhí)行的、邏輯完整的SQL語句。第五頁,共六十七頁,2022年,8月28日5.1.2存儲(chǔ)過程的優(yōu)點(diǎn)減輕程序編寫的工作量:可以在各個(gè)程序中反復(fù)調(diào)用定義好的存儲(chǔ)過程。存儲(chǔ)過程能夠?qū)崿F(xiàn)較快的執(zhí)行速度:因?yàn)榇鎯?chǔ)過程是預(yù)編譯的,而批處理的T-SQL語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,因此速度相對(duì)要慢一些。

存儲(chǔ)過程能夠減少網(wǎng)絡(luò)流量:對(duì)于同一個(gè)針對(duì)數(shù)據(jù)庫(kù)對(duì)象的操作,所涉及到的T-SQL語句被組織成一存儲(chǔ)過程,當(dāng)在客戶端調(diào)用該存儲(chǔ)過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,降低網(wǎng)絡(luò)負(fù)載。存儲(chǔ)過程增加安全機(jī)制:系統(tǒng)管理員通過對(duì)執(zhí)行某一存儲(chǔ)過程的權(quán)限進(jìn)行限制,從而能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)訪問權(quán)限的限制,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問,保證數(shù)據(jù)的安全。第六頁,共六十七頁,2022年,8月28日客戶端應(yīng)用(不使用存儲(chǔ)過程)客戶端應(yīng)用(使用存儲(chǔ)過程).Starttransaction.INSERTdataUPDATEdataDELETEdataEndtransaction..Starttransaction.CallStoredprocedureEndtransaction.DBMSServerDBMSServerProcedure:INSERTdataUPDATEdataDELETEdata(a)(b)

不使用存儲(chǔ)過程時(shí),所有的數(shù)據(jù)處理都在客戶端完成;而使用存儲(chǔ)過程時(shí),可以使數(shù)據(jù)處理在服務(wù)器端完成。第七頁,共六十七頁,2022年,8月28日

儲(chǔ)存過程的分類系統(tǒng)存儲(chǔ)過程SQLServer本身提供了一些存儲(chǔ)過程,用于管理SQLServer和顯示有關(guān)數(shù)據(jù)庫(kù)和用戶的信息,我們稱之為系統(tǒng)存儲(chǔ)過程。系統(tǒng)存儲(chǔ)過程都以“sp_”開頭,存儲(chǔ)在master數(shù)據(jù)庫(kù)中。用戶存儲(chǔ)過程用戶也可以編寫自己的存儲(chǔ)過程,并把它存放在數(shù)據(jù)庫(kù)中。這樣安排的主要目的就是要充分發(fā)揮數(shù)據(jù)庫(kù)服務(wù)器的功能,盡量減少網(wǎng)絡(luò)上的堵塞。第八頁,共六十七頁,2022年,8月28日5.1.4存儲(chǔ)過程的使用方法創(chuàng)建存儲(chǔ)過程執(zhí)行存儲(chǔ)過程修改存儲(chǔ)過程刪除存儲(chǔ)過程第九頁,共六十七頁,2022年,8月28日創(chuàng)建存儲(chǔ)過程CREATEPROC[edure]procedure_name[;number][@parameterdata_type[=default],…

]ASsql_statement

s

procedure_name:給出存儲(chǔ)過程名;s

number:對(duì)同名的存儲(chǔ)過程指定一個(gè)序號(hào);s

@parameter:給出參數(shù)名;s

data_type:指出參數(shù)的數(shù)據(jù)類型;s

=default:給出參數(shù)的默認(rèn)值;s

sql_statement:存儲(chǔ)過程所要執(zhí)行的SQL語句,它可以是一組SQL語句,可以包含流程控制語句等。第十頁,共六十七頁,2022年,8月28日例:創(chuàng)建一個(gè)最簡(jiǎn)單的存儲(chǔ)過程(無參數(shù)調(diào)用):CREATE

PROCedure

sp_getemp;

1ASSELECT*FROM職工說明:創(chuàng)建存儲(chǔ)過程sp_getemp;1,要求查詢職工信息第十一頁,共六十七頁,2022年,8月28日例:帶參數(shù)的存儲(chǔ)過程:CREATE

PROCedure

sp_getemp;

2(@salaryint)ASSELECT*FROM職工WHERE工資>@salary說明:創(chuàng)建存儲(chǔ)過程sp_getemp;2,要求查詢工資值大于給定值的職工信息第十二頁,共六十七頁,2022年,8月28日說明:存儲(chǔ)過程一般用來完成數(shù)據(jù)查詢和數(shù)據(jù)處理操作,所以在存儲(chǔ)過程中不可以使用創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象的語句,即在存儲(chǔ)過程中一般不能含有以下語句:CREATETABLECREATEVIEWCREATEDEFAULTCREATERULECREATETRIGGERCREATEPROCEDURE第十三頁,共六十七頁,2022年,8月28日?qǐng)?zhí)行存儲(chǔ)過程[EXECute][@<返回狀態(tài)碼>=]<存儲(chǔ)過程名>[[@<參數(shù)>=]{<值>|@<變量>}…]第十四頁,共六十七頁,2022年,8月28日例:執(zhí)行帶參數(shù)的sp_getemp;2存儲(chǔ)過程Execute

sp_getemp;21240

說明:執(zhí)行存儲(chǔ)過程sp_getemp;2,要求查詢工資值大于1240元的職工信息第十五頁,共六十七頁,2022年,8月28日存儲(chǔ)過程的返回值和狀態(tài)信息無論什么時(shí)候執(zhí)行存儲(chǔ)過程,總要返回一個(gè)結(jié)果碼,用以指示存儲(chǔ)過程的執(zhí)行狀態(tài)。如果存儲(chǔ)過程執(zhí)行成功,返回的結(jié)果碼是0;如果存儲(chǔ)過程執(zhí)行失敗,返回的結(jié)果碼一般是一個(gè)負(fù)數(shù),它和失敗的類型有關(guān)。我們?cè)趧?chuàng)建存儲(chǔ)過程時(shí),也可以定義自己的狀態(tài)碼和錯(cuò)誤信息。第十六頁,共六十七頁,2022年,8月28日常用的存儲(chǔ)過程返回狀態(tài)表0過程成功執(zhí)行-1對(duì)象丟失-2發(fā)生數(shù)據(jù)類型錯(cuò)誤-3處理過程被死鎖-4發(fā)生權(quán)限錯(cuò)誤-5發(fā)生語法錯(cuò)誤-6發(fā)生惡意用戶錯(cuò)誤-7發(fā)生資源錯(cuò)誤-8遭遇非致命的內(nèi)部錯(cuò)誤-9遭遇系統(tǒng)限制-10發(fā)生致命的內(nèi)部不穩(wěn)定性-12表或索引被破壞-13數(shù)據(jù)庫(kù)被破壞-14發(fā)生硬盤錯(cuò)誤通常用全局變量@@ERROR返回最后執(zhí)行的SQL語句的錯(cuò)誤代碼。第十七頁,共六十七頁,2022年,8月28日CREATEPROCeduresp_getemp;3(@salaryint=NULL)ASIF@salaryISNULLBEGINPRINT'必須提供一個(gè)數(shù)值作參數(shù)!'RETURN13ENDIFNOTEXISTS(SELECT*FROM職工WHERE工資>@salary)BEGINPRINT'沒有滿足條件的記錄!'RETURN-103ENDSELECT*FROM職工WHERE工資>@salaryRETURN0例:帶參數(shù)和返回狀態(tài)值的存儲(chǔ)過程。第十八頁,共六十七頁,2022年,8月28日利用全局變量修改剛才的例子CREATEPROCeduresp_getemp;3(@salaryint=NULL)ASSELECT*FROM職工WHERE工資>@salaryIF@@ERROR=0RETURN0ELSERETURN-1第十九頁,共六十七頁,2022年,8月28日例:執(zhí)行以上存儲(chǔ)過程。DECLARE@statusintEXECUTE@status=sp_getemp;3

@salary

=1200print@status第二十頁,共六十七頁,2022年,8月28日存儲(chǔ)過程的修改和刪除

修改存儲(chǔ)過程的語句是(一般格式):ALTERPROC[edure]procedure_name[;number][@parameterdata_type[=default],…

]ASsql_statement

刪除存儲(chǔ)過程的語句是:

DROPPROC[edure]procedure_name注意:刪除存儲(chǔ)過程的語句中不能指定序號(hào)。也就是說,該語句將同時(shí)刪除同名的所有存儲(chǔ)過程。第二十一頁,共六十七頁,2022年,8月28日小結(jié):要用好存儲(chǔ)過程存儲(chǔ)過程是客戶/服務(wù)器機(jī)制的一個(gè)重要組成部分,如果使用客戶/服務(wù)器機(jī)制的數(shù)據(jù)庫(kù)管理系統(tǒng),但是不理解存儲(chǔ)過程或沒有充分利用存儲(chǔ)過程,那將使客戶/服務(wù)器機(jī)制的功能大打折扣,使系統(tǒng)的整體性能可能降低很多。第二十二頁,共六十七頁,2022年,8月28日5.2觸發(fā)器

觸發(fā)器的基本概念5.2.2觸發(fā)器的用途5.2.3觸發(fā)器與存儲(chǔ)過程的比較5.2.4觸發(fā)器的使用方法第二十三頁,共六十七頁,2022年,8月28日5.2.1

觸發(fā)器的基本概念觸發(fā)器可以看作是一類特殊的存儲(chǔ)過程,它在滿足某個(gè)特定條件時(shí)自動(dòng)觸發(fā)執(zhí)行。觸發(fā)器是為表上的更新、插入、刪除操作定義的,也就是說當(dāng)表上發(fā)生更新、插入或刪除操作時(shí)觸發(fā)器將執(zhí)行。因此,相應(yīng)的,觸發(fā)器根據(jù)觸發(fā)類型分為insert,delete,update觸發(fā)器。第二十四頁,共六十七頁,2022年,8月28日5.2.2觸發(fā)器的用途觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有以下的功能:觸發(fā)器可以通過級(jí)聯(lián)的方式對(duì)相關(guān)的表進(jìn)行修改。比如,對(duì)父表的修改,可以引起對(duì)子孫表的一系列修改,從而保證數(shù)據(jù)的一致性和完整性。觸發(fā)器可以禁止或撤消違反參照完整性的修改。觸發(fā)器可以強(qiáng)制比用CHECK約束定義更加復(fù)雜的限制。第二十五頁,共六十七頁,2022年,8月28日5.2.3觸發(fā)器與存儲(chǔ)過程的比較聯(lián)系:1、觸發(fā)器也是存儲(chǔ)過程。2、它們都是提高數(shù)據(jù)庫(kù)服務(wù)器性能的工具。區(qū)別:1、執(zhí)行方法不同。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,存儲(chǔ)過程可以通過存儲(chǔ)過程名字而被直接調(diào)用。2、建立方法不同。第二十六頁,共六十七頁,2022年,8月28日觸發(fā)器是依附于表的數(shù)據(jù)庫(kù)對(duì)象CREATETRIGGER

語句必須是批處理的第一個(gè)語句表的所有者具有創(chuàng)建觸發(fā)器的缺省權(quán)限,表的所有者不能把該權(quán)限傳給其它用戶。觸發(fā)器是數(shù)據(jù)庫(kù)對(duì)象,所以其命名必須符合命名規(guī)則。盡管在觸發(fā)器的SQL語句中可以參照其它數(shù)據(jù)庫(kù)中的對(duì)象,但是觸發(fā)器只能創(chuàng)建在當(dāng)前數(shù)據(jù)庫(kù)中。雖然觸發(fā)器可以參照視圖或臨時(shí)表,但不能在視圖或臨時(shí)表上創(chuàng)建觸發(fā)器,而只能在基表或在創(chuàng)建視圖的表上創(chuàng)建觸發(fā)器。一個(gè)觸發(fā)器只能對(duì)應(yīng)一個(gè)表,這是由觸發(fā)器的機(jī)制決定的。第二十七頁,共六十七頁,2022年,8月28日觸發(fā)器是依附于表的數(shù)據(jù)庫(kù)對(duì)象一個(gè)觸發(fā)器和三部分內(nèi)容有關(guān):定義觸發(fā)器的表激活觸發(fā)器的數(shù)據(jù)操作語句觸發(fā)器要采取的動(dòng)作第二十八頁,共六十七頁,2022年,8月28日不能在觸發(fā)器中使用的sql語句Createdatabase和createtable所有drop語句數(shù)據(jù)庫(kù)修改語句altertable,alterdatabase對(duì)象權(quán)限語句grant和revoke…第二十九頁,共六十七頁,2022年,8月28日

觸發(fā)器的使用方法創(chuàng)建觸發(fā)器的語句觸發(fā)器的使用原理-理解兩個(gè)視圖并掌握它們的使用插入類觸發(fā)器刪除類觸發(fā)器更新類觸發(fā)器觸發(fā)器的相關(guān)操作修改刪除觸發(fā)器第三十頁,共六十七頁,2022年,8月28日建立觸發(fā)器的語句CREATETRIGGERtrigger_nameONtableFOR{INSERT|UPDATE|DELETE}AS[IFUPDATE(column)[{AND|OR}UPDATE(column)…]]sql_statements

trigger_name:給出了觸發(fā)器的名稱;s

table:說明了定義觸發(fā)器的表或視圖;s

FOR{INSERT|UPDATE|DELETE}:說明了激活觸發(fā)器的數(shù)據(jù)操作語句;s

IFUPDATE(column):對(duì)應(yīng)于UPDATE類觸發(fā)器,說明如果更新某(些)列則做如何處理;s

sql_statement:觸發(fā)器所要執(zhí)行的SQL語句,它可以是一組SQL語句,可以包含流程控制語句等。第三十一頁,共六十七頁,2022年,8月28日例:建立一個(gè)簡(jiǎn)單的觸發(fā)器。CREATETRIGGERwh_triggerON倉(cāng)庫(kù)FORINSERTASPRINT'插入了一個(gè)倉(cāng)庫(kù)元組'說明:當(dāng)在“倉(cāng)庫(kù)”表中插入一行元組,則輸出“插入了一個(gè)倉(cāng)庫(kù)元組”。第三十二頁,共六十七頁,2022年,8月28日觸發(fā)器的原理

—兩個(gè)特殊的視圖每個(gè)觸發(fā)器有兩個(gè)特殊的視圖:插入視圖(inserted)和刪除視圖(deleted)。它們是邏輯表且是由系統(tǒng)管理的,存儲(chǔ)在內(nèi)存中,不允許用戶直接對(duì)其修改,結(jié)構(gòu)與原表有相同的表結(jié)構(gòu)。當(dāng)觸發(fā)器工作完成,這兩個(gè)視圖也被刪除。它們主要保存因用戶操作(存放剛插入的新記錄和存放剛刪除的舊記錄)而被影響到的原數(shù)據(jù)值或新數(shù)據(jù)值。它們是只讀的,即用戶不能向這兩個(gè)表寫入內(nèi)容,但可以引用表中的數(shù)據(jù)。第三十三頁,共六十七頁,2022年,8月28日觸發(fā)器的原理

—這兩個(gè)視圖與數(shù)據(jù)操作的關(guān)系一旦對(duì)表執(zhí)行了插入操作,插入視圖就是用來存儲(chǔ)向原表插入的內(nèi)容。一旦對(duì)表執(zhí)行了刪除操作,則將所有的刪除行存放至刪除視圖中。更新操作包括兩個(gè)部分即先將更新的內(nèi)容去掉然后將新值插入,因此對(duì)一個(gè)定義了更新類型觸發(fā)器的表來講,在刪除視圖中存放了舊值,然后在插入視圖中存放新值。第三十四頁,共六十七頁,2022年,8月28日插入類觸發(fā)器插入類觸發(fā)器就是當(dāng)表上發(fā)生插入操作時(shí)所觸發(fā)執(zhí)行的程序。第三十五頁,共六十七頁,2022年,8月28日例:對(duì)職工表的插入操作定義一個(gè)觸發(fā)器,使得當(dāng)插入職工記錄時(shí),檢查相應(yīng)的倉(cāng)庫(kù)元組是否存在,如果不存在則撤消所做的插入操作。CREATETRIGGERe_ins_triggerON

職工FORINSERTAS如果插入的職工元組的倉(cāng)庫(kù)號(hào)在倉(cāng)庫(kù)表中存在,那么插入成功,職工表增加一行元組。如果插入的職工元組的倉(cāng)庫(kù)號(hào)在倉(cāng)庫(kù)表中不存在,則插入操作不成功,給出相應(yīng)的提示,并且事務(wù)回滾到插入操作之前。IF(SELECTCOUNT(*)FROM倉(cāng)庫(kù)w,insertediWHEREw.倉(cāng)庫(kù)號(hào)=i.倉(cāng)庫(kù)號(hào))=0BEGINRAISERROR('非法倉(cāng)庫(kù)號(hào)!',1,1)ROLLBACKTRANSACTIONEND第三十六頁,共六十七頁,2022年,8月28日思考:如果上題要求改為在職工表的插入操作定義一個(gè)觸發(fā)器,使得當(dāng)插入職工記錄時(shí),檢查實(shí)體完整性,如果不滿足實(shí)體完整性則撤消所做的插入操作。CREATETRIGGERe_ins_trigger2ON

職工FORINSERTAS如果插入的職工元組的職工號(hào)在原職工表中不存在,那么插入成功,職工表增加一行元組。如果插入的職工元組的職工號(hào)在原職工表中已存在,則插入操作不成功,給出相應(yīng)的提示,并且事務(wù)回滾到插入操作之前。IF(SELECTCOUNT(*)FROM職工w,insertediWHEREw.職工號(hào)=i.職工號(hào))>0BEGINRAISERROR(‘重復(fù)的職工號(hào)!',1,1)ROLLBACKTRANSACTIONEND第三十七頁,共六十七頁,2022年,8月28日刪除類觸發(fā)器刪除類觸發(fā)器就是當(dāng)表上發(fā)生刪除操作時(shí)所觸發(fā)執(zhí)行的程序。第三十八頁,共六十七頁,2022年,8月28日例:定義一個(gè)觸發(fā)器,使得當(dāng)刪除倉(cāng)庫(kù)記錄時(shí),同時(shí)將所屬所有職工記錄的倉(cāng)庫(kù)號(hào)字段值置為空值NULL:

CREATETRIGGERw_del_triggerON倉(cāng)庫(kù)

FORDELETEASUPDATE職工SET倉(cāng)庫(kù)號(hào)=NULLWHERE倉(cāng)庫(kù)號(hào)=(SELECT倉(cāng)庫(kù)號(hào)FROMdeleted)第三十九頁,共六十七頁,2022年,8月28日思考:若改為定義一個(gè)觸發(fā)器,使得當(dāng)刪除倉(cāng)庫(kù)記錄時(shí),同時(shí)將所屬所有職工記錄刪除:

CREATETRIGGERw_del_trigger2ON倉(cāng)庫(kù)

FORDELETEASDELETE

FROM職工FROMdeletedWHERE職工.倉(cāng)庫(kù)號(hào)=deleted.倉(cāng)庫(kù)號(hào)第四十頁,共六十七頁,2022年,8月28日更新類觸發(fā)器更新類觸發(fā)器就是當(dāng)表上發(fā)生更新操作時(shí)所觸發(fā)執(zhí)行的程序。第四十一頁,共六十七頁,2022年,8月28日例:對(duì)職工表的更新操作定義一個(gè)觸發(fā)器,使得當(dāng)職工變換所屬倉(cāng)庫(kù)時(shí),檢查相應(yīng)的倉(cāng)庫(kù)元組是否存在,如果不存在則撤消所做的更新操作,如果新的倉(cāng)庫(kù)號(hào)是WH2則將工資提高10%。定義語句(注意表名,哪一類的觸發(fā)器)當(dāng)改變職工所屬的倉(cāng)庫(kù)號(hào)時(shí)(倉(cāng)庫(kù)號(hào)a->倉(cāng)庫(kù)號(hào)b,不確定,怎么寫語句?)如果倉(cāng)庫(kù)號(hào)b在倉(cāng)庫(kù)表中不存在,事務(wù)回滾,撤銷更新職工表的倉(cāng)庫(kù)號(hào)字段,維持原來的元組。如果倉(cāng)庫(kù)號(hào)b在倉(cāng)庫(kù)表中存在,則進(jìn)行下面的工作如果更新的倉(cāng)庫(kù)號(hào)b為WH2,則給這個(gè)職工增加10%工資如果更新的倉(cāng)庫(kù)號(hào)b不是WH2,而是其它合法的倉(cāng)庫(kù)號(hào),則只是修改該職工所屬的倉(cāng)庫(kù)號(hào)(即用戶的更新操作成功)WH31331WH5第四十二頁,共六十七頁,2022年,8月28日CREATETRIGGERe_upd_triggerON職工FORUPDATEASDECLARE@wh_noCHAR(4)IFUPDATE(倉(cāng)庫(kù)號(hào))BEGINIF(SELECTCOUNT(*)FROM倉(cāng)庫(kù)w,insertediWHEREw.倉(cāng)庫(kù)號(hào)=i.倉(cāng)庫(kù)號(hào))=0BEGINRAISERROR('非法倉(cāng)庫(kù)號(hào)!',16,1)ROLLBACKTRANSACTIONENDELSEBEGINSELECT@wh_no=倉(cāng)庫(kù)號(hào)FROMinsertedIF@wh_no='WH2'UPDATE職工SET工資=工資*1.10WHERE職工號(hào)=(SELECT職工號(hào)FROMinserted)ENDEND定義語句當(dāng)更新操作,生成兩張視圖如果倉(cāng)庫(kù)號(hào)b在倉(cāng)庫(kù)表中不存在,不符合參照完整性,事務(wù)回滾。如果倉(cāng)庫(kù)號(hào)b在倉(cāng)庫(kù)表中存在,且為WH2則增加工資第四十三頁,共六十七頁,2022年,8月28日使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器系統(tǒng)存儲(chǔ)過程sp_help,sp_helptext和sp_depends分別提供有關(guān)觸發(fā)器的不同信息。sp_help,通過該系統(tǒng)過程可以了解觸發(fā)器的一般信息如觸發(fā)器的名字屬性類型創(chuàng)建時(shí)間使用sp_help系統(tǒng)過程的命令格式是sp_help

觸發(fā)器名字第四十四頁,共六十七頁,2022年,8月28日sp_helptext

通過sp_helptext能夠查看觸發(fā)器的正文信息,其語法格式為

sp_helptext觸發(fā)器名sp_depends

通過sp_depends能夠查看指定觸發(fā)器所引用的表或指定的表涉及到的所有觸發(fā)器,其語法形式如下

sp_depends

觸發(fā)器名字

sp_depends

表名第四十五頁,共六十七頁,2022年,8月28日修改刪除觸發(fā)器可以修改觸發(fā)器的名字和正文使用sp_rename命令修改觸發(fā)器的名字,其語法格式為

sp_renameoldname,newname用Alerttrigger命令修改觸發(fā)器正文刪除已創(chuàng)建的觸發(fā)器有兩種方法:用系統(tǒng)命令DROPTRIGGER刪除指定的觸發(fā)器,其語法形式如下

DROPTRIGGER觸發(fā)器名字刪除觸發(fā)器所在的表時(shí),將自動(dòng)刪除與該表相關(guān)的觸發(fā)器。第四十六頁,共六十七頁,2022年,8月28日5.3數(shù)據(jù)完整性

在第3章已經(jīng)介紹了在關(guān)系數(shù)據(jù)模型上數(shù)據(jù)完整性的概念和規(guī)則;在前一章介紹了CREATETABLE語句中可以實(shí)現(xiàn)的一些完整性約束。這里介紹與數(shù)據(jù)完整性有關(guān)的其他一些內(nèi)容。.

第四十七頁,共六十七頁,2022年,8月28日5.3.1規(guī)則

在CREATETABLE語句中可以使用CHECK子句實(shí)現(xiàn)一些用戶定義完整性或域完整性約束。另外還可以通過“規(guī)則”(RULE)來實(shí)現(xiàn)用戶定義完整性或域完整性。CHECK約束固定在一個(gè)表的一個(gè)列上,它只在指定的列上起作用。如果在不同的列上有相同的約束條件,則可以使用規(guī)則,一個(gè)規(guī)則可以綁定在多個(gè)列上。規(guī)則是一種獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象,它可以綁定到一個(gè)列上來約束該列的取值范圍等。

第四十八頁,共六十七頁,2022年,8月28日規(guī)則的用法定義規(guī)則綁定到相應(yīng)的列上第四十九頁,共六十七頁,2022年,8月28日建立規(guī)則的命令是:

CREATERULEruleAScondition_expression

rule:給出新建規(guī)則的名稱;

condition_expression:定義規(guī)則的條件,可以是任何有效的表達(dá)式,并且可以包含諸如算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和謂詞(如IN、LIKE、BETWEEN)之類的元素。

注意:規(guī)則不能引用列或其它數(shù)據(jù)庫(kù)對(duì)象,規(guī)則可以包含不引用數(shù)據(jù)庫(kù)對(duì)象的內(nèi)置函數(shù);condition_expression需要包含一個(gè)變量,變量的前面有一個(gè)@前綴;該表達(dá)式引用通過

UPDATE或INSERT語句輸入或傳遞的字段值。

第五十頁,共六十七頁,2022年,8月28日例如,規(guī)定某類數(shù)值對(duì)象的取值范圍是1000~3000,則可以定義規(guī)則:

CREATERULErange_ruleAS@range>=1000AND@range<=3000第五十一頁,共六十七頁,2022年,8月28日規(guī)則的綁定規(guī)則是獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象,要通過系統(tǒng)存儲(chǔ)過程sp_bindrule把規(guī)則綁定到數(shù)據(jù)列上,該系統(tǒng)存儲(chǔ)過程的格式是:

sp_bindrulerulename,objname[,futureonly]

rulename是用CREATERULE命令建立的規(guī)則名;objname指出要綁定的表和列或用戶定義的數(shù)據(jù)類型;futureonly,當(dāng)綁定規(guī)則到用戶定義的數(shù)據(jù)類型時(shí)可以選用此項(xiàng),該選項(xiàng)是禁止已經(jīng)存在的、用用戶定義數(shù)據(jù)類型定義的列遵循新的規(guī)則。第五十二頁,共六十七頁,2022年,8月28日例如,將規(guī)則range_rule綁定到職工表的工資列上

sp_bindrulerange_rule,‘職工.工資’

使用CREATERULE命令創(chuàng)建的規(guī)則對(duì)象,可以綁定到多個(gè)數(shù)據(jù)列上,即一個(gè)規(guī)則可以反復(fù)使用。

第五十三頁,共六十七頁,2022年,8月28日綁定的消除和規(guī)則的刪除綁定到數(shù)據(jù)列上的規(guī)則可以去除,相應(yīng)的系統(tǒng)存儲(chǔ)過程是sp_unbindrule。例如,取消綁定在職工表工資列上的規(guī)則可以使用如下語句:

sp_unbindrule'職工.工資'規(guī)則可以刪除,刪除規(guī)則的命令是DROPRULE,但是刪除規(guī)則之前,必須首先解除所有的綁定。第五十四頁,共六十七頁,2022年,8月28日5.3.2默認(rèn)值

在CREATETABLE命令中可以使用DEFAULT約束為數(shù)據(jù)列定義默認(rèn)值。這里介紹另外一種方法:使用CREATEDEFAULT命令創(chuàng)建默認(rèn)值對(duì)象。

第五十五頁,共六十七頁,2022年,8月28日CREATEDEFAULT命令的格式

CREATEDEFAULTdefaultASconstant_expression

default:是建立的默認(rèn)值對(duì)象名;

constant_expression:定義默認(rèn)值的常量表達(dá)式。第五十六頁,共六十七頁,2022年,8月28日例如,定義一個(gè)值為“北京”的默認(rèn)值對(duì)象val_bj

CREATEDEFAULTval_bjAS'北京'第五十七頁,共六十七頁,2022年,8月28日綁定默認(rèn)值

默認(rèn)值是獨(dú)立的數(shù)據(jù)庫(kù)對(duì)象,它要作用于某個(gè)數(shù)據(jù)對(duì)象,則也和綁定規(guī)則一樣,需要用類似的系統(tǒng)存儲(chǔ)過程把默認(rèn)值綁定到列,綁定默認(rèn)值的系統(tǒng)存儲(chǔ)過程是sp_bindefault,具體格式是:

sp_bindefaultdefname,objname[,futureonly]

defname:是用CREATEDEFAULT命令建立的默認(rèn)值對(duì)象名;

objname:指出要綁定的表和列或用戶定義的數(shù)據(jù)類型;

futureonly,當(dāng)綁定默認(rèn)值到用戶定義的數(shù)據(jù)類型時(shí)可以選用此項(xiàng),該選項(xiàng)是禁止已經(jīng)存在的、用用戶定義數(shù)據(jù)類型定義的列遵循新的默認(rèn)值約定。第五十八頁,共六十七頁,2022年,8月28日例如,將定義的默認(rèn)值對(duì)象val_bj綁定到倉(cāng)庫(kù)關(guān)系的城市列上和供應(yīng)商關(guān)系的地址列上:

sp_bindefaultval_bj,'倉(cāng)庫(kù).城市'sp_bindefaultval_bj,'供應(yīng)商.地址'第五十九頁,共六十七頁,2022年,8月28日綁定的去除和默認(rèn)值的刪除綁定到數(shù)據(jù)列上的默認(rèn)值可以去除,相應(yīng)的系統(tǒng)存儲(chǔ)過程是sp_unbindefault。例如,取消綁定在供應(yīng)商表地址列上的默認(rèn)值可以使用如下語句:

sp_unbindefault'供應(yīng)商.地址'默認(rèn)值也可以刪除,刪除默認(rèn)值的命令是DROPDEFAULT,但是刪除默認(rèn)值之前,必須首先解除所有的綁定。第六十頁,共六十七頁,2022年,8月28日5.3.3

溫馨提示

  • 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. 人人文庫(kù)網(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)論