第6章-創(chuàng)建與管理其他數(shù)據(jù)庫對(duì)象課件_第1頁
第6章-創(chuàng)建與管理其他數(shù)據(jù)庫對(duì)象課件_第2頁
第6章-創(chuàng)建與管理其他數(shù)據(jù)庫對(duì)象課件_第3頁
第6章-創(chuàng)建與管理其他數(shù)據(jù)庫對(duì)象課件_第4頁
第6章-創(chuàng)建與管理其他數(shù)據(jù)庫對(duì)象課件_第5頁
已閱讀5頁,還剩158頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第6章

創(chuàng)建與管理其他

數(shù)據(jù)庫對(duì)象本章主要內(nèi)容視圖索引存儲(chǔ)過程觸發(fā)器游標(biāo)控制本章要求了解:游標(biāo)控制重點(diǎn)內(nèi)容:視圖的概念、創(chuàng)建、管理及使用,索引的概念、分類及創(chuàng)建管理,存儲(chǔ)過程的特點(diǎn)、創(chuàng)建及管理,觸發(fā)器的概念、創(chuàng)建及管理教學(xué)難點(diǎn):存儲(chǔ)過程的創(chuàng)建及管理,觸發(fā)器的創(chuàng)建及管理視圖視圖(View)是一種常用的數(shù)據(jù)庫對(duì)象,是關(guān)系數(shù)據(jù)庫系統(tǒng)提供給用戶以多種角度來觀察數(shù)據(jù)的一種重要機(jī)制。使用視圖使得用戶能夠以更多樣而且更有彈性的方式來訪問數(shù)據(jù),不僅可以確保數(shù)據(jù)庫的安全性,而且可以提高其使用的便利性。視圖的基本概念作為一種數(shù)據(jù)庫對(duì)象,視圖是從一個(gè)或多個(gè)表中導(dǎo)出的虛擬表(稱為虛表)。用戶通過視圖可以瀏覽他們所關(guān)心的部分或全部數(shù)據(jù),然而這些數(shù)據(jù)的物理位置卻仍存在于視圖所引用的哪些表中。視圖的基本概念視圖是一個(gè)虛擬的表,通常,將視圖所引用的那些表(或視圖)稱為基表(或基視圖)。視圖與表的聯(lián)系和區(qū)別表是用來物理存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),而視圖是存儲(chǔ)在系統(tǒng)目錄中的信息。表是實(shí)際存在的物理數(shù)據(jù),而視圖是虛擬的、動(dòng)態(tài)產(chǎn)生的數(shù)據(jù)。視圖可以看作是一個(gè)或者多個(gè)表查詢的結(jié)果。視圖中保存的是SELECT語句,視圖中的記錄實(shí)際上是對(duì)基表內(nèi)存儲(chǔ)數(shù)據(jù)的引用,通過創(chuàng)建視圖時(shí)所定義視圖的查詢語句實(shí)現(xiàn)。視圖的基本概念視圖的作用是可以間接地訪問其它的表或視圖中的數(shù)據(jù)。視圖提供了另一種觀察數(shù)據(jù)庫中一個(gè)或多個(gè)表中數(shù)據(jù)的方法。視圖的基本概念使用視圖的優(yōu)點(diǎn)集中數(shù)據(jù)顯示簡化數(shù)據(jù)操作提供簡便易行的安全保密措施易于合并或分割數(shù)據(jù)視圖的創(chuàng)建要?jiǎng)?chuàng)建視圖,用戶必須具有在視圖所引用的表或視圖上的“SELECT”權(quán)限以及“創(chuàng)建視圖”的權(quán)限SQLServer2019提供兩種方法創(chuàng)建視圖:這就是通過使用SQLServerManagementStudio創(chuàng)建視圖的方法和使用T-SQL語言創(chuàng)建視圖的方法。視圖的創(chuàng)建建視圖后,視圖的名稱存儲(chǔ)在sys.objects表中。有關(guān)視圖中所定義的列信息添加到sys.columns表中。有關(guān)視圖相關(guān)性的信息添加到sys.depends表中。視圖的定義信息存儲(chǔ)到sysments表中。

視圖的創(chuàng)建使用SSMS創(chuàng)建視圖視圖的創(chuàng)建使用T-SQL語句創(chuàng)建視圖CREATEVIEW[schema_name.]view_name[(column[,...n])][WITH{ENCRYPTION|SCHEMABINDING|VIEW_METDATA}[,…n]]ASSelect_statement[WITHCHECKOPTION]視圖的創(chuàng)建定義視圖的SELECT語句用于指定視圖中的數(shù)據(jù),與前面介紹的查詢語句基本相同,但受到以下三點(diǎn)限制:不能包括ORDERBY或COMPUTE(BY)子句;不能包括關(guān)鍵字INTO;不能引用臨時(shí)表。視圖的創(chuàng)建示例:以教學(xué)管理(TEACHING_MIS)數(shù)據(jù)庫的STUDENTS、COURSE、RESULT表為基表,創(chuàng)建一個(gè)包含有學(xué)生選修某門課程所得成績及其學(xué)分信息的視圖。視圖的創(chuàng)建CREATEVIEWSCR_VIEWASSELECTdbo.STUDENTS.SIDAS學(xué)號(hào),dbo.STUDENTS.SNAMEAS姓名,dbo.COURSE.CNAMEAS課程名稱,dbo.RESULT.RESULTAS考試成績,dbo.COURSE.CREDITAS所修學(xué)分FROMdbo.COURSEINNERJOINdbo.RESULTONdbo.COURSE.CID=dbo.RESULT.CIDINNERJOINdbo.STUDENTSONdbo.RESULT.SID=dbo.STUDENTS.SIDGO視圖的創(chuàng)建示例:在剛才創(chuàng)建的SCR_VIEW視圖上,創(chuàng)建一個(gè)只能瀏覽某一門課程成績的視圖。CREATEVIEWSCR_VIEW01ASSELECT*FROMSCR_VIEWWHERE課程名稱=‘?dāng)?shù)據(jù)庫'GOSELECT*FROMSCR_VIEW01視圖的管理修改視圖更改視圖名稱刪除視圖視圖的管理——修改視圖使用SSMS工具修改視圖使用DDL語句修改視圖使用對(duì)象資源管理器的編輯數(shù)據(jù)對(duì)象功能修改視圖視圖的管理——修改視圖使用DDL語句修改視圖ALTERVIEW[schema_name.]view_name[(column[,...n])][WITH{ENCRYPTION|SCHEMABINDING|VIEW_METDATA}[,…n]]ASSelect_statement[WITHCHECKOPTION]視圖的管理——修改視圖示例:修改在TEACHING_MIS數(shù)據(jù)庫中所創(chuàng)建的學(xué)生成績視圖SCR_VIEW。視圖的管理——修改視圖ALTERVIEWSCR_VIEWASSELECTSTUDENTS.SIDAS學(xué)號(hào),STUDENTS.SNAMEAS姓名,COURSE.CNAMEAS課程名稱,RESULTS.RESULTAS所修成績,COURSE.CCREDITAS所修學(xué)分FROMSTUDENTSINNERJOINRESULTSONSTUDENTS.SID=RESULTS.SIDINNERJOINCOURSEONRESULTS.CID=COURSE.CIDWHERESTUDENTS.SIDLIKE'207%'視圖的管理——修改視圖使用對(duì)象資源管理器的編輯數(shù)據(jù)對(duì)象功能修改視圖視圖的管理——修改視圖視圖的管理——更改視圖名稱更改視圖名稱在SSMS中更改已創(chuàng)建的視圖名稱使用系統(tǒng)存儲(chǔ)過程sp_rename以更名如EXECSP_RENAME'SCR_VIEW01','SCR_VIEW02','OBJECT'

視圖的管理——?jiǎng)h除視圖刪除視圖使用SSMS刪除視圖使用DROPVIEW表達(dá)式DROPVIEW[schema_name.][view_name][,…n][;]注意:如果被刪除的視圖是其他視圖的基視圖,則在刪除基視圖時(shí)其它派生的視圖自動(dòng)刪除,但刪除某個(gè)基表后視圖不能自動(dòng)刪除,要想刪除,只能使用本語句。視圖的管理——?jiǎng)h除視圖示例--刪除以上更名后的學(xué)生選課成績視圖SCR_VIEW02。DROPVIEWSCR_VIEW02GO使用視圖視圖與表相似,對(duì)表的許多操作在視圖中同樣可以使用。即用戶可使用視圖對(duì)數(shù)據(jù)進(jìn)行查詢、修改、刪除等操作。一旦視圖被定義,用戶就可以像對(duì)基本表進(jìn)行查詢一祥對(duì)視圖進(jìn)行查詢操作。使用視圖查詢數(shù)據(jù)示例:通過學(xué)生選課成績視圖查詢學(xué)生的成績。IFEXISTS(SELECTnameFROMsysobjectsWHEREname='SCR_VIEW'ANDxtype='V')SELECT姓名,課程名稱,考試成績FROMSCR_VIEW通過視圖更新數(shù)據(jù)更新數(shù)據(jù)包括插入(INSERT)、刪除(DELETE)和修改(UPDATE)三類操作。視圖是不實(shí)際存儲(chǔ)數(shù)據(jù)的虛表,因此對(duì)視圖的更新,最終會(huì)轉(zhuǎn)換成為對(duì)基表的更新。通過視圖更新數(shù)據(jù)為防止用戶通過視圖對(duì)數(shù)據(jù)進(jìn)行增刪改時(shí),無意或故意操作不屬于視圖范圍內(nèi)的基表數(shù)據(jù),可在定義視圖時(shí)加上WITHCHECKOPTION子句在視圖上增刪改數(shù)據(jù)時(shí),SQLServer會(huì)進(jìn)一步檢查視圖定義中的條件,若不滿足條件,則拒絕執(zhí)行該操作。通過視圖更新數(shù)據(jù)插入數(shù)據(jù)SQLServer2019不僅可以通過視圖檢索基表中的數(shù)據(jù),還可通過視圖向基表插入數(shù)據(jù),但所插入的數(shù)據(jù)必須要符合基表中各種約束和規(guī)則的要求。通過視圖更新數(shù)據(jù)示例:在TEACHING_MIS數(shù)據(jù)庫的學(xué)生表STUDENTS上已有一個(gè)視圖名為S_VIEW,通過該視圖向?qū)W生表中添加一條記錄,其添加數(shù)據(jù)的SQL代碼與向表中添加記錄的代碼類似,如下所示:INSERTINTOS_VIEWVALUES('207020193','劉清波','男','135562751206')GOCreateviews_viewasSELECTSIDAS學(xué)號(hào),SnameAS姓名,SsexAS性別,SphoneAS電話FROMdbo.students通過視圖更新數(shù)據(jù)修改數(shù)據(jù)示例:通過視圖修改數(shù)據(jù)。UPDATES_VIEWSET姓名='王宏'WHERE學(xué)號(hào)='205002019'GOSELECTSID,SNAMEFROMSTUDENTS通過視圖更新數(shù)據(jù)刪除數(shù)據(jù)示例:將上述操作中添加的學(xué)生記錄予以刪除。DELETEFROMS_VIEWWHERE學(xué)號(hào)='207020193'GO通過視圖更新數(shù)據(jù)在使用視圖檢索數(shù)據(jù)時(shí),其操作與通過表檢索數(shù)據(jù)相似,對(duì)查詢語句無限制,但通過視圖更改數(shù)據(jù)(INSERT、UPDATE、DELETE)時(shí),需要注意:通過視圖更新數(shù)據(jù)如果在視圖定義中包含計(jì)算列,則不能更新該列中的數(shù)據(jù);若在定義視圖的SELECT子句中帶有分組子句或含有統(tǒng)計(jì)函數(shù),則不能修改視圖中的數(shù)據(jù);在SQLServer2019中,若要通過視圖更改基表中的數(shù)據(jù),只能通過行列子集視圖才能進(jìn)行更改操作。行列子集視圖是指該視圖是在一個(gè)基表的行列子集上定義的。通過視圖更新數(shù)據(jù)CREATEVIEW[dbo].[S_View]ASSELECTSIDAS學(xué)號(hào),SNAMEAS姓名,SSEXAS性別,SPHONEAS電話FROMdbo.STUDENTSGO通過視圖更新數(shù)據(jù)前面創(chuàng)建的SCR_VIEW視圖是由三個(gè)基表連接定義生成,因此不是行列子集視圖,因此,在該視圖上不能正確執(zhí)行更新數(shù)據(jù)的操作,例如,當(dāng)執(zhí)行以下命令后:SELECT*FROMSCR_VIEWUPDATESCR_VIEWSET姓名='趙宏偉'WHERE學(xué)號(hào)='207010104'GO當(dāng)打開基表STUDENTS時(shí),發(fā)現(xiàn)該條記錄姓名數(shù)據(jù)并未進(jìn)行更新。當(dāng)數(shù)據(jù)在視圖中修改時(shí),其實(shí)質(zhì)是數(shù)據(jù)在基表中得到修改。視圖總結(jié)視圖來源于一個(gè)或多個(gè)基表的行或列的子集,它可以是基表的統(tǒng)計(jì)匯總,或者是來源于另一個(gè)視圖或基表與視圖的某種組合。視圖為用戶提供一個(gè)受限制的環(huán)境,用戶只能訪問允許的數(shù)據(jù),一些不必要的、不合適的數(shù)據(jù)則不在視圖中出現(xiàn)。用戶可以像操縱表一樣操縱視圖中的數(shù)據(jù)的顯示。如果權(quán)限允許,則用戶可以修改視圖中的全部或部分?jǐn)?shù)據(jù)。視圖總結(jié)使用視圖,簡化了對(duì)數(shù)據(jù)庫的查詢操作。原數(shù)據(jù)庫的設(shè)計(jì)可能很復(fù)雜,但是使用視圖可以避免用戶跟復(fù)雜的數(shù)據(jù)結(jié)構(gòu)打交道,可以使用易于理解的名字來命名視圖,使用戶眼中的數(shù)據(jù)庫結(jié)構(gòu)簡單、清晰。對(duì)于復(fù)雜的查詢,可以寫在視圖中,這樣用戶只需要使用視圖就可以實(shí)現(xiàn)復(fù)雜的操作,從而避免重復(fù)寫復(fù)雜的查詢語句的操作。視圖總結(jié)由于通過視圖可以讓特定的用戶只能查看指定的行或列的數(shù)據(jù),設(shè)計(jì)數(shù)據(jù)庫應(yīng)用系統(tǒng)時(shí),對(duì)于不同的用戶定義不同的視圖,使機(jī)密數(shù)據(jù)不出現(xiàn)在不應(yīng)看到這些數(shù)椐的用戶視圖上,可以大大簡化了權(quán)限管理的內(nèi)容。對(duì)于用戶而言,通過視圖創(chuàng)建相對(duì)復(fù)雜的查詢,把一個(gè)表或多個(gè)表的數(shù)據(jù)導(dǎo)出到另一個(gè)應(yīng)用程序的外部文件中,便于做進(jìn)一步的分析,這就大大方便用戶數(shù)據(jù)的導(dǎo)出。視圖總結(jié)應(yīng)用視圖,可以大大方便和簡化用戶對(duì)數(shù)據(jù)的請(qǐng)求,簡化對(duì)用戶及安全方面的管理,并能以簡單的操作來實(shí)現(xiàn)復(fù)雜的功能。索引索引(INDEX)是SQLServer訪問數(shù)據(jù)使用的一種輔助數(shù)據(jù)結(jié)構(gòu),其在關(guān)系數(shù)據(jù)庫中扮演極其重要的角色。索引主要的作用提高數(shù)據(jù)的訪問速度確保數(shù)據(jù)的唯一性1.索引的基本概念通過建立索引,將數(shù)據(jù)庫中原先雜亂堆積的數(shù)據(jù)整理為按照某種順序排列的有序的數(shù)據(jù)數(shù)據(jù)庫引入了這種內(nèi)部機(jī)制,其目的是為了提高對(duì)數(shù)據(jù)的檢索速度和性能索引的定義索引是一個(gè)單獨(dú)的、物理的數(shù)據(jù)庫結(jié)構(gòu),它是某個(gè)表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識(shí)這些值的數(shù)據(jù)頁的邏輯指針清單。一個(gè)表的存儲(chǔ)由數(shù)據(jù)頁面和索引頁面兩部分組成。通過索引這種SQLServer的內(nèi)部機(jī)制,可以有效地進(jìn)行數(shù)據(jù)選擇和排序。索引的結(jié)構(gòu)索引是提高存取效率的基本方法,數(shù)據(jù)庫中的索引是以B樹結(jié)構(gòu)來組織和維護(hù)。這是一個(gè)多層次、自維護(hù)的結(jié)構(gòu)。B+樹索引B+樹的所有結(jié)點(diǎn)結(jié)構(gòu)都相同,它最多包含n-1個(gè)搜索碼值K1、K2、…、Kn-1,以及n個(gè)指針P1、P2、…、Pn,每個(gè)結(jié)點(diǎn)中的搜索碼值按次序存放,即如果i<j,那么Ki<Kj指針Pi(i=1,2,…,n-1)指向具有搜索碼值Ki的一個(gè)文件記錄或一個(gè)指針(存儲(chǔ))桶,桶中的每個(gè)指針指向具有搜索碼值Ki的一個(gè)文件記錄(葉結(jié)點(diǎn))指針Pi(i=2,…,n-1)指向一棵子樹,該子樹的所有結(jié)點(diǎn)的搜索碼值大于等于Ki-1而小于Ki。指針Pn指向子樹中所含搜索碼值大于等于Kn-1的那一部分,而指針P1指向子樹中所含搜索碼值小于K1的那一部分(非葉結(jié)點(diǎn))索引的優(yōu)點(diǎn)利用索引可以大大提高查詢速度可以保證數(shù)據(jù)的惟一性在使用ORDERBY和GROUPBY子句進(jìn)行檢索數(shù)據(jù)時(shí),可以顯著減少查詢中分組和排序的時(shí)間使用索引可以在檢索數(shù)據(jù)的過程中進(jìn)行優(yōu)化,提高系統(tǒng)性能可以加速表與表之間的連接2.索引及其分類從數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)上劃分,SQLServer使用的兩種索引是簇索引(聚集索引)與非簇索引(非聚集索引)其主要區(qū)別在于表中存儲(chǔ)數(shù)據(jù)的方式不同:非簇索引是隨機(jī)存儲(chǔ),而簇索引是排序存儲(chǔ)的若以數(shù)據(jù)的惟一性來劃分,則SQLServer使用的索引可分為惟一索引和非惟一索引若以索引所指定的鍵列個(gè)數(shù)來劃分,又可分為單列索引和多列索引(組合索引)簇索引簇索引對(duì)表的物理數(shù)據(jù)頁中的數(shù)據(jù)按索引鍵值列進(jìn)行排序,然后再重新存儲(chǔ)到磁盤上簇索引的葉節(jié)點(diǎn)中存儲(chǔ)的是實(shí)際的數(shù)據(jù)行表中數(shù)據(jù)記錄實(shí)際存儲(chǔ)的順序與簇索引中相對(duì)應(yīng)的鍵值的存儲(chǔ)順序完全相同簇索引的優(yōu)點(diǎn)簇索引查找數(shù)據(jù)會(huì)很快,檢索數(shù)據(jù)只需要較少的I/O操作被檢索的數(shù)據(jù)將以索引分類順序排列簇索引的一個(gè)優(yōu)點(diǎn)是它適用于檢索連續(xù)鍵值注意:一個(gè)表只有一個(gè)簇索引默認(rèn)情況下,SQLServer為PRIMARYKEY約束所建立的索引是簇索引可以使用NONCLUSTERED關(guān)鍵字來改變?cè)谙铝袔追N情況下,應(yīng)該考慮使用簇索引:包含大量非重復(fù)列的值。使用BETWEEN、>、>=、<和<=運(yùn)算符返回一個(gè)范圍的查詢。被連續(xù)訪問的列。對(duì)于經(jīng)常被使用連接或GROUPBY子句查詢?cè)L問的列。返回大型結(jié)果集的查詢。非簇索引非簇索引具有與表的數(shù)據(jù)完全分離的結(jié)構(gòu),使用非簇索引不用將物理數(shù)據(jù)頁中的數(shù)據(jù)按列排序非簇索引的葉節(jié)點(diǎn)中存儲(chǔ)了組成非簇索引的關(guān)鍵字的值和行定位器非簇索引將行定位器按關(guān)鍵字的值用一定的方式排序,這個(gè)順序與表的行在數(shù)據(jù)頁中的排序是不匹配的由于非簇索引使用索引頁存儲(chǔ),因此它比簇索引需要更多的存儲(chǔ)空間,且檢索效率較低一個(gè)表只能建一個(gè)簇索引,當(dāng)用戶需要建立多個(gè)索引時(shí)就需要使用非簇索引了。一個(gè)表最多可以建249個(gè)非簇索引非簇索引與簇索引一樣有B樹結(jié)構(gòu),有兩個(gè)重大差別:數(shù)據(jù)行不按非簇索引鍵的順序排序和存儲(chǔ)。非簇索引的葉層不包含數(shù)據(jù)頁。索引及其分類SQLServer在檢索數(shù)據(jù)時(shí),先對(duì)非簇索引進(jìn)行搜索,找到數(shù)據(jù)值在表中的位置,然后從該位置直接檢索數(shù)據(jù)非簇索引適用于以下場合:包含大量非重復(fù)值的列,如姓名組合不返回大型結(jié)果集的查詢返回精確匹配的查詢的搜索條件(WHERE子句)中經(jīng)常使用的列經(jīng)常需要連接和分組的應(yīng)用程序,可在連接和分組操作中使用的列上創(chuàng)建多個(gè)非簇索引,而在外鍵上創(chuàng)建一個(gè)簇索引唯一索引唯一索引的作用是保證索引列中不包含重復(fù)的值,即確保數(shù)據(jù)的唯一性。創(chuàng)建唯一索引的前提條件是現(xiàn)有數(shù)據(jù)記錄的該字段或多個(gè)字段所組合的值不重復(fù)簇索引和非簇索引都可以是唯一的注意:NULL值會(huì)被視為是重復(fù)的。當(dāng)為多個(gè)字段組合創(chuàng)建唯一索引時(shí),允許個(gè)別字段的數(shù)據(jù)是重復(fù)的,但這些字段組合后的值必段是唯一的。3.創(chuàng)建與管理索引使用SSMStudio創(chuàng)建索引使用T-SQL語句創(chuàng)建索引使用SSMStudio創(chuàng)建索引使用T-SQL語句創(chuàng)建索引CREATE[UNIQUE][{CLUSTERED|NONCLUSTERED}]INDEX

index_nameON[database_name.[schema_name].|schema_name.]table_or_view_name(column_list)[WITH ({PAD_INDEX={ON|OFF} |FILLFACTOR=fillfactor |SORT_IN_TEMPDB={ON|OFF} |IGNORE_DUP_KEY={ON|OFF} |DROP_EXISTING={ON|OFF} |STATISTICS_NORECOMPUTE={ON|OFF}[,…n])][ON{filegroup|”DEFAULT”}][;]示例:為pubs數(shù)據(jù)庫中的titles表創(chuàng)建索引:CREATEINDEXtitle_priceONtitles(pricedesc)GO示例數(shù)據(jù)庫titles表的price字段上創(chuàng)建了一個(gè)名為title_price的非簇索引,其排列順序是以price降序排列。在pubs數(shù)據(jù)庫的titles表上創(chuàng)建組合索引。CREATEINDEXtitle_price01ONtitles(title_idDESC,priceASC)GO創(chuàng)建索引所引起的作用可通過以下語句來查看。SELECTtitle_id,priceFROMtitlesWHEREtitle_id>'PC1000'使用建表語句指定索引在創(chuàng)建主鍵約束和唯一約束的同時(shí),系統(tǒng)自動(dòng)在指定的鍵列上創(chuàng)建了索引缺省情況下,在主鍵列上創(chuàng)建的索引為簇索引,在唯一鍵上創(chuàng)建的索引為非簇索引在表的指定列(級(jí))上定義索引的語句為:[CONSTRAINTconstraint_name]{PRIMARYKEY|UNIQUE}[CLUSTERED|NONCLUSTERED][WITHFILLFACTOR=fillfactor][ON{filegroup|DEFAULT}]在表級(jí)約束上定義索引的語法如下:[CONSTRAINTconstraint_name]{PRIMARYKEY|UNIQUE}[CLUSTERED|NONCLUSTERED]{(column[,…n])}[WITHFILLFACTOR=fillfactor][ON{filegroup|DEFAULT}]CREATETABLEjobs

(

job_idsmallintIDENTITY(1,1)

PRIMARYKEYCLUSTERED,

job_descvarchar(50)NOTNULL)

CREATETABLEpublishers

(

pub_idchar(4)NOTNULL

CONSTRAINTUPKCL_pubindPRIMARYKEYCLUSTERED

CHECK(pub_idIN(''''1389'''',''''0736'''',''''0877'''',''''1622'''',''''1756'''')

ORpub_idLIKE''''99[0-9][0-9]''''),

pub_namevarchar(40)NULL)

維護(hù)索引索引維護(hù)包括索引的重新生成重建索引刪除索引.重新生成重新生成是指重新生成索引的統(tǒng)計(jì)信息,該項(xiàng)操作不重新生成索引,因此索引仍可能會(huì)被分段,所以該方法不如重建索引的效率高。適用于沒有時(shí)間或資源來重建索引,但可以獨(dú)立地更新索引統(tǒng)計(jì)的場合.重建索引對(duì)于較小的表,一種重建索引的方法是手動(dòng)刪除索引,然后再建立索引。對(duì)于較大或很大的表,可以使用如下創(chuàng)建索引語句進(jìn)行重建(用于一次在一個(gè)表上只重建一個(gè)索引的場合):CREATEINDEX…DROPEXISTING在一個(gè)表上重建所有索引,則使用以下命令來完成:DBCCDBREINDEX以下示例使用填充因子80

對(duì)AdventureWorks

數(shù)據(jù)庫中的Employee

表重新生成Employee_EmployeeID

聚集索引USEAdventureWorks;GODBCCDBREINDEX('HumanResources.Employee',PK_Employee_EmployeeID,80);GO

以下示例使用填充因子值70

對(duì)AdventureWorks

中的Employee

表重新生成所有索引USEAdventureWorks;GODBCCDBREINDEX('HumanResources.Employee','',70);GO

.刪除索引通過“索引/鍵”設(shè)計(jì)窗口進(jìn)行刪除在對(duì)象資源管理器窗口進(jìn)行刪除使用T-SQL語句刪除索引DROPINDEX{index_nameON[database_name.[schema_name].|[schema_name.]table_or_view_name}[,...n][;]示例:刪除上述titles表上的索引。DROPINDEXtitle_priceONtitles管理索引在SSMS中查看和修改索引使用T-SQL語句查看索引使用系統(tǒng)存儲(chǔ)過程查看索引信息EXECsp_helpindex[objname=]'name'

使用系統(tǒng)存儲(chǔ)過程更改索引名稱sp_rename'tablename.[oldindexname]','newindexname','index'索引的缺點(diǎn)索引的創(chuàng)建與維護(hù)需要耗費(fèi)時(shí)間,而且這種時(shí)間的耗費(fèi)會(huì)隨著數(shù)據(jù)量的增加而增加。索引本身需要占用物理空間,特別是建立聚集索引,所需要的空間會(huì)更大當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改時(shí),索引也要?jiǎng)討B(tài)地維護(hù),這樣就會(huì)降低數(shù)據(jù)維護(hù)的速度。適合創(chuàng)建索引的情況在經(jīng)常需要檢索的列上,可以加快檢索速度;作為主鍵的列上,強(qiáng)制該列的惟一性和組織表中數(shù)據(jù)時(shí)的排列結(jié)構(gòu);在經(jīng)常連接的列上,如外鍵等,建立索引可以加快連接速度;在經(jīng)常需要根據(jù)范圍進(jìn)行檢索的列上創(chuàng)建索引,因?yàn)樗饕雅判?,其指定范圍是連續(xù)的;在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,因此查詢就可以利用索引的排序以加快排序查詢的時(shí)間;在經(jīng)常使用WHERE子句的列上創(chuàng)建索引,以加快條件的判斷速度。不適合創(chuàng)建索引的情況對(duì)于那些查詢中很少使用的字段、數(shù)據(jù)類型為Bit、text、image字段或重復(fù)程度很高的字段則不要為其創(chuàng)建索引管理索引在使用索引時(shí),還需注意:根據(jù)唯一性高低程度來創(chuàng)建索引;盡量保持索引較小。存儲(chǔ)過程存儲(chǔ)過程(StoredProcedure)是一組為了完成特定功能的表達(dá)式集合,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中。用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行。存儲(chǔ)過程可以包含程序流、邏輯以及對(duì)數(shù)據(jù)庫的查詢,可以接受輸入?yún)?shù)、輸出參數(shù)、返回單個(gè)或多個(gè)結(jié)果集以及返回值。存儲(chǔ)過程結(jié)合了SQL的數(shù)據(jù)操作能力和過程化語言的流程控制能力,是SQL的過程化擴(kuò)展。存儲(chǔ)過程存儲(chǔ)過程類似于其它程序設(shè)計(jì)語言中的程序,只不過,它是包含Transact-SQL表達(dá)式或是以.NETFrameworkCLR程序語言編寫而成,并以特定名稱存儲(chǔ)于數(shù)據(jù)庫中,以便于反復(fù)調(diào)用。1.存儲(chǔ)過程的類型與特點(diǎn)存儲(chǔ)過程類型用戶自定義存儲(chǔ)過程系統(tǒng)存儲(chǔ)過程臨時(shí)存儲(chǔ)過程遠(yuǎn)程存儲(chǔ)過程擴(kuò)展存儲(chǔ)過程存儲(chǔ)過程優(yōu)點(diǎn)允許標(biāo)準(zhǔn)組件式編程能夠?qū)崿F(xiàn)較快的執(zhí)行速度能夠有效降低網(wǎng)絡(luò)流量可被作為一種安全機(jī)制來充分利用2.用戶自定義存儲(chǔ)過程的創(chuàng)建創(chuàng)建存儲(chǔ)過程的方法在SQLServerManagementStudio中可視化地創(chuàng)建存儲(chǔ)過程通過編寫T-SQL語句來創(chuàng)建存儲(chǔ)過程創(chuàng)建存儲(chǔ)過程時(shí)需要確定存儲(chǔ)過程的以下三個(gè)組成部分:所有的輸入?yún)?shù)以及傳給調(diào)用者的輸出參數(shù)。被執(zhí)行的針對(duì)數(shù)據(jù)庫的操作語句,包括調(diào)用其它存儲(chǔ)過程的語句。返回給調(diào)用者的狀態(tài)值以指明調(diào)用是成功還是失敗。使用SSMS創(chuàng)建存儲(chǔ)過程使用SSMS創(chuàng)建存儲(chǔ)過程使用T-SQL命令創(chuàng)建存儲(chǔ)過程使用T-SQL語言中的CreateProcedure命令能夠創(chuàng)建存儲(chǔ)過程,在創(chuàng)建存儲(chǔ)過程之前應(yīng)該考慮到以下幾個(gè)方面:在一個(gè)批處理中,CREATEPROCEDURE語句不能與其它SQL語句合并在一起。數(shù)據(jù)庫所有者具有默認(rèn)的創(chuàng)建存儲(chǔ)過程的權(quán)限它可把該權(quán)限傳遞給其它的用戶。存儲(chǔ)過程作為數(shù)據(jù)庫對(duì)象,其命名必須符合命名規(guī)則。只能在當(dāng)前數(shù)據(jù)庫中創(chuàng)建屬于當(dāng)前數(shù)據(jù)庫的存儲(chǔ)過程。用CREATEPROCDDURE命令創(chuàng)建存儲(chǔ)過程的語法格式如下:CREATEPROC[EDURE]procedure_name

[;number][{parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[...n]示例:創(chuàng)建一個(gè)存儲(chǔ)過程,其用于查詢TEACHING_MIS數(shù)據(jù)庫中每位學(xué)生選修每一門課程所得成績的信息。該存儲(chǔ)過程的創(chuàng)建命令如下:USETEACHING_MISIFEXISTS(SELECTNAMEFROMsysobjectswherename='STUDENTS_INFO'andtype='p')dropprocedureSTUDENTS_INFOGOCREATEPROCEDURESTUDENTS_INFOASSELECTS.SID,SNAME,CNAME,RESULTFROMSTUDENTSSinnerjoinRESULTRONS.SID=R.SIDinnerjoinCOURSECONR.CID=C.CIDGO示例:對(duì)上述存儲(chǔ)過程進(jìn)行修改,對(duì)TEACHING_MIS數(shù)據(jù)庫中指定某位學(xué)生檢索其選修的每一門課程所得成績信息。這需要該存儲(chǔ)過程可以接受一個(gè)輸入?yún)?shù),其創(chuàng)建命令如下:USETEACHING_MISIFEXISTS(SELECTNAMEFROMsysobjectswherename='STUDENTS_INFO'andtype='p')dropprocedureSTUDENTS_INFOGOCREATEPROCEDURESTUDENTS_INFOnamevarchar(20)ASSELECTS.SID,SNAME,CNAME,RESULTFROMSTUDENTSSinnerjoinRESULTRONS.SID=R.SIDinnerjoinCOURSECONR.CID=C.CIDWHERESNAME=nameGO示例:創(chuàng)建一個(gè)帶有輸出參數(shù)(使用OUTPUT保留字)的存儲(chǔ)過程。創(chuàng)建命令語句如下:USETEACHING_MISIFEXISTS(SELECTNAMEFROMsysobjectswherename='STUDENTS_INFO'andtype='p')dropprocedureSTUDENTS_INFOGOCREATEPROCEDURESTUDENTS_INFOs_namevarchar(20),c_namevarchar(20),gradevarchar(40)OUTPUTASSELECTgrade=S.SNAME+C.CNAME+'課程成績?cè)u(píng)定為:'+CASEROUND(RESULT/10,0)*10WHEN90THEN'優(yōu)'WHEN80THEN'良'WHEN70THEN'中'WHEN60THEN'及格'ELSE'不及格'ENDFROMSTUDENTSS,RESULTR,COURSECWHERER.CID=C.CIDands.sid=r.sidandSNAME=s_nameANDCNAME=c_nameGO成績?cè)u(píng)定結(jié)果可通過對(duì)該存儲(chǔ)過程的調(diào)用以實(shí)現(xiàn),其調(diào)用存儲(chǔ)過程的命令如下:DECLAREGvarchar(40)EXECSTUDENTS_INFO‘李楠’,‘?dāng)?shù)據(jù)庫',GOUTPUTSELECTG3.管理存儲(chǔ)過程存儲(chǔ)過程的查看、修改、更名存儲(chǔ)過程被創(chuàng)建以后,它的名字存儲(chǔ)在系統(tǒng)表sysobjects中,它的源代碼存放在系統(tǒng)表syscomments中,可以通過SQLServerManagementStudio或系統(tǒng)存儲(chǔ)過程來查看、修改或?qū)τ脩糇远x存儲(chǔ)過程進(jìn)行更名。通過SSMS管理存儲(chǔ)過程使用系統(tǒng)存儲(chǔ)過程sp_helptext查看用戶創(chuàng)建的存儲(chǔ)過程源代碼其語法格式如下:EXECsp_helptextstored_procedure_name示例:查看數(shù)據(jù)庫TEACHING_MIS上存儲(chǔ)過程STUDENTS_INFO。查看命令語句如下:EXECSP_HELPTEXTSTUDENTS_INFO使用ALTERPROCEDURE命令修改存儲(chǔ)過程其語法格式如下:ALTERPROC(EDURE)procedure_name[;number][{parameterdata_type}[VARYING][=default][OUTPUT]][,...n][WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}][FORREPLICATION]ASsql_statement[...n]示例--在示例數(shù)據(jù)庫PUBS中已有一個(gè)顯示指定城市作者的存儲(chǔ)過程,其名稱為oakland_authors,以下對(duì)該存儲(chǔ)過程進(jìn)行修改,使其能夠顯示出所有居住在加州城市的作者而不考慮其它地區(qū)的作者。其修改語句如下:alterprocedureoakland_authorswithencryptionasselectau_fname,au_lname,address,city,zipfrompubs.authorswherestate='ca'orderbyau_lname,au_fnamego執(zhí)行存儲(chǔ)過程使用EXECUTE表達(dá)式執(zhí)行存儲(chǔ)過程[EXEC(UTE)]{[return_status=]{procedure_name[;number]|procedure_name_var}[[parameter=]{value|variable[OUTPUT]|[DEFAULT]}[,…n][WITHRECOMPILE]}[;]示例:使用存儲(chǔ)過程將兩個(gè)字符串連接成一個(gè)字符串。USEPUBSGOIFEXISTS(SELECTNAMEFROMsysobjectswherename='strconnect'andtype='p')dropprocedurestrconnectGOCREATEPROCEDUREstrconnectstr1varchar(20),str2varchar(20),connectvarchar(40)OUTPUTASSELECTconnect=str1+str2GO如果提供三個(gè)字符串來執(zhí)行這一存儲(chǔ)過程,則是看不到字符串相加的結(jié)果的。雖然Select語句用來對(duì)result變量賦值,但result結(jié)果并沒有顯示。繼續(xù)執(zhí)行以下語句:declareresultvarchar(40)executestrconnect'Iam','John',resultselect'Theresult'=resultgo則其運(yùn)行結(jié)果為:Theresult----------------------------------------NULL1rowsaffected若增加OUTPUT保留字到EXECUTE語句中,便可顯示返回參數(shù)result的值。OUTPUT要求參數(shù)值被作為一個(gè)變量傳送,而不是作為一個(gè)常量。下面的例子說明:result變量來存放由存儲(chǔ)過程strconnect通過connect返回給調(diào)用者的結(jié)果值。從而使SQLServer能夠顯示出存儲(chǔ)過程的返回值。示例:使用存儲(chǔ)過程將兩個(gè)字符串連接成一個(gè)字符串,并將結(jié)果返回。DECLAREresultvarchar(40)EXECUTEstrconnect'Iam','John',resultoutputSELECT'Theresult'=resultGO刪除存儲(chǔ)過程使用SQLServerManagementStudio使用T-SQL語句DROPPROCEDUREprocedure_name[,…n]觸發(fā)器觸發(fā)器(Trigger)是一種由事件驅(qū)動(dòng)的特殊的存儲(chǔ)過程,當(dāng)它被定義在表上時(shí),可看作表的一部分,一旦定義,任何用戶當(dāng)試圖對(duì)表的增加、刪除或修改操作,都由服務(wù)器自動(dòng)激活相應(yīng)的觸發(fā)器,即觸發(fā)器被請(qǐng)求(被觸發(fā))。由此在DBMS核心層進(jìn)行集中的完整性控制。觸發(fā)器的作用類似約束,但比約束更加靈活,可以實(shí)施比外鍵約束(FORGIGNKEY)、檢查約束(CHECK)更為復(fù)雜的操作,具有更為精細(xì)和強(qiáng)大的控制能力。觸發(fā)器基本概念從傳統(tǒng)概念上講,當(dāng)觸發(fā)器基于表而建立時(shí),它是一個(gè)高級(jí)形式的規(guī)則,常用于執(zhí)行更為復(fù)雜的數(shù)據(jù)約束。以防止對(duì)數(shù)據(jù)進(jìn)行不正確的、沒有授權(quán)或不一致的修改。當(dāng)對(duì)某一表進(jìn)行諸如UPDATE、

INSERT、DELETE這些操作時(shí),SQLServer就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL語句,從而確保對(duì)數(shù)據(jù)的處理必須符合由這些SQL語句所定義的規(guī)則。觸發(fā)器基本概念觸發(fā)器的主要作用就是:能夠?qū)崿F(xiàn)由主鍵、外鍵以及各種常規(guī)數(shù)據(jù)約束所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。所以,觸發(fā)器是一種確保數(shù)據(jù)和業(yè)務(wù)完整性的較好方法。觸發(fā)器不同于前面介紹的存儲(chǔ)過程,觸發(fā)器主要是通過事件進(jìn)行觸發(fā)而被執(zhí)行,而存儲(chǔ)過程則是通過存儲(chǔ)過程名而被直接調(diào)用。即觸發(fā)器不能直接調(diào)用,也不能有參數(shù)。觸發(fā)器基本概念SQLServer2019提供兩大類觸發(fā)器:DML觸發(fā)器和DDL觸發(fā)器。其中DML觸發(fā)器包括兩種類型:AFTER觸發(fā)器和INSTEADOF觸發(fā)器。DML觸發(fā)器是指當(dāng)數(shù)據(jù)庫服務(wù)器發(fā)生數(shù)據(jù)操作語言(DML)事件時(shí)所要執(zhí)行的操作。其用于在數(shù)據(jù)被修改時(shí),強(qiáng)制執(zhí)行業(yè)務(wù)規(guī)則,以及擴(kuò)展SQLServer2019數(shù)據(jù)庫約束。DDL觸發(fā)器是SQLServer2019新增的功能,用于在數(shù)據(jù)庫中執(zhí)行管理任務(wù)。它是一種特殊的觸發(fā)器,在響應(yīng)數(shù)據(jù)定義語言(DDL)語句時(shí)被觸發(fā)。它主要應(yīng)用于數(shù)據(jù)審計(jì)等工作,不屬于數(shù)據(jù)庫基礎(chǔ)使用范圍。觸發(fā)器基本概念A(yù)FTER觸發(fā)器指觸發(fā)器只有在觸發(fā)SQL語句中指定的所有操作都已成功執(zhí)行后才激發(fā)。所有的引用級(jí)聯(lián)操作和約束檢查也必須成功完成后,才能執(zhí)行此觸發(fā)器。換言之,AFTER觸發(fā)器的行為是在數(shù)據(jù)修改發(fā)生之后執(zhí)行。該類型觸發(fā)器要求只有執(zhí)行某一操作如:INSERT、UPDATE、DELETE之后觸發(fā)器才被觸發(fā),且只能在表上定義??梢詾獒槍?duì)表的同一操作定義多個(gè)觸發(fā)器。觸發(fā)器基本概念I(lǐng)NSTEADOF觸發(fā)器

并不是執(zhí)行激發(fā)其動(dòng)作的SQL語句所定義的操作,如INSERT、UPDATE、DELETE。而是執(zhí)行觸發(fā)器本身的代碼以替代其觸發(fā)操作。換言之,INSTEADOF觸發(fā)器可以越過觸發(fā)操作語句而優(yōu)先執(zhí)行觸發(fā)器。使用者既可在表上定義INSTEADOF觸發(fā)器,也可以在視圖上定義INSTEADOF觸發(fā)器。但對(duì)同一操作只能定義一個(gè)INSTEADOF觸發(fā)器。這與AFTER觸發(fā)器不大相同。創(chuàng)建觸發(fā)器使用SQLServerManagementStudio創(chuàng)建觸發(fā)器使用T-SQL語句創(chuàng)建觸發(fā)器創(chuàng)建觸發(fā)器使用SQLServerManagementStudio創(chuàng)建觸發(fā)器在SQLServerManagementStudio的對(duì)象資源管理器中,展開指定的服務(wù)器、數(shù)據(jù)庫和要在其上創(chuàng)建觸發(fā)器的那個(gè)表,右擊該表所屬的觸發(fā)器文件夾,從彈出的快捷菜單中選擇“新建觸發(fā)器”選項(xiàng),則在右側(cè)查詢分析器窗口會(huì)出現(xiàn)觸發(fā)器定義文本框架。在該框架中合適位置填入觸發(fā)器名稱、創(chuàng)建觸發(fā)器的SQL語句即完成了創(chuàng)建工作。創(chuàng)建觸發(fā)器創(chuàng)建觸發(fā)器使用T-SQL語句創(chuàng)建觸發(fā)器CREATETRIGGER語句必須是批處理語句中的第一條語句創(chuàng)建觸發(fā)器CREATETRIGGER[schema_name.]trigger_nameON{table|view}[WITHENCRYPTION]{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}[WITHAPPEND][NOTFORREPLICATION]AS創(chuàng)建觸發(fā)器[{IFUPDATE(column)[{AND|OR}UPDATE(column)][...n]|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask){comparison_operator}column_bitmask[...n]}]sql_statement[...n]}創(chuàng)建觸發(fā)器在觸發(fā)器中不能使用的SQL命令有:ALTERDATABASECREATEDATABASEDROPDATABASELOADDATABASE/LOADLOGRECONFIGURERESTOREDATABASE/RESTORELOGIFUPDATE(column)可測試在指定的列上進(jìn)行的INSERT或UPDATE操作,不能用于DELETE操作。可以指定多列。因?yàn)樵贠N子句中指定了表名,所以在IFUPDATE子句中的列名前不要包含表名。管理觸發(fā)器修改觸發(fā)器刪除觸發(fā)器在SSMS中修改觸發(fā)器使用T-SQL語句修改觸發(fā)器ALTERTRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{{FOR|AFTER|INSTEADOF{[DELETE][,][INSERT][,][UPDATE]}[NOTFORREPLICATION]ASsql_statement[...n]}}刪除觸發(fā)器刪除觸發(fā)器時(shí),該觸發(fā)器所關(guān)聯(lián)的表和數(shù)據(jù)不會(huì)受任何影響只有觸發(fā)器屬主才有權(quán)刪除觸發(fā)器。刪除觸發(fā)器使用T-SQL命令刪除觸發(fā)器DROPTRIGGERtrigger_name直接刪除觸發(fā)器所在的表刪除觸發(fā)器所在的表時(shí),SQLServer將自動(dòng)刪除與該表相關(guān)的觸發(fā)器。使用SQLServerManagementStudio刪除觸發(fā)器DML觸發(fā)器的使用針對(duì)插入操作事件的觸發(fā)器應(yīng)用針對(duì)更新操作的觸發(fā)器應(yīng)用insteadof型觸發(fā)器的應(yīng)用針對(duì)插入操作事件的觸發(fā)器應(yīng)用創(chuàng)建一個(gè)插入型觸發(fā)器,當(dāng)插入或更新雇員工作級(jí)別(job_lvls)時(shí),該觸發(fā)器檢查指定雇員的工作級(jí)別(由此決定薪水)是否處于為該工作定義的范圍內(nèi),如果雇員的工作級(jí)別不對(duì),則給出錯(cuò)誤提示,觸發(fā)器代碼如下:CREATETRIGGERemployee_insupdONemployeeFORINSERT,UPDATEAS/*判斷jobs表中雇員工作級(jí)別是否與工作相符,如果不符,則給出錯(cuò)誤提示*/DECLAREmin_lvltinyint,max_lvltinyint,emp_lvltinyint,job_idsmallintselectmin_lvl=min_lvl,max_lvl=max_lvl,emp_lvl=i.job_lvl,job_id=i.job_idfromemployeee,jobsj,insertediwheree.emp_id=i.emp_idANDi.job_id=j.job_idIF(job_id=1)and(emp_lvl<>10)beginraiserror('Jobid1expectsthedefaultlevelof10.',16,1)ROLLBACKTRANSACTIONendELSEIFNOT(emp_lvlBETWEENmin_lvlANDmax_lvl)beginraiserror('Thelevelforjob_id:%dshouldbebetween%dand%d.',16,1,job_id,min_lvl,max_lvl)ROLLBACKTRANSACTIONend/*如果有編號(hào)為MFS52347M雇員時(shí)則先刪除該雇員信息*/DELETEFROMemployeeWHERE(emp_id='MFS52347M')GO/*插入測試SQL命令*/INSERTINTOemployee(emp_id,fname,lname,job_id,job_lvl,pub_id)VALUES('MFS52347M','Small','Fish',2,10,1389)GO針對(duì)刪除操作的觸發(fā)器應(yīng)用示例:創(chuàng)建一個(gè)刪除型觸發(fā)器,當(dāng)對(duì)定義了刪除型觸發(fā)器的pub_info表進(jìn)行刪除操作時(shí),觸發(fā)器首先檢查要?jiǎng)h除的行數(shù),如果是刪除多行,則返回錯(cuò)誤信息。USEpubsGOCREATETRIGGERemployee_deleteONemployeeFORDELETEASBEGINIFrowcount>1BEGINROLLBACKTRANSACTIONRAISERROR('你每次只能刪除一條記錄',16,1)ENDEND當(dāng)執(zhí)行如下刪除一行記錄的代碼時(shí),觸發(fā)器執(zhí)行后,不顯示任何信息,測試代碼如下:DELETEFROMemployeeWHERE(emp_id='A-C71970F')GO但如果執(zhí)行如下刪除多條記錄的命令時(shí),觸發(fā)器將顯示“你每次只能刪除一條記錄”的錯(cuò)誤提示DELETEFROMemployeeWHERE(minit='M')GO針對(duì)更新操作的觸發(fā)器應(yīng)用通常意義上的觸發(fā)器先將需更新的內(nèi)容從表中刪除,然后插入新值。因此觸發(fā)器同時(shí)涉及到刪除表和插入表。示例:當(dāng)對(duì)sales進(jìn)行update修改操作時(shí),將刪除的數(shù)據(jù)行備份到sales_delbak表中,將新插入的數(shù)據(jù)備份到sales_insbak表中。USEpubsGOCREATETRIGGERtrig_testONsalesFORUPDATEASBEGININSERTINTOsales_delbakSELECT*FROMdeletedINSERTINTOsales_insbakSELECT*FROMinsertedENDGO列級(jí)更新操作的觸發(fā)器在有些更新中,更新的內(nèi)容并不是整個(gè)記錄而僅僅是一列或幾列,這時(shí)就要用到用于檢查列改變的更新型觸發(fā)器。它與通常意義上的觸發(fā)器不同之處主要表現(xiàn)在它包括以下保留字:IFUPDATE(column)[{AND|OR}UPDATEcolumn][...n]|IFCOLUMNS_UPDATED{bitwise_operator}updated_bitmask{comparison_operator}column_bitmask[...n]insteadof型觸發(fā)器的應(yīng)用示例:在PUB數(shù)據(jù)庫的AUTHORS表上創(chuàng)建insteadof觸發(fā)器。createtriggertrI_au_updonauthorsinsteadofupdateASprint'TRIGGEROUTPUT:'+convert(varchar(5),rowcount)+'rowswereupdated'goinsteadof型觸發(fā)器的應(yīng)用updateauthorssetau_fname='Rachael'wherestate='UT'go以上語句運(yùn)行結(jié)果如下:TRIGGEROUTPUT:2rowswereupdatedDDL觸發(fā)器(自學(xué))DDL觸發(fā)器用于響應(yīng)包括CREATE、ALTER和DROP等語句在內(nèi)的各種數(shù)據(jù)定義語言事件。通過T-SQL語句或使用Microsoft.NETFramework公共運(yùn)行時(shí)(CLR)創(chuàng)建程序集的方法,可在SQLServer2019數(shù)據(jù)庫引擎中直接創(chuàng)建DDL或DML觸發(fā)器,將其上傳給一個(gè)SQLServer實(shí)例。創(chuàng)建DDL觸發(fā)器的語法CREATETRIGGERtrigger_name ON{ALLSERVER|DATABASE} [WITH<ddl_trigger_option>[,…n]] {FOR|AFTER}{event_type}{event_group}[,…n] AS{sql_statement[;][,…n]|EXTERNALNAME<methodSpecifier>[;]} <ddl_trigger_option>::= [ENCRYPTION] [EXECUEASClause]創(chuàng)建DDL觸發(fā)器的語法示例:創(chuàng)建一個(gè)DDL觸發(fā)器,以防止從TEACHING_MIS數(shù)據(jù)庫中刪除任何表。USETEACHING_MISIFEXISTS(SELECT*FROMSYS.TRIGGERSWHEREPARENT_CLASS=0ANDNAME='MYDDLTRI_tb1')DROPTRIGGERMYDDLTRIONDATABASEGO創(chuàng)建DDL觸發(fā)器的語法CREATETRIGGERMYDDLTRI_tb1ONDATABASEFORDROP_TABLEASPRINT'確定要?jiǎng)h除表時(shí)必須先要禁用本觸發(fā)器'ROLLBACKGO游標(biāo)控制SQL語句提供了對(duì)記錄集合的各種操作,但若需要進(jìn)行一些針對(duì)記錄集中的單個(gè)記錄進(jìn)行判斷,然后再執(zhí)行的操作,有時(shí)就不能實(shí)現(xiàn),而使用游標(biāo)可以解決這一問題。游標(biāo)的基本概念游標(biāo)的定義游標(biāo)提供了一種可以直接對(duì)記錄集合中的單個(gè)記錄進(jìn)行訪問的機(jī)制,以實(shí)現(xiàn)每次處理一行或多行數(shù)據(jù),這是對(duì)結(jié)果集處理的一種擴(kuò)展游標(biāo)的基本概念游標(biāo)的組成

游標(biāo)可以看作是由數(shù)據(jù)記錄集和指針兩部分內(nèi)容組成的:記錄集:游標(biāo)內(nèi)SELECT語句的執(zhí)行結(jié)果;游標(biāo)位置:游標(biāo)指針當(dāng)前的位置。游標(biāo)的創(chuàng)建和使用定義游標(biāo)(declarecursor)打開游標(biāo)(opencursor)讀取游標(biāo)(fetchcursor)關(guān)閉游標(biāo)(closecursor)釋放游標(biāo)(deallocatecursor)定義游標(biāo)DECLARE

cursor_nam

溫馨提示

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