第07章數(shù)據(jù)庫(kù)編程基礎(chǔ)-副本_第1頁(yè)
第07章數(shù)據(jù)庫(kù)編程基礎(chǔ)-副本_第2頁(yè)
第07章數(shù)據(jù)庫(kù)編程基礎(chǔ)-副本_第3頁(yè)
第07章數(shù)據(jù)庫(kù)編程基礎(chǔ)-副本_第4頁(yè)
第07章數(shù)據(jù)庫(kù)編程基礎(chǔ)-副本_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、北京信息科技大學(xué)第7章 數(shù)據(jù)庫(kù)編程基礎(chǔ)n游標(biāo)與SQL的宿主使用n存儲(chǔ)過程n觸發(fā)器及其用途n動(dòng)態(tài)SQL北京信息科技大學(xué)本章主要內(nèi)容nSQL的宿主使用n游標(biāo)n存儲(chǔ)過程n觸發(fā)器北京信息科技大學(xué)7.1 游標(biāo)與SQL的宿主使用nSQL宿主使用面臨的問題n嵌入識(shí)別與預(yù)編譯n數(shù)據(jù)通訊區(qū)與主變量n游標(biāo)北京信息科技大學(xué)7.1.1 SQL宿主使用面臨的問題n嵌入識(shí)別問題:宿主語言的編譯程序不能識(shí)別SQL語句,所以首要的問題就是要解決如何區(qū)分宿主語言的語句和SQL語句;n宿主語言與SQL語言的數(shù)據(jù)交互問題:SQL語句的查詢結(jié)果必須能夠交給宿主語言處理,宿主語言的數(shù)據(jù)也要能夠交給SQL語句使用;n宿主語言的單記錄與S

2、QL的多記錄的問題:宿主語言一般一次處理一條記錄,而SQL常常處理的是記錄(元組)的集合,這個(gè)矛盾必須解決。北京信息科技大學(xué)7.1.2 嵌入識(shí)別與預(yù)編譯n為了區(qū)分宿主語言和SQL語句,為SQL語句加一個(gè)特殊的前綴,在用宿主語言的編譯系統(tǒng)編譯源程序之前,首先由預(yù)編譯系統(tǒng)將SQL語句轉(zhuǎn)換為宿主語言的合法函數(shù)調(diào)用。n常用前綴格式是:EXEC SQLn比如: EXEC SQL INSERT INTO 倉(cāng)儲(chǔ).倉(cāng)庫(kù) VALUES(WH1,北京,500)北京信息科技大學(xué)嵌入了SQL的應(yīng)用程序的執(zhí)行過程 北京信息科技大學(xué)7.1.3 數(shù)據(jù)通訊區(qū)與主變量n為了解決程序變量和數(shù)據(jù)庫(kù)的交互,一般需要說明一個(gè)數(shù)據(jù)通訊區(qū)

3、,即在程序的前部都要有如下語句:INCLUDE SQLCA 注:SQLCA是SQL與宿主語言的通訊區(qū),它類似于結(jié)構(gòu)變量,各個(gè)分量分別反映SQL語句的各種執(zhí)行狀態(tài),如如:sqlca.sqlcodesqlca.sqlcode北京信息科技大學(xué)主(Host)變量n負(fù)責(zé)SQL語句和宿主語言語句數(shù)據(jù)交換的是主變量,這種變量既可以用在SQL語句中,又可以用在宿主語言語句中。n主變量的說明格式BEGIN DECLARE SECTION主變量說明END DECLARE SECTION北京信息科技大學(xué)主變量說明的例子:主變量說明的例子:EXEC SQL BEGIN DECLARE SECTION EXEC SQL

4、 BEGIN DECLARE SECTION ;char whnumb5char whnumb5char city12char city12int wh_areaint wh_areaEXEC SQL END DECLARE SECTIONEXEC SQL END DECLARE SECTION;北京信息科技大學(xué)使用主變量的例子:使用主變量的例子:UPDATE UPDATE 倉(cāng)庫(kù)倉(cāng)庫(kù)SET SET 面積面積 = :wh_area= :wh_areaWHERE WHERE 倉(cāng)庫(kù)號(hào)倉(cāng)庫(kù)號(hào) = :whnumb = :whnumb 注:主變量用在宿主語言語句中時(shí),和一般程序變量的使用方法是一樣的。北京

5、信息科技大學(xué)7.1.4 游標(biāo)(Cursor)nDECLARE CURSORnOPENnFETCHnCLOSEnDEALLOCATE 為了解決宿主語言一次只能處理一條記錄,而SQL語言一次處理多條記錄的矛盾,引入了游標(biāo)的概念。相關(guān)的語句有:北京信息科技大學(xué)定義游標(biāo)n基本格式 DECLARE CURSOR FOR n游標(biāo)可以看作是一個(gè)臨時(shí)存儲(chǔ)或臨時(shí)文件,它的內(nèi)容就是SELECT語句的查詢結(jié)果。北京信息科技大學(xué)打開游標(biāo) nOPEN 北京信息科技大學(xué)從游標(biāo)中讀記錄 n基本格式是 FETCH INTO , n這里的游標(biāo)必須是已經(jīng)說明并打開了的,INTO后的主變量要與在DECLARE CURSOR中SEL

6、ECT的字段相對(duì)應(yīng)。北京信息科技大學(xué)關(guān)閉游標(biāo) nCLOSE n游標(biāo)被關(guān)閉后如果需要還可以用OPEN語句打開。 北京信息科技大學(xué)釋放游標(biāo) nDEALLOCATE nDEALLOCATE命令釋放和刪除與游標(biāo)有關(guān)的所有數(shù)據(jù)結(jié)構(gòu)和定義。 北京信息科技大學(xué)游標(biāo)概念歸納n與程序設(shè)計(jì)語言中的文件相對(duì)照:nDECLARE CURSOR相當(dāng)于說明了一個(gè)文件nOPEN相當(dāng)于打開文件nFETCH相當(dāng)于讀一條記錄nCLOSE相當(dāng)于關(guān)閉文件nDEALLOCATE語句相當(dāng)于刪除文件。 使用游標(biāo)的一個(gè)使用游標(biāo)的一個(gè)C C語言程序段語言程序段 EXEC SQL BEGIN DECLARE SECTION char whnum

7、b5 char city12 int wh_areaEXEC SQL END DECLARE SECTION EXEC SQL DECLARE c1 CURSOR FORSELECT 倉(cāng)庫(kù)號(hào)倉(cāng)庫(kù)號(hào),城市城市,面積面積FROM 倉(cāng)庫(kù)倉(cāng)庫(kù)WHERE 面積面積 = :wh_area EXEC SQL OPEN c1 while ( SQLCA.sqlcode 100 )EXEC SQL FETCH c1 INTO :whnumb,:city,:wh_area EXEC SQL CLOSE c1 北京信息科技大學(xué)在T-SQL中使用游標(biāo)n使用全局變量FETCH_STATUS來判斷FETCH語句對(duì)游標(biāo)的操

8、作狀態(tài)。取值如下: n0:FETCH 語句成功;n-1:FETCH 語句失敗或行不在結(jié)果集中;n-2:提取的行不存在。n循環(huán)語句nWHILE FETCH_STATUS=0 在T-SQL中用游標(biāo)列出所有倉(cāng)庫(kù)記錄DECLARE whno CHAR(6),city CHAR(10),area INTDECLARE wh_cursor CURSOR FOR SELECT 倉(cāng)庫(kù)號(hào),城市,面積 FROM 倉(cāng)儲(chǔ).倉(cāng)庫(kù)OPEN wh_cursorPRINT - 倉(cāng)庫(kù)列表-PRINT 倉(cāng)庫(kù)號(hào) 所在城市 倉(cāng)庫(kù)面積FETCH FROM wh_cursor INTO whno,city,areaWHILE FETCH

9、_STATUS=0BEGINPRINT whno+ +city+ STR(area,4)FETCH FROM wh_cursor INTO whno,city,areaENDCLOSE wh_cursorDEALLOCATE wh_cursor北京信息科技大學(xué)7.1.6 利用游標(biāo)進(jìn)行刪除和更新操作n使用游標(biāo)的UPDATE命令的格式是 UPDATE SET =|NULL,nWHERE CURRENT OF n使用游標(biāo)的DELETE命令的格式是 DELETE FROM WHERE CURRENT OF n利用WHERE CURRENT OF 進(jìn)行的修改或刪除只影響表的當(dāng)前行。使用游標(biāo)進(jìn)行更新的例子

10、 DECLARE salary numeric(8,2)DECLARE sal_cursor CURSOR FOR SELECT 工資 FROM 基礎(chǔ).職工OPEN sal_cursorFETCH FROM sal_cursor INTO salaryWHILE FETCH_STATUS=0BEGINIF salary =sum AND 經(jīng)手人 IN (SELECT 職工號(hào) FROM 基礎(chǔ).職工 WHERE 倉(cāng)庫(kù)號(hào)=whno) RETURN count執(zhí)行存儲(chǔ)過程執(zhí)行存儲(chǔ)過程(查詢查詢WH1倉(cāng)庫(kù)金額大于倉(cāng)庫(kù)金額大于1000的訂單數(shù)的訂單數(shù)):DECLARE count intEXECUTE c

11、ount= uspGetOrderNum WH1,1000PRINT 訂單數(shù)是:+STR(count)北京信息科技大學(xué)4. 4. 使用帶有通配符參數(shù)的簡(jiǎn)單過程使用帶有通配符參數(shù)的簡(jiǎn)單過程n例例7 7-8. 返回返回指定的一些供應(yīng)商的信息(提供供應(yīng)商指定的一些供應(yīng)商的信息(提供供應(yīng)商名稱中的關(guān)鍵字)名稱中的關(guān)鍵字)CREATE PROCEDURE 訂貨.uspGetSupsname varchar(20)=%AS SELECT * FROM 訂貨.供應(yīng)商 WHERE 供應(yīng)商名 LIKE sname執(zhí)行存儲(chǔ)過程:執(zhí)行存儲(chǔ)過程: EXECUTE 訂貨.uspGetSup sname=%北京% EXE

12、CUTE 訂貨.uspGetSup5.5.使用使用 OUTPUT 參數(shù)參數(shù)n例例7 7- -9 9. 指定供應(yīng)商所經(jīng)手訂購(gòu)單的數(shù)量和平均金額指定供應(yīng)商所經(jīng)手訂購(gòu)單的數(shù)量和平均金額,一個(gè)參數(shù)傳入指定一個(gè)參數(shù)傳入指定供應(yīng)商名供應(yīng)商名,一個(gè)參數(shù)傳出,一個(gè)參數(shù)傳出計(jì)算的訂計(jì)算的訂單數(shù)量單數(shù)量,計(jì)算的平均金額用計(jì)算的平均金額用RETURN語句返回語句返回CREATE PROCEDURE uspGetAvg sname char(20),count int OUTPUTAS DECLARE avg money SELECT count=COUNT(*),avg=AVG(金額) FROM 訂貨.訂購(gòu)單 WH

13、ERE 供貨方= (SELECT 供應(yīng)商號(hào) FROM 訂貨.供應(yīng)商 WHERE 供應(yīng)商名=sname) RETURN avg北京信息科技大學(xué)n執(zhí)行執(zhí)行uspGetAvg存儲(chǔ)過程計(jì)算供應(yīng)商存儲(chǔ)過程計(jì)算供應(yīng)商“華通電子華通電子公司公司”的訂單數(shù)和平均金額:的訂單數(shù)和平均金額: DECLARE avg money,count int EXECUTE avg=uspGetAvg 華通電子公司, count OUTPUT PRINT 華通電子公司的訂單數(shù)是:+STR(count)+ ,平均金額是:+STR(avg,6,2)6.6.使用使用 cursor 數(shù)據(jù)類型的參數(shù)數(shù)據(jù)類型的參數(shù) n例7-10. 在存

14、儲(chǔ)過程中使用游標(biāo)CREATE PROCEDURE uspCurrencyCursor CurrencyCursor CURSOR VARYING OUTPUTASSET CurrencyCursor = CURSOR FOR SELECT 倉(cāng)庫(kù)號(hào),城市,面積 FROM 倉(cāng)儲(chǔ).倉(cāng)庫(kù)OPEN CurrencyCursor;接下來說明相應(yīng)的變量、執(zhí)行存儲(chǔ)過程uspCurrencyCursor,并根據(jù)返回的游標(biāo)進(jìn)行查詢處理:DECLARE whno CHAR(6),city CHAR(10),area INTDECLARE MyCursor CURSOR;EXEC uspCurrencyCursor

15、CurrencyCursor = MyCursor OUTPUT;PRINT - 倉(cāng)庫(kù)列表-PRINT 倉(cāng)庫(kù)號(hào) 所在城市 倉(cāng)庫(kù)面積- 從游標(biāo)讀當(dāng)前記錄到變量FETCH FROM MyCursor INTO whno,city,area- 用FETCH_STATUS判斷FETCH語句是否成功,并控制循環(huán)讀WHILE FETCH_STATUS=0BEGINPRINT whno+ +city+ STR(area,4)FETCH FROM MyCursor INTO whno,city,areaEND- 關(guān)閉游標(biāo)CLOSE MyCursor- 釋放游標(biāo)DEALLOCATE MyCursor;北京信息科

16、技大學(xué)獲得有關(guān)存儲(chǔ)過程的信息 n存儲(chǔ)過程的定義可以通過當(dāng)前數(shù)據(jù)庫(kù)的sys.sql_modules和sys.objects系統(tǒng)視圖查詢到 SELECT definition FROM sys.sql_modules JOIN sys.objects ON sys.sql_modules.object_id = sys.objects.object_id WHERE TYPE = P北京信息科技大學(xué)7.2.6 在數(shù)據(jù)庫(kù)設(shè)計(jì)階段設(shè)計(jì)存儲(chǔ)過程n使用存儲(chǔ)過程也是數(shù)據(jù)庫(kù)設(shè)計(jì)階段要考慮的內(nèi)容之一,根據(jù)業(yè)務(wù)需求和開發(fā)者的經(jīng)驗(yàn)可以靈活使用存儲(chǔ)過程。n使用存儲(chǔ)過程,可以: 提高系統(tǒng)的開發(fā)效率和運(yùn)行效率 使數(shù)據(jù)查詢

17、和操作更簡(jiǎn)單 使數(shù)據(jù)更安全n數(shù)據(jù)庫(kù)設(shè)計(jì)者可以在物理數(shù)據(jù)模型設(shè)計(jì)階段進(jìn)行存儲(chǔ)過程的設(shè)計(jì)。n在PowerDesingner的物理數(shù)據(jù)模型(PDM)設(shè)計(jì)階段可以設(shè)計(jì)存儲(chǔ)過程。北京信息科技大學(xué)7.2.7 用戶定義函數(shù)nSQL Server還可以定義用戶函數(shù),用戶函數(shù)和存儲(chǔ)過程的基本思想是一樣的,只是定義和使用方法有一些區(qū)別。創(chuàng)建函數(shù)的示例:CREATE FUNCTION 訂貨.udfGetOrderNum(whno char(6),sum money)RETURNS intWITH EXECUTE AS CALLERASBEGINDECLARE count intSELECT count=COUNT(

18、*) FROM 訂貨.訂購(gòu)單WHERE 金額=sum AND 經(jīng)手人 IN(SELECT 職工號(hào) FROM 基礎(chǔ).職工 WHERE 倉(cāng)庫(kù)號(hào)=whno)RETURN countEND調(diào)用udfGetOrderNum函數(shù):PRINT WH1倉(cāng)庫(kù)金額在1000以上的訂單數(shù)是:+STR(訂貨.udfGetOrderNum(WH1,1000)北京信息科技大學(xué)7.3 觸發(fā)器及其用途n觸發(fā)器可以看作是一類特殊的存儲(chǔ)過程,它在滿足某個(gè)特定條件時(shí)自動(dòng)觸發(fā)執(zhí)行。觸發(fā)器和存儲(chǔ)過程同是提高數(shù)據(jù)庫(kù)服務(wù)器性能的有力工具。北京信息科技大學(xué)7.3.1 基本概念n觸發(fā)器是一種程序或是一種過程,它和存儲(chǔ)過程一樣是事先設(shè)計(jì)好存儲(chǔ)在

19、數(shù)據(jù)庫(kù)中的,與存儲(chǔ)過程不同的是觸發(fā)器不需要專門調(diào)用或執(zhí)行,觸發(fā)器是在某個(gè)特定條件發(fā)生時(shí)自動(dòng)觸發(fā)執(zhí)行的。n分為DML(數(shù)據(jù)操作語言)觸發(fā)器、DDL(數(shù)據(jù)定義語言)觸發(fā)器和LOGIN觸發(fā)器 DML觸發(fā)器在執(zhí)行數(shù)據(jù)操作語言(Update、Insert和Delete)時(shí)觸發(fā) DDL觸發(fā)器在執(zhí)行數(shù)據(jù)定義語言時(shí)觸發(fā) LOGIN觸發(fā)器在有用戶登錄時(shí)觸發(fā)北京信息科技大學(xué)DML觸發(fā)器nDML觸發(fā)器也是一個(gè)數(shù)據(jù)庫(kù)對(duì)象,但DML觸發(fā)器依附于表(或視圖)。nDML觸發(fā)器分為插入觸發(fā)器、刪除觸發(fā)器和更新觸發(fā)器三類n觸發(fā)器的三個(gè)要素:n定義觸發(fā)器的表(或視圖)n激活觸發(fā)器的數(shù)據(jù)操作語句n采取的動(dòng)作北京信息科技大學(xué)建立觸發(fā)

20、器 nON指出定義觸發(fā)器的表或視圖 nFOR INSERT、UPDATE或DELETE指出觸發(fā)事件nsql_statement:觸發(fā)器所采取的操作CREATE TRIGGER schema_name . trigger_name ON table | view FOR INSERT , UPDATE , DELETE AS sql_statement 北京信息科技大學(xué)一個(gè)簡(jiǎn)單的建立觸發(fā)器的例子CREATE TRIGGER wh_triggerON 倉(cāng)儲(chǔ).倉(cāng)庫(kù)FOR INSERT AS PRINT 插入了一個(gè)倉(cāng)庫(kù)元組指定觸發(fā)器所依指定觸發(fā)器所依附的表附的表激活觸發(fā)器的數(shù)激活觸發(fā)器的數(shù)據(jù)操作語句據(jù)

21、操作語句觸發(fā)器要采取的動(dòng)作觸發(fā)器要采取的動(dòng)作7.3.3 deleted表和inserted表系統(tǒng)為觸發(fā)器運(yùn)行而自動(dòng)派生兩個(gè)視圖:系統(tǒng)為觸發(fā)器運(yùn)行而自動(dòng)派生兩個(gè)視圖: INSERTEDINSERTED和和DELETEDDELETEDn這兩個(gè)表的結(jié)構(gòu)與激活觸發(fā)器的表的結(jié)構(gòu)相同,觸發(fā)器執(zhí)這兩個(gè)表的結(jié)構(gòu)與激活觸發(fā)器的表的結(jié)構(gòu)相同,觸發(fā)器執(zhí)行完成后,系統(tǒng)自動(dòng)刪除這兩個(gè)臨時(shí)表。行完成后,系統(tǒng)自動(dòng)刪除這兩個(gè)臨時(shí)表。n用戶可以用用戶可以用SELECTSELECT語句查詢臨時(shí)表的內(nèi)容,但不能對(duì)它們語句查詢臨時(shí)表的內(nèi)容,但不能對(duì)它們進(jìn)行修改。進(jìn)行修改。n在執(zhí)行在執(zhí)行INSERTINSERT語句向表插入數(shù)據(jù)時(shí),系統(tǒng)

22、也將相應(yīng)的數(shù)據(jù)語句向表插入數(shù)據(jù)時(shí),系統(tǒng)也將相應(yīng)的數(shù)據(jù)插入到插入到INSERTEDINSERTED表中,即表中,即INSERTEDINSERTED表存放剛插入的新記錄。表存放剛插入的新記錄。 n在執(zhí)行在執(zhí)行DELETEDELETE語句刪除表中數(shù)據(jù)時(shí),系統(tǒng)也將刪除的數(shù)據(jù)語句刪除表中數(shù)據(jù)時(shí),系統(tǒng)也將刪除的數(shù)據(jù)插入到插入到DELETEDDELETED表中,即表中,即DELETEDDELETED存放剛刪除的舊記錄。存放剛刪除的舊記錄。n在執(zhí)行在執(zhí)行UPDATEUPDATE語句時(shí),語句時(shí),INSERTEDINSERTED表存放更新后的數(shù)據(jù),表存放更新后的數(shù)據(jù),DELETEDDELETED表存放更新前的數(shù)據(jù)

23、表存放更新前的數(shù)據(jù) 。北京信息科技大學(xué)deleted表和inserted表的作用?n可以使用deleted表和inserted表判斷正在操作的記錄是否符合要求,從而檢查錯(cuò)誤并采取相應(yīng)的措施 n找出數(shù)據(jù)修改前、后表的狀態(tài)差異,并基于該差異采取相應(yīng)的措施n可以擴(kuò)展表之間的參照完整性 deleted表和inserted表只在觸發(fā)器內(nèi)可用,一旦觸發(fā)器完成任務(wù),這兩個(gè)系統(tǒng)產(chǎn)生的臨時(shí)表將自動(dòng)刪除 例:定義一個(gè)觸發(fā)器,例:定義一個(gè)觸發(fā)器,使得當(dāng)刪除倉(cāng)庫(kù)記使得當(dāng)刪除倉(cāng)庫(kù)記錄時(shí),同時(shí)將所屬所有職工記錄的倉(cāng)庫(kù)號(hào)錄時(shí),同時(shí)將所屬所有職工記錄的倉(cāng)庫(kù)號(hào)字段值置為空值字段值置為空值NULLNULL: CREATE TRI

24、GGER w_del_triggerON FORAS倉(cāng)儲(chǔ).倉(cāng)庫(kù) DELETEUPDATE 基礎(chǔ).職工SET 倉(cāng)庫(kù)號(hào)=NULLWHERE 倉(cāng)庫(kù)號(hào) in (SELECT 倉(cāng)庫(kù)號(hào) FROM deleted)北京信息科技大學(xué)例:實(shí)現(xiàn)數(shù)據(jù)復(fù)制(同步)功能例:實(shí)現(xiàn)數(shù)據(jù)復(fù)制(同步)功能n假設(shè)有兩個(gè)表:假設(shè)有兩個(gè)表:student 和和student_history。當(dāng)往。當(dāng)往student表里插入記錄的同時(shí),也往表里插入記錄的同時(shí),也往student_history插入相同的數(shù)據(jù)。插入相同的數(shù)據(jù)。 CREATE TRIGGER student_ins_trigger ON student FOR INSER

25、T AS INSERT INTO student_history select * from inserted觸發(fā)器應(yīng)用舉例 n例7-13:當(dāng)在對(duì)器件數(shù)量進(jìn)行修改之后,如果數(shù)量低于5就給出預(yù)警提示。CREATE TRIGGER reminder1ON 倉(cāng)儲(chǔ).庫(kù)存FOR UPDATE AS DECLARE amount intSELECT amount=數(shù)量 FROM insertedIF amount5RAISERROR (庫(kù)存數(shù)量已經(jīng)小于5!, 16, 10)執(zhí)行如下UPDATE語句會(huì)發(fā)生什么? UPDATE 倉(cāng)儲(chǔ).庫(kù)存 SET 數(shù)量=數(shù)量 - 3 WHERE 倉(cāng)庫(kù)號(hào)=WH1 AND 器件號(hào)

26、=P1則會(huì)在客戶端顯示如下信息:消息50000,級(jí)別16,狀態(tài)10,過程reminder1,第7行庫(kù)存數(shù)量已經(jīng)小于5!北京信息科技大學(xué)觸發(fā)器應(yīng)用舉例n由于CHECK約束只能定義列級(jí)或表級(jí)約束,表間的任何約束(在本例中是業(yè)務(wù)規(guī)則)都必須通過定義觸發(fā)器來實(shí)現(xiàn)。n例7-14:使用DML觸發(fā)器實(shí)現(xiàn)表之間強(qiáng)制業(yè)務(wù)規(guī)則北京信息科技大學(xué) 編程實(shí)現(xiàn)業(yè)務(wù)規(guī)定“如果本地有供應(yīng)商則訂購(gòu)單不許發(fā)往異地”56北京信息科技大學(xué)編程實(shí)現(xiàn)業(yè)務(wù)規(guī)定“如果本地有供應(yīng)商則訂購(gòu)單不許發(fā)往異地”n可以在訂購(gòu)單上定義一個(gè)Insert和Update觸發(fā)器,當(dāng)插入新的訂購(gòu)單記錄、或修改供貨方屬性時(shí),如果供貨方屬性不為NULL則做如下處理:n

27、通過經(jīng)手人屬性確定所參照職工記錄;n通過職工記錄的倉(cāng)庫(kù)號(hào)屬性確定所參照倉(cāng)庫(kù)記錄及其城市屬性值;n通過供貨方屬性確定所參照供應(yīng)商記錄及其地址屬性值;1.通過倉(cāng)庫(kù)的城市屬性值和供應(yīng)商的地址屬性值判斷它們是否屬于一個(gè)城市,如果不是則再檢查有無同城的供應(yīng)商,如果有則拒絕對(duì)訂購(gòu)單的插入或更新操作。北京信息科技大學(xué)查看導(dǎo)致觸發(fā)器觸發(fā)的事件 n通過查詢sys.triggers和sys.trigger_events系統(tǒng)目錄表可以查詢導(dǎo)致觸發(fā)器觸發(fā)的事件 例7-15:查詢是哪個(gè)Transact-SQL語言事件導(dǎo)致觸發(fā)了觸發(fā)器IsSameCity。SELECT TE.*FROM sys.trigger_event

28、s AS TE JOIN sys.triggers AS TON T.object_id = TE.object_idWHERE T.name = IsSameCity北京信息科技大學(xué)7.3.6 在數(shù)據(jù)庫(kù)設(shè)計(jì)階段設(shè)計(jì)觸發(fā)器nDML觸發(fā)器常常用于強(qiáng)制業(yè)務(wù)規(guī)則、數(shù)據(jù)完整性和一些提示服務(wù),如下一些場(chǎng)合可以使用DML觸發(fā)器:當(dāng)在某些表上發(fā)生數(shù)據(jù)操作時(shí)可以及時(shí)在線提示或發(fā)送短信、電子郵件給用戶,以引起用戶的關(guān)注。觸發(fā)器可以通過級(jí)聯(lián)的方式對(duì)相關(guān)的表進(jìn)行修改。例如,對(duì)父表的修改,可以引起對(duì)子孫表的一系列修改,從而保證數(shù)據(jù)的一致性和完整性(簡(jiǎn)單的可以通過參照完整性的級(jí)聯(lián)功能完成)。觸發(fā)器可以禁止或撤消違反數(shù)據(jù)

29、完整性的修改(一般可以用參照完整性約束完成)。1. 觸發(fā)器可以強(qiáng)制定義比CHECK約束更加復(fù)雜的約束,特別是跨表的約束則只能使用觸發(fā)器來實(shí)現(xiàn)。北京信息科技大學(xué)7.4 動(dòng)態(tài)SQLn有時(shí)候在編程序時(shí)SQL語句或語句的參數(shù)和格式不能確定,應(yīng)用程序只能在執(zhí)行時(shí)才知道需要什么樣的SQL語句,即必須在應(yīng)用程序執(zhí)行時(shí)動(dòng)態(tài)建立SQL語句。北京信息科技大學(xué)7.4.1 動(dòng)態(tài)SQL語句的劃分n沒有參數(shù)、沒有返回結(jié)果的SQL語句,這類語句主要是建立數(shù)據(jù)庫(kù)對(duì)象的語句,如動(dòng)態(tài)生成的CREATE TABLE語句;n有參數(shù)、但沒有返回結(jié)果的SQL語句,這類語句主要是完成數(shù)據(jù)庫(kù)操作的語句,如動(dòng)態(tài)生成的INSERT、UPDATE和DELETE語句;n有參數(shù)、有返回結(jié)果的SQL語句,這類語句主要是對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)查詢的語句,也稱作動(dòng)態(tài)游標(biāo)(DYNAMIC CURSOR)語句。北京信息科技大學(xué)7.4.2 動(dòng)態(tài)定義功能n一般格式是: EXECUTE IMMEDIATE SQLStatement n其中SQLStatement是構(gòu)成合法SQL語句的字符串(一般應(yīng)該是變量)。 北京信息科技大學(xué)7.4.3 動(dòng)態(tài)操作功能n這種格式的動(dòng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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)論