![《數(shù)據(jù)庫原理與技術(shù)(第二版)》課件第6章_第1頁](http://file4.renrendoc.com/view/3434fd2d89d05cd63d55638b99249c42/3434fd2d89d05cd63d55638b99249c421.gif)
![《數(shù)據(jù)庫原理與技術(shù)(第二版)》課件第6章_第2頁](http://file4.renrendoc.com/view/3434fd2d89d05cd63d55638b99249c42/3434fd2d89d05cd63d55638b99249c422.gif)
![《數(shù)據(jù)庫原理與技術(shù)(第二版)》課件第6章_第3頁](http://file4.renrendoc.com/view/3434fd2d89d05cd63d55638b99249c42/3434fd2d89d05cd63d55638b99249c423.gif)
![《數(shù)據(jù)庫原理與技術(shù)(第二版)》課件第6章_第4頁](http://file4.renrendoc.com/view/3434fd2d89d05cd63d55638b99249c42/3434fd2d89d05cd63d55638b99249c424.gif)
![《數(shù)據(jù)庫原理與技術(shù)(第二版)》課件第6章_第5頁](http://file4.renrendoc.com/view/3434fd2d89d05cd63d55638b99249c42/3434fd2d89d05cd63d55638b99249c425.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第六章SQLSERVER數(shù)據(jù)庫系統(tǒng)SQLSERVER管理工具Transact-SQL語言本章要點(diǎn)退出SQLSERVER中的存儲過程SQLSERVER中的觸發(fā)器SQLServer中的數(shù)據(jù)導(dǎo)入和導(dǎo)出SQLSERVER管理工具服務(wù)管理器建立數(shù)據(jù)庫、表、索引的操作建立視圖的操作數(shù)據(jù)完整性保護(hù)備份與恢復(fù)數(shù)據(jù)庫安全性管理查詢分析器Transact-SQL語言簡介數(shù)據(jù)定義語言(DDL)數(shù)據(jù)操縱語言(DML)數(shù)據(jù)控制語言(DCL)系統(tǒng)存儲過程(SystemStoredProcedure)一些附加的語言元素?cái)?shù)據(jù)定義語言(DDL)指用來定義和管理數(shù)據(jù)庫以及數(shù)據(jù)庫中的各種對象的語句。創(chuàng)建數(shù)據(jù)庫的命令創(chuàng)建數(shù)據(jù)庫表修改數(shù)據(jù)表與刪除數(shù)據(jù)表建立視圖修改視圖建立索引創(chuàng)建數(shù)據(jù)庫的命令語句格式:
CREATEDATABASE<數(shù)據(jù)庫名>[ON[PRIMARY][<文件1>[,<文件2>……]][,<文件組和文件>]][LOGON<文件>][COLLATE<排序規(guī)則名稱>][FORLOAD|FORATTACH]
【例】創(chuàng)建數(shù)據(jù)庫waremanage,數(shù)據(jù)文件初始大小為1M,最大大小10M,如果需要增加空間,每次增加1M。邏輯文件同樣設(shè)置。語句如下:
CREATEDATABASEwaremanageON(NAME=‘waremanage_data’,F(xiàn)ILENAME=c:\programfiles\Microsoftsqlserver\data\waremanage_data.mdf’,SIZE=1,MAXSIZE=10,F(xiàn)ILEGROWTH=1)LOGON(NAME=waremanage_log,F(xiàn)ILENAME=waremanage_data.ldf,SIZE=1,MAXSIZE=10,F(xiàn)ILEGROWTH=1)創(chuàng)建數(shù)據(jù)庫表語句格式:
CREATETABLE<表名說明>({列定義或列計(jì)算式}[CHECK子句][ON{<文件組名>|DEFAULT}][TEXTIMAGE_ON{<文件組名>|DEFAULT}]
【例】在數(shù)據(jù)庫waremanage中創(chuàng)建關(guān)于出版物的表publishers(pub_id,pub_name,author,unitprice,unit)。語句如下:
CREATETABLEpublishers(pub_idchar(4)NOTNULLCONSTRAINTUPKCL_pubindPRIMARYKEYCLUSTEREDCHECK(pub_idIN('0389','0736','0877','1622','1756')ORpub_idLIKE'20[0-9][0-9]'),pub_namevarchar(40)NULL,authorvarchar(20)NULL,unitpriceintNULL,unitvarchar(30)NULLDEFAULT('USA'))修改數(shù)據(jù)表與刪除數(shù)據(jù)表修改數(shù)據(jù)表與刪除數(shù)據(jù)表的語句和標(biāo)準(zhǔn)SQL語言中修改數(shù)據(jù)表與刪除數(shù)據(jù)表的語句基本相同,但修改數(shù)據(jù)表的添加新列、修改列屬性等語句中可包括添加約束、修改約束的內(nèi)容?!纠繛閜ublishers的unitprice創(chuàng)建一個名為CK_publishers的約束,要求控制unitprice的值在10到1000之間。語句如下:
ALTERTABLEpublishersADDCONSTRAINTCK_publishersCHECK(unitprice>=10ANDunitprice<=1000)建立視圖語句格式:
CREATEVIEW[<數(shù)據(jù)庫名>.][<屬主名>.]<視圖名>[({<列名>})][WITH<視圖屬性>]AS<子查詢>[WITHCHECKOPTION]修改視圖語句格式:ALTERVIEW[<數(shù)據(jù)庫名>.][<屬主名>.]<視圖名>[({<列名>})][WITH<視圖屬性>]AS<子查詢>[WITHCHECKOPTION]
【例】原有關(guān)于表publication的視圖VIEW_pub;修改其內(nèi)容,要求輸出pub_id,pub_name與unitprice,顯示條件是unitprice大于100。語句如下:
ALTERVIEWwaremanage.VIEW_pubASSELECTpub_id,pub_name,unitpriceFROMpublishersWHEREunitprice>100建立索引語句格式:
CREATE[UNIQUE][CLUSTERRED|NONCLUSTERRED]INDEX<索引名稱>ON{<表名>|<視圖名>}({<列名>[ASC|DESC]})[{WITH<索引選項(xiàng)>}][ON<文件組>]
【例】求關(guān)于表publishers建立關(guān)于pub_id的聚集索引。語句如下:
CREATEUNIQUECLUSTERREDINDEXpub_pub_id(pub_idASC)WITHIGNORE_DUP_KEY數(shù)據(jù)操縱語言(DML)指用來查詢、添加、修改和刪除數(shù)據(jù)庫中數(shù)據(jù)的語句。插入數(shù)據(jù)語句修改數(shù)據(jù)語句查詢語句插入數(shù)據(jù)語句語句格式:INSERTINTO{<表名>|<視圖名>}{[<列名>]})VALUES({DEFAULT|NULL|<表達(dá)式>})修改數(shù)據(jù)語句語句格式:
UPDATE{<表名>|<視圖名>}SET{列名=<表達(dá)式>|DEFAULT|NULL}[FROM{<表名>}][WHERE<條件表達(dá)式>]
【例】如果有成績表1(學(xué)號,姓名,總分)和成績表2(學(xué)號,姓名,C語言分?jǐn)?shù)),求更新成績1表中的總分,等于相同學(xué)號記錄的原總分加C語言分?jǐn)?shù)。語句如下:
UPDATE成績表1SET成績表1.總分=成績表1.總分+成績表2.C語言分?jǐn)?shù)WHERE成績表1.學(xué)號=成績表2.學(xué)號查詢語句語句格式:
SELECT{<表達(dá)式>}[INTO<新表名>]FROM{<表名>}[WHERE<選擇條件表達(dá)式>][GROUPBY{<分組字段名稱>}][HAVING<分組條件表達(dá)式>][ORDERBY{<排序字段>[ASC|DESC]}][COMPUTE<聚合函數(shù)>][FOR<BROWSE或XML選項(xiàng)>]【例】如果有表titles,包括title,type,price,advance,ytd_sales等字段,顯示含有本年度截止到現(xiàn)在的當(dāng)前銷售額的行,然后按type分類以遞減順序計(jì)算書籍的平均價(jià)格和預(yù)付款總額,最后計(jì)算全部書籍的平均價(jià)格和預(yù)付款總額。語句如下:
SELECTCAST(titleASchar(20))AStitle,type,price,advanceFROMtitlesWHEREytd_salesISNOTNULLORDERBYtypeDESCCOMPUTEAVG(price),SUM(advance)BYtypeCOMPUTESUM(price),SUM(advance)數(shù)據(jù)控制語言(DCL)用來設(shè)置或者更改數(shù)據(jù)庫用戶或角色權(quán)限的語句。GRANT語句DENY語句REVOKE語句其他語言元素GRANT語句
GRANT語句是授權(quán)語句,它可以把語句權(quán)限或者對象權(quán)限授予給其他用戶和角色。授予語句權(quán)限的語句語句格式:
GRANT{ALL|<語句>}TO<用戶名>授予對象權(quán)限的語句語句格式:GRANT{ALL[PRIVILEGES]|<對象權(quán)限>}{[(<列名>)ON{<表名>|<視圖名>}|ON{<表名>|<視圖名>}[(<列名>)]|ON{<存儲過程>|<擴(kuò)展程序>}|ON{<用戶定義函數(shù)>}]TO<用戶名>[WITHGRANTOPTION][AS{<組>|<角色>}]DENY語句用于拒絕給當(dāng)前數(shù)據(jù)庫內(nèi)的用戶或者角色授予權(quán)限,并防止用戶或角色通過其組或角色成員繼承權(quán)限。否定語句權(quán)限的語句語句格式:
DENY{ALL|<語句>}TO<用戶名>否定對象權(quán)限的語句語句格式:
DENY{ALL[PRIVILEGES]|<對象權(quán)限>}{[(<列名>)]ON{<表名>|<視圖名>}|ON{<表名>|<視圖名>}[(<列名>)]|ON{<存儲過程>|<擴(kuò)展程序>}|ON{<用戶定義函數(shù)>}}TO<用戶名>[CASCADE]REVOKE語句將以前在當(dāng)前數(shù)據(jù)庫內(nèi)的用戶或者角色上授予或拒絕的權(quán)限刪除,但是該語句并不影響用戶或者角色從其他角色中作為成員繼承過來的權(quán)限。收回語句權(quán)限的語句語句格式:
REVOKE{ALL|<語句>}TO<用戶名>收回對象權(quán)限的語句語句格式:
REVOKE[GRANTOPTIONFOR]{ALL[PRIVILEGES]|<對象權(quán)限>}{[(<列名>)]}ON{<表名>|<視圖名>}|ON{<表名>|<視圖名>}[(<列名>)]|ON{<存儲過程>|<擴(kuò)展程序>}|ON{<用戶定義函數(shù)>}}{TO|FROM}<用戶名>[CASCADE][AS{<組>|<角色>}]其他語言元素注釋:可以使用兩種類型的注釋字符:一種是ANSI標(biāo)準(zhǔn)的注釋符“--”,它用于單行注釋;另一種是與C語言相同的程序注釋符號,即“/**/”。變量:用戶自己定義的局部變量;系統(tǒng)提供的全局變量。運(yùn)算符:算術(shù)運(yùn)算符、賦值運(yùn)算符、位運(yùn)算符、比較運(yùn)算符、邏輯運(yùn)算符以及字符串串聯(lián)運(yùn)算符。函數(shù)流程控制語句函數(shù)Transact-SQL編程語言提供了三種函數(shù):1)行集函數(shù):行集函數(shù)可以在Transact-SQL語句中當(dāng)作表引用。2)聚合函數(shù):聚合函數(shù)用于對一組值執(zhí)行計(jì)算并返回一個單一的值。3)標(biāo)量函數(shù):標(biāo)量函數(shù)用于對傳遞給它的一個或者多個參數(shù)值進(jìn)行處理和計(jì)算,并返回一個單一的值。SQLServer中最常用的幾種函數(shù):1)字符串函數(shù)2)日期和時間函數(shù)3)數(shù)學(xué)函數(shù)4)轉(zhuǎn)換函數(shù)5)系統(tǒng)函數(shù)6)聚合函數(shù)1)字符串函數(shù)(1)基本字符串函數(shù):UPPER(<字符串>)LOWER(<字符串>)SPACE(<整數(shù)>)REPLICATE(<字符串>,<整數(shù)>)STUFF(<字符串1>,<數(shù)字>,<整數(shù)>,<字符串2>)REVERSE(<字符串表達(dá)式>)LTRIM(<字符串>)RTRIM(<字符串>)(2)字符串查找函數(shù):CHARINDEX(<字符串1>,<字符串2>)PATINDEX(’%<字串>%’,<字符串>)(3)長度和分析函數(shù):SUBSTRING(<字符串1>,<數(shù)字>,<整數(shù)>)RIGHT(<字符串>,<整數(shù)>)LEFT(<字符串>,<整數(shù)>)(4)轉(zhuǎn)換函數(shù)ASCII(<字符>)CHAR(<整數(shù)>)STR(<數(shù)值表達(dá)式>[,<整數(shù)>[,<小數(shù)位>]])2)日期和時間函數(shù)DATEADD(<參數(shù)>,<數(shù)字>,<日期>)DATEDIFF(<參數(shù)>,<日期1>,<日期2>)DATENAME(<參數(shù)>,<日期>)DATEPART(<參數(shù)>,<日期>)GETDATE(<日期>)DAY(<日期>)MONTH(<日期>)YEAR(<日期>)3)數(shù)學(xué)函數(shù)ABS(n)CEILING(n)DEGREES(n)FLOOR(n)POWER(n,m)RADIANS(n)SIGN(n)EXP(n)LOG(n)LOG10(n):求n的以10為底的對數(shù)值。SQUARE(n):求n的平方。SQRT(n):求n的平方根。SIN(n):求n的正弦值。COS(n):求n的余弦值。TAN(n):求n的正切值。PI():返回π的值。RAND():產(chǎn)生隨機(jī)數(shù)。MOD(m,n):求m除以n的余數(shù)。ROUND(n,m):對n作四舍五入處理,保留m位。4)轉(zhuǎn)換函數(shù)CONVERT(<轉(zhuǎn)換后數(shù)據(jù)類型>[(<長度>)],<表達(dá)式>[,<轉(zhuǎn)換樣式>])CAST(<表達(dá)式>,<轉(zhuǎn)換后數(shù)據(jù)類型>)5)系統(tǒng)函數(shù)DB_ID(<名稱>)DB_NAME(<ID號>)HOST_ID(<名稱>)HOST_NAME(<ID號>)OBJECT_ID(<名稱>)OBJECT_NAME(<ID號>)SUSER_ID(<名稱>)SUSER_NAME(<ID號>)USER_ID(<名稱>)USER_NAME(<ID號>)COL_NAME(<表號>,<列號>)COL_LENGTH(<表名>,<列名>)DATALENGTH(<表達(dá)式>)6)聚合函數(shù)聚合函數(shù)可以返回整個或者幾個列或者一個列的匯總數(shù)據(jù),它常用來計(jì)算SELECT語句查詢的統(tǒng)計(jì)值。聚合函數(shù)經(jīng)常與SELECT語句的GROUPBY子句一同使用。聚合函數(shù)包括:AVG、COUNT、MAX、MIN、SUM。流程控制語句BEGIN…END語句IF…ELSE語句CASE語句WHILE…CONTINUE…BREAK語句GOTO語句WAITFOR語句RETURN語句BEGIN…END語句將多個Transact-SQL語句組合成一個語句塊,并將它們視為一個單元處理。在條件語句和循環(huán)等控制流程語句中,當(dāng)符合特定條件便要執(zhí)行兩個或者多個語句時,就需要使用BEGIN…END語句。語句格式:BEGIN{<執(zhí)行語句>|<語句塊>}ENDIF…ELSE語句條件判斷語句。語句格式:
IF<條件表達(dá)式>{<執(zhí)行語句>|<語句塊>}[ELSE{<執(zhí)行語句>|<語句塊>}]CASE語句計(jì)算多個條件式,并將其中一個符合條件的結(jié)果表達(dá)式返回。語句格式1:
CASE<表達(dá)式>WHEN<值1>THEN<表達(dá)式1>……WHEN<值n>THEN<表達(dá)式n>[ELSE<表達(dá)式n+1>]END語句格式2:
CASEWHEN<條件表達(dá)式1>THEN<表達(dá)式1>……WHEN<條件表達(dá)式n>THEN<表達(dá)式n>[ELSE<表達(dá)式n+1>]ENDWHILE…CONTINUE…BREAK語句用于設(shè)置重復(fù)執(zhí)行SQL語句或語句塊的條件。只要指定的條件為真,就重復(fù)執(zhí)行語句。語句格式:
WHILE條件表達(dá)式{<執(zhí)行語句1>|<語句塊1>}[BREAK][CONTINUE]{<執(zhí)行語句2>|<語句塊2>}GOTO語句使程序直接跳到指定的標(biāo)有標(biāo)識符的位置處繼續(xù)執(zhí)行,而位于GOTO語句和標(biāo)識符之間的程序?qū)⒉粫粓?zhí)行。語句格式:
GOTO<標(biāo)識符>……<標(biāo)識符>:WAITFOR語句用于暫時停止執(zhí)行SQL語句、語句塊或者存儲過程等,直到所設(shè)定的時間已過或者所設(shè)定的時間已到才繼續(xù)執(zhí)行。語句格式:
WAITFOR{DELAY'<時間間隔>'|TIME'<時間>'}RETURN語句用于無條件地終止一個查詢、存儲過程或者批處理,此時位于RETURN語句之后的程序?qū)⒉粫粓?zhí)行。語句格式:
RETURN[<整數(shù)>]SQLSERVER中的存儲過程存儲過程一組為了完成特定功能的Transaction-SQL語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。用戶通過存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。分為兩類:系統(tǒng)提供的存儲過程和用戶自定義存儲過程。系統(tǒng)過程主要存儲在master數(shù)據(jù)庫中,并以sp_為前綴,它從系統(tǒng)表中獲取信息,為系統(tǒng)管理員管理SQLServer提供支持。用戶自定義存儲過程是由用戶創(chuàng)建并能完成某一特定功能(如查詢用戶所需數(shù)據(jù)信息)的存儲過程。在SQLServer中,用戶創(chuàng)建一個存儲過程有兩種方法:
1.使用Transaction-SQL命令CreateProcedure;
2.使用圖形化管理工具EnterpriseManager。使用Transaction-SQL命令創(chuàng)建存儲過程語句格式為:CREATEPROC[EDURE]<存儲過程名>[;<分組數(shù)字>][{@<參數(shù)><參數(shù)數(shù)據(jù)類型>}[VARYING][=<參數(shù)默認(rèn)值>][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]AS<SQL語句>[...n]【例】創(chuàng)建數(shù)據(jù)庫waremanege的存儲過程:返回關(guān)于出版物的表publishers中所有作者以及他們的文章和說明??稍诓樵兎治銎髦休斎胍韵麓a:USEwaremanageGOCREATEPROCEDUREpub_inforASSELECTpub_name,author,unitFROMpublishersGO
按工具條中“執(zhí)行查詢”按鈕,將生成存儲過程:pub_infor?!纠吭诖鎯^程中使用參數(shù)int_unitprice,將來在調(diào)用時只要給出int_unitprice的值,就能顯示所有單價(jià)大于等于該值的出版物名稱及其作者和說明。USEwaremanegeGOCREATEPROCEDUREpub_infor@int_unitpriceINTASSELECTpub_name,author,unitFROMpublishersWHEREunitprice>=@int_unitpriceGO然后在查詢分析器中調(diào)用已創(chuàng)建的存儲過程pub_infor,求顯示所有單價(jià)大于等于200的記錄的相關(guān)信息:首先選“查詢”,選“更改數(shù)據(jù)庫”,選擇數(shù)據(jù)庫,再輸入如下語句:declare@int_unitpriceintEXECpub_infor@int_unitprice=200再按下“執(zhí)行”按鈕,將可見執(zhí)行結(jié)果。使用企業(yè)管理器創(chuàng)建存儲過程1.啟動企業(yè)管理器,選擇要使用的服務(wù)器。2.展開要創(chuàng)建存儲過程的數(shù)據(jù)庫。3.在文本框中預(yù)置了一條默認(rèn)語句,用戶將之換為自己的代碼。4.單擊檢查語法,檢查語法是否正確。5.單擊確定,保存。6.在右窗格中,右擊該存儲過程,在彈出菜單中選擇所有任務(wù),選擇管理權(quán)限,設(shè)置權(quán)限。重新命名存儲過程命令格式為:
sp_rename<原存儲過程名>,<新存儲過程名>刪除存儲過程命令格式為:DROPPROCEDURE{<存儲過程名>}}[,…n]執(zhí)行存儲過程命令格式為:
[EXECUTE]{[@<整型變量>=]{<存儲過程名>[;<分組數(shù)字>]|@<變量名>}[[@<參數(shù)>=]{<值>|@<返回參數(shù)值>[OUTPUT]|[DEFAULT][,…n][WITHRECOMPILE]系統(tǒng)存儲過程是系統(tǒng)創(chuàng)建的存儲過程,目的在于能夠方便地從系統(tǒng)表中查詢信息或完成與更新數(shù)據(jù)庫表相關(guān)的管理任務(wù)或其它的系統(tǒng)管理任務(wù)。系統(tǒng)存儲過程分類見下頁表。分類描述ActiveDirectory過程用于在MicrosoftWindows?2000ActiveDirectory?中注冊SQLServer實(shí)例和SQLServer數(shù)據(jù)庫。目錄過程執(zhí)行ODBC數(shù)據(jù)字典功能,并隔離ODBC應(yīng)用程序,使之不受基礎(chǔ)系統(tǒng)表更改的影響。游標(biāo)過程執(zhí)行游標(biāo)變量功能。數(shù)據(jù)庫維護(hù)計(jì)劃過程用于設(shè)置確保數(shù)據(jù)庫性能所需的核心維護(hù)任務(wù)。分布式查詢過程用于執(zhí)行和管理分布式查詢。全文檢索過程用于執(zhí)行和查詢?nèi)乃饕?。日志傳送過程用于配置和管理日志傳送。OLE自動化過程允許在標(biāo)準(zhǔn)Transact-SQL批處理中使用標(biāo)準(zhǔn)OLE自動化對象。復(fù)制過程用于管理復(fù)制。安全過程用于管理安全性。分類描述SQL郵件過程用于從SQLServer內(nèi)執(zhí)行電子郵件操作。SQL事件探查器過程由SQL事件探查器用于監(jiān)視性能和活動。SQLServer代理程序過程由SQLServer代理程序用于管理調(diào)度的活動和事件驅(qū)動活動。系統(tǒng)過程用于SQLServer的常規(guī)維護(hù)。Web助手過程由Web助手使用。XML過程用于可擴(kuò)展標(biāo)記語言(XML)文本管理。常規(guī)擴(kuò)展過程提供從SQLServer到外部程序的接口,以便進(jìn)行各種維護(hù)活動。SQL郵件過程用于從SQLServer內(nèi)執(zhí)行電子郵件操作。SQL事件探查器過程由SQL事件探查器用于監(jiān)視性能和活動。SQLServer代理程序過程由SQLServer代理程序用于管理調(diào)度的活動和事件驅(qū)動活動。續(xù):分類描述系統(tǒng)過程用于SQLServer的常規(guī)維護(hù)。Web助手過程由Web助手使用。XML過程用于可擴(kuò)展標(biāo)記語言(XML)文本管理。常規(guī)擴(kuò)展過程提供從SQLServer到外部程序的接口,以便進(jìn)行各種維護(hù)活動。續(xù):SQLSERVER中的觸發(fā)器觸發(fā)器在發(fā)生對數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行維護(hù)操作事件時被執(zhí)行。當(dāng)對某一表進(jìn)行諸如UPDATE、INSERT、DELETE這些操作時,SQLServer就會自動執(zhí)行觸發(fā)器所定義的SQL語句,使保證對數(shù)據(jù)的處理必須符合數(shù)據(jù)庫所定義的規(guī)則。觸發(fā)器的功能強(qiáng)化約束(Enforcerestriction)跟蹤變化(Auditingchanges)級聯(lián)運(yùn)行(Cascadedoperation)調(diào)用存儲過程(Storedprocedureinvocation)觸發(fā)器的種類AFTER觸發(fā)器:只有在執(zhí)行對表的某一操作(INSERT/UPDATE/DELETE)之后,觸發(fā)器才被觸發(fā);可以使用系統(tǒng)過程sp_settriggerorder定義哪一個觸發(fā)器先觸發(fā),哪一個后觸發(fā)。INSTEADOF觸發(fā)器:當(dāng)為表或視圖定義了針對某一操作(INSERT、DELETE、UPDATE)的INSTEADOF類型觸發(fā)器且執(zhí)行了時,盡管觸發(fā)器被觸發(fā),但相應(yīng)的操作并不被執(zhí)行,運(yùn)行的僅是觸發(fā)器SQL語句本身。創(chuàng)建觸發(fā)器利用SQLServer管理工具EnterpriseManager;利用Transaction_SQL創(chuàng)建觸發(fā)器。利用企業(yè)管理器EnterpriseManger創(chuàng)建觸發(fā)器的操作步驟如下:(1)選擇服務(wù)器并展開(2)選擇并展開數(shù)據(jù)庫,選擇表。(3)右擊選定的表,在彈出菜單中選擇“所有任務(wù)”,點(diǎn)擊“管理觸發(fā)器”。進(jìn)入觸發(fā)器屬性對話框,在文本框中預(yù)寫入了觸發(fā)器的格式:
CREATETRIGGER[TRIGGERNAME]ON[dbo].[publishers]FORINSERT,UPDATE,DELETEAS(4)在名字框中選擇<新建>,在文本框中修改觸發(fā)器文本,(5)單擊檢查語法檢查語句是否正確。(6)單擊應(yīng)用,在名稱下拉列表中會有新創(chuàng)建的觸發(fā)器名字。(7)單擊確定完成創(chuàng)建。用CREATETRIGGER命令創(chuàng)建觸發(fā)器命令格式:CREATETRIGGER<觸發(fā)器名>ON{<表名>|<視圖名>}[WITHENCRYPTION]{{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE]}[WITHAPPEND][NOTFORREPLICATION]AS[{IFUPDATE(<列名>)[{AND|OR}UPDATE({<列名>})]|IF(COLUMNS_UPDATED(){<位邏輯運(yùn)算符>}<整形位掩碼>){<比較操作符>}{<被更新的列的位掩碼>}}]{<SQL語句>}}}【例】當(dāng)有人試圖在publishers表中添加或更改數(shù)據(jù)時,要求向客戶端顯示一條消息,求設(shè)計(jì)帶有提醒消息的觸發(fā)器。USEwaremanageGOCREATETRIGGERreminderONpublishersFORINSERT,UPDATEASRAISERROR(50009,16,10)GO【例】如果數(shù)據(jù)庫pubs中有employee和jobs二個表,求創(chuàng)建一個觸發(fā)器,當(dāng)插入或更新雇員工作級別(job_lvls)時,該觸發(fā)器檢查指定雇員的工作級別(由此決定薪水)是否處于該工作定義的范圍內(nèi)。若要獲得適當(dāng)?shù)姆秶仨氁胘obs表。USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname='employee_insupd'ANDtype='TR')DROPTRIGGERemployee_insupdGOCREATETRIGGERemployee_insupdONemployeeFORINSERT,UPDATEASDECLARE@min_lvltinyint,@max_lvltinyint,@emp_lvltinyint,@job_idsmallintSELECT@min_lvl=min_lvl,@max_lvl=max_lvl,@emp_lvl=i.job_lvl,@job_id=i.job_idFROMemployeeeINNERJOINinsertediONe.emp_id=i.emp_idJOINjobsjONj.job_id=i.job_idIF(@job_id=1)and(@emp_lvl<>10)BEGINRAISERROR('Jobid1expectsthedefaultlevelof10.',16,1)ROLLBACKTRANSACTIONENDELSEIFNOT(@emp_lvlBETWEEN@min_lvlAND@max_lvl)BEGINRAISERROR('Thelevelforjob_id:%dshouldbebetween%dand%d.',16,1,@job_id,@min_lvl,@max_lvl)ROLLBACKTRANSACTIONEND刪除觸發(fā)器命令格式:DROPTRIGGER<觸發(fā)器名>【例】刪除觸發(fā)器employee_insupd。USEpubsIFEXISTS(SELECTnameFROMsysobjectsWHEREname='employee_insupd'ANDtype='TR')DROPTRIGGERemployee_insupdGO觸發(fā)器的原理每個觸發(fā)器有兩個特殊的表:插入表inserted和刪除表deteted。插入表的功能:對一個定義了插入類型觸發(fā)器的表來講,一旦對該表執(zhí)行了插入操作,那么對向該表插入的所有行來說,都有一個相應(yīng)的副本存放到插入表中。即插入表就是用來存儲向原表插入的內(nèi)容。刪除表的功能:對一個定義了刪除類型觸發(fā)器的表來講,一旦對該表執(zhí)行了刪除操作,則將所有的刪除行存放至刪除表中。這樣做的目的是,一旦觸發(fā)器遇到了強(qiáng)迫它中止的語句被執(zhí)行時,刪除的那些行可以從刪除表中得以恢復(fù)。INSTEADOF觸發(fā)器其主要優(yōu)點(diǎn)是使不可被修改的視圖能夠支持修改。INSTEADOF觸發(fā)器被用于更新那些沒有辦法通過正常方式更新的視圖。不能在帶有WITHCHECKOPTION定義的視圖中創(chuàng)建INSTEADOF觸發(fā)器?!纠壳髣?chuàng)建一個德國客戶表和一個墨西哥客戶表。設(shè)計(jì)各自視圖與放置在視圖上的INSTEADOF觸發(fā)器,把更新操作重新定向到相應(yīng)的基表上。(1)創(chuàng)建兩個包含客戶數(shù)據(jù)的表:select*INTOCustomersGerFROMCustomersWhereCustomers.Country='Germany'select*INTOCustomersMexFROMCustomersWhereCustomers.Country='Mexico'GO(2)在該數(shù)據(jù)上創(chuàng)建視圖:CreateVIEWCustomersViewASSelect*FROMCustomersGerUNIONSelect*FROMCustomersMexGO(3)創(chuàng)建一個在上述視圖上的INSTEADOF觸發(fā)器:CreateTRIGGERCustomers_Update2ONCustomersViewINSTEADOFUpdateASDECLARE@Countrynvarchar(15)SET@Country=(SelectCountryFROMInserted)IF@Country='Germany'BEGINUpdateCustomersGerSETCustomersGer.Phone=Inserted.PhoneFROMCustomersGerJOINInsertedONCustomersGer.CustomerID=Inserted.CustomerIDENDELSEIF@Country='Mexico'BEGINUpdateCustomersMexSETCustomersMex.Phone=Inserted.PhoneFROMCustomersMexJOINInsertedONCustomersMex.CustomerID=Inserted.CustomerIDEND(4)通過更新視圖,測試觸發(fā)器:UpdateCustomersViewSETPhone='030-007xxxx'WhereCustomerID='ALFKI'SelectCustomerID,PhoneFROMCustomersViewWhereCustomerID='ALFKI'SelectCustomerID,PhoneFROMCustomersGerWhereCustomerID='ALFKI'觸發(fā)器的應(yīng)用INSERT觸發(fā)器在觸發(fā)器中如果帶有FORINSERT子句,屬于INSERT類觸發(fā)器。INSERT觸發(fā)器在向數(shù)據(jù)庫插入數(shù)據(jù)之后觸發(fā),執(zhí)行觸發(fā)器所定義的操作,可以對新插入數(shù)據(jù)進(jìn)行檢查,拒絕某些數(shù)據(jù)的錄入。在插入記錄的同時,還將生成inserted表,記錄副本將插入該表?!纠考僭O(shè)在數(shù)據(jù)庫waremanage中有表commodity,求建立觸發(fā)器commodityinsert,檢查新插入的每條記錄,刪除其中unitprice>2000的記錄。CREATETRIGGERcommodityinsertONcommodityFORINSERTASDELETEFROMcommodityWHEREunitprice>2000DELETE觸發(fā)器在觸發(fā)器中如果帶有FORDELETE子句,屬于DELETE類觸發(fā)器。它在數(shù)據(jù)庫刪除數(shù)據(jù)之后觸發(fā),執(zhí)行觸發(fā)器所定義的操作,可以對被刪除數(shù)據(jù)的相關(guān)數(shù)據(jù)進(jìn)行檢查并執(zhí)行同步的操作。【例】對定義了刪除型觸發(fā)器的commodity表進(jìn)行刪除操作,首先檢查要刪除幾行,如果將刪除多行則返回錯誤信息。CREATETRIGGERcommoditydelete ONcommodityFORDELETEASIF@@rowcount=0 RETURNIF@@rowcount>1BEGIN ROLLBACKTRANSACTIONRAISERROR(“YouCanOnlyDeleteInformationArOneTime”,16,1)ENDRETURNUPDATE觸發(fā)器在觸發(fā)器中如果帶有FORUPDATE子句,屬于更新類觸發(fā)器。它在修改數(shù)據(jù)之后觸發(fā),可以對被修改的數(shù)據(jù)進(jìn)行檢查?!纠壳蠼⒂|發(fā)器commodityupdate,檢查所修改的數(shù)據(jù),如果改后unitprice比原來低,則恢復(fù)原來數(shù)據(jù)。CREATETRIGGERcommodityupdate ONcommodityFORUPDATEASUPDATEcommoditySETcommodity.unitprice=deleted.unitpriceFROMcommodity,deletedWHEREcommodity.waruname=deleted.warunameANDcommodity.unitprice<deleted.unitprice嵌套觸發(fā)器當(dāng)某一觸發(fā)器執(zhí)行時同時觸發(fā)另外一個觸發(fā)器稱之為觸發(fā)器嵌套。在SQLServer中觸發(fā)器能夠嵌套至32層??墒褂们短子|發(fā)器執(zhí)行如保存前一觸發(fā)器所影響記錄的一個備份等這一類工作?!纠吭赾ommodity上另建一個觸發(fā)器commodityupdate1,保存由commodityupdate觸發(fā)器所刪除的commodity的記錄的備份。將被刪除的數(shù)據(jù)保存到另一個單獨(dú)創(chuàng)建的名為del_save表中。CREATETRIGGERcommodityupdate1 ONcommodityFORUPDATEASINSERTdel_saveSELECT*FROMdeleted遞歸觸發(fā)器能觸發(fā)自身的觸發(fā)器被稱為遞歸觸發(fā)器。觸發(fā)器不會以遞歸方式自行調(diào)用,除非設(shè)置了RECURSIVE_TRIGGERS數(shù)據(jù)庫選項(xiàng)。直接遞歸:觸發(fā)器激發(fā)并執(zhí)行一個操作,而該操作又使同一個觸發(fā)器再次激發(fā)。間接遞歸:觸發(fā)器激發(fā)并執(zhí)行一個操作,而該操作又使另一個表中的某個觸發(fā)器激發(fā)。第二個觸發(fā)器使原始表得到更新,從而再次引發(fā)第一個觸發(fā)器。當(dāng)將RECURSIVE_TRIGGERS數(shù)據(jù)庫選項(xiàng)設(shè)置為OFF時,僅防止直接遞歸。若要也禁用間接遞歸,需將nestedtriggers服務(wù)器選項(xiàng)設(shè)置為0。管理觸發(fā)器通過EnterpriseManager。通過系統(tǒng)存儲過程sp_helpsp_helptext和sp_depends。使用系統(tǒng)存儲過程查看觸發(fā)器(1)sp_help使用sp_help系統(tǒng)過程的命令格式是:
sp_help‘<觸發(fā)器名字>’通過該系統(tǒng)過程,可以了解觸發(fā)器的一般信息,如觸發(fā)器的名字、屬性、類型、創(chuàng)建時間。(2)sp_helptext
通過sp_helptext能夠查看觸發(fā)器的正文信息,其語法格式為:sp_helptext‘<觸發(fā)器名>’(3)sp_depends
通過sp_depends能夠查看指定觸發(fā)器所引用的表或指定的表涉及到的所有觸發(fā)器,其語法形式如下:sp_depends‘<觸發(fā)器名字>’sp_depends‘<表名>’修改觸發(fā)器(1)使用sp_rename命令修改觸發(fā)器的名字。其語法格式為:
sp_rename<原名>,<新名>(2)通過EnterpriseManager修改觸發(fā)器正文。通過EnterpriseManager修改觸發(fā)器正文的操作步驟與查看觸發(fā)器信息一樣。修改完觸發(fā)器后要使用CheckSyntax選項(xiàng)對語句進(jìn)行檢查。刪除觸發(fā)器語句格式:
DROPTRIGGER<觸發(fā)器名字>說明:刪除觸發(fā)器所在的表時,MSSQLServer將自動刪除與該表相關(guān)的觸發(fā)器。
SQLServer中的數(shù)據(jù)導(dǎo)入和導(dǎo)出當(dāng)建立一個數(shù)據(jù)庫,且想將分散在各處的不同類型的數(shù)據(jù)庫分類匯總在這個新建的數(shù)據(jù)庫中、或者想進(jìn)行數(shù)據(jù)檢驗(yàn)、凈化和轉(zhuǎn)換時,需要有從其他數(shù)據(jù)庫采集數(shù)據(jù)轉(zhuǎn)錄入到新數(shù)據(jù)庫中的功能,稱為導(dǎo)入。將現(xiàn)有數(shù)據(jù)庫中的數(shù)據(jù)以其他數(shù)據(jù)庫或應(yīng)用程序能接受的形式輸出出來,稱為導(dǎo)出。使用Transact-SQL對數(shù)據(jù)進(jìn)行導(dǎo)入、導(dǎo)出處理。使用數(shù)據(jù)轉(zhuǎn)換服務(wù)(DTS)對數(shù)據(jù)進(jìn)行導(dǎo)入、導(dǎo)出處理。使用Transact-SQL進(jìn)行數(shù)據(jù)導(dǎo)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 氣瓶充裝作業(yè)安全教育培訓(xùn)
- 銀行業(yè)績工作總結(jié)模板
- 小學(xué)班主任管理過程中與學(xué)生和諧關(guān)系的構(gòu)建
- 離職申請書奶酪
- 醫(yī)學(xué)院大學(xué)生創(chuàng)業(yè)項(xiàng)目名稱
- 三位數(shù)加減三位數(shù)計(jì)算同步作業(yè)模擬題帶答案
- 光伏運(yùn)維安全管理制度
- 大雪營銷新視角
- 2025年宿舍申請書模板
- 2025北師數(shù)學(xué)六下第四單元教學(xué)分析
- 烏海周邊焦化企業(yè)概況
- 七年級數(shù)學(xué)上冊期末試卷(可打印)
- Flash動畫設(shè)計(jì)與制作(FlashCS6中文版)中職PPT完整全套教學(xué)課件
- Hadoop大數(shù)據(jù)開發(fā)實(shí)例教程高職PPT完整全套教學(xué)課件
- 新人教版小學(xué)數(shù)學(xué)五年級下冊教材分析課件
- 企業(yè)中層管理人員測評問題
- 人教版高中地理必修一全冊測試題(16份含答案)
- GN汽車吊吊裝專項(xiàng)安全方案講義
- 水泥攪拌樁水灰比及漿液用量計(jì)算表(自動計(jì)算)
- 教育:創(chuàng)造無限可能
- 部編版《語文》三年級下冊全冊教案及反思
評論
0/150
提交評論