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

下載本文檔

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

文檔簡介

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

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

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

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

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

]ASsql_statement

s

procedure_name:給出存儲過程名;s

number:對同名的存儲過程指定一個序號;s

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

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

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

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

PROCedure

sp_getemp;

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

PROCedure

sp_getemp;

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

sp_getemp;21240

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

@salary

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

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

]ASsql_statement

刪除存儲過程的語句是:

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

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

觸發(fā)器的基本概念觸發(fā)器可以看作是一類特殊的存儲過程,它在滿足某個特定條件時自動觸發(fā)執(zhí)行。觸發(fā)器是為表上的更新、插入、刪除操作定義的,也就是說當(dāng)表上發(fā)生更新、插入或刪除操作時觸發(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ā)器可以通過級聯(lián)的方式對相關(guān)的表進(jìn)行修改。比如,對父表的修改,可以引起對子孫表的一系列修改,從而保證數(shù)據(jù)的一致性和完整性。觸發(fā)器可以禁止或撤消違反參照完整性的修改。觸發(fā)器可以強(qiáng)制比用CHECK約束定義更加復(fù)雜的限制。第二十五頁,共六十七頁,2022年,8月28日5.2.3觸發(fā)器與存儲過程的比較聯(lián)系:1、觸發(fā)器也是存儲過程。2、它們都是提高數(shù)據(jù)庫服務(wù)器性能的工具。區(qū)別:1、執(zhí)行方法不同。觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行的,存儲過程可以通過存儲過程名字而被直接調(diào)用。2、建立方法不同。第二十六頁,共六十七頁,2022年,8月28日觸發(fā)器是依附于表的數(shù)據(jù)庫對象CREATETRIGGER

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

觸發(fā)器的使用方法創(chuàng)建觸發(fā)器的語句觸發(fā)器的使用原理-理解兩個視圖并掌握它們的使用插入類觸發(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):對應(yīng)于UPDATE類觸發(fā)器,說明如果更新某(些)列則做如何處理;s

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

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

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

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

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

CREATETRIGGERw_del_triggerON倉庫

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

CREATETRIGGERw_del_trigger2ON倉庫

FORDELETEASDELETE

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

第四十八頁,共六十七頁,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ù)庫對象,規(guī)則可以包含不引用數(shù)據(jù)庫對象的內(nèi)置函數(shù);condition_expression需要包含一個變量,變量的前面有一個@前綴;該表達(dá)式引用通過

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

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

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

sp_bindrulerulename,objname[,futureonly]

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

sp_bindrulerange_rule,‘職工.工資’

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

第五十三頁,共六十七頁,2022年,8月28日綁定的消除和規(guī)則的刪除綁定到數(shù)據(jù)列上的規(guī)則可以去除,相應(yīng)的系統(tǒng)存儲過程是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)值對象。

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

CREATEDEFAULTdefaultASconstant_expression

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

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

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

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

sp_bindefaultdefname,objname[,futureonly]

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

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

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

sp_bindefaultval_bj,'倉庫.城市'sp_bindefaultval_bj,'供應(yīng)商.地址'第五十九頁,共六十七頁,2022年,8月28日綁定的去除和默認(rèn)值的刪除綁定到數(shù)據(jù)列上的默認(rèn)值可以去除,相應(yīng)的系統(tǒng)存儲過程是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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論