SQLServer2005數(shù)據(jù)庫控制與維護(hù)課件_第1頁
SQLServer2005數(shù)據(jù)庫控制與維護(hù)課件_第2頁
SQLServer2005數(shù)據(jù)庫控制與維護(hù)課件_第3頁
SQLServer2005數(shù)據(jù)庫控制與維護(hù)課件_第4頁
SQLServer2005數(shù)據(jù)庫控制與維護(hù)課件_第5頁
已閱讀5頁,還剩125頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8第8章SQLServer2005數(shù)據(jù)庫控制與維護(hù)——數(shù)據(jù)庫應(yīng)用教程第8第8章SQLServer2005數(shù)據(jù)庫控制與維1數(shù)據(jù)庫的完整性控制

數(shù)據(jù)庫的安全性管理

數(shù)據(jù)庫備份與還原

第8章SQLServer2005數(shù)據(jù)庫控制與維護(hù)

數(shù)據(jù)庫的完整性控制數(shù)據(jù)庫的安全性管理數(shù)據(jù)庫備份與還原28.1.1數(shù)據(jù)完整性概述

8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制

8.1數(shù)據(jù)庫的完整性控制8.1.4使用默認(rèn)值實(shí)施數(shù)據(jù)完整性控制

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制

8.1.1數(shù)據(jù)完整性概述8.1.2使用約束實(shí)施數(shù)據(jù)38.1.1數(shù)據(jù)完整性概述1.完整性的概念數(shù)據(jù)完整性是指數(shù)據(jù)的正確性、有效性、一致性和相容性。由于數(shù)據(jù)庫是一個(gè)動(dòng)態(tài)的集合,數(shù)據(jù)不斷地被插入和被修改,因此由于主觀或客觀的原因,可能破壞數(shù)據(jù)庫的數(shù)據(jù)完整性。2.破壞數(shù)據(jù)庫的數(shù)據(jù)完整性的情況

(1)無效的數(shù)據(jù)被添加到數(shù)據(jù)庫中。如:某在教師管理系統(tǒng)中,輸入的教師號不存在。(2)對數(shù)據(jù)庫的修改不一致。如:在兩個(gè)不同的表中,同一教師的系號不同。(3)將存在的數(shù)據(jù)修改為無效的數(shù)據(jù)。如:將某教師所在的系號修改為并不存在的系。8.1.1數(shù)據(jù)完整性概述1.完整性的概念數(shù)據(jù)完整性是指48.1.1數(shù)據(jù)完整性概述3.完整性機(jī)制為了保證存放數(shù)據(jù)的完整性,DBMS應(yīng)能對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)完整性控制。在SQLServer2000中,提供了約束、默認(rèn)值、規(guī)則、觸發(fā)器等維護(hù)機(jī)制對數(shù)據(jù)完整性進(jìn)行控制。4.完整性分類

在SQLServer中,數(shù)據(jù)完整性分成四類:實(shí)體完整性、域完整性、參照完整性和用戶自定義完整性。8.1.1數(shù)據(jù)完整性概述3.完整性機(jī)制為了保證存放數(shù)據(jù)58.1.1數(shù)據(jù)完整性概述域完整性:也可稱為列完整性。域完整性要求:向表中指定列輸入的數(shù)據(jù)必須具有正確的數(shù)據(jù)類型、格式以及有效的數(shù)據(jù)范圍。例如,在CollegeMIS數(shù)據(jù)庫的SelectCourse表中,向Score(成績)列輸入數(shù)據(jù)時(shí),不能出現(xiàn)字符,也不能輸入小于0或大于100的數(shù)值。域完整性的控制方法:主要有CHECK約束、外鍵約束、默認(rèn)約束、默認(rèn)值、非空定義、規(guī)則以及在創(chuàng)建表時(shí)設(shè)置的數(shù)據(jù)類型。實(shí)體完整性的控制方法:主要有主鍵約束、惟一索引、惟一約束和指定IDENTITY屬性。5.完整性控制方法

參照完整性的控制方法:主要有外鍵約束,有時(shí)利用觸發(fā)器也可實(shí)現(xiàn)參照完整性控制。8.1.1數(shù)據(jù)完整性概述域完整性:也可稱為列完整性。實(shí)體68.1.2使用約束實(shí)施數(shù)據(jù)完整性控制在SQLServer中,可通過約束來實(shí)施數(shù)據(jù)庫的數(shù)據(jù)完整性控制,常用的約束有NOTNULL(非空)約束、CHECK(檢查)約束、UNIQUE(惟一)約束、PRIMARYKEY(主鍵)約束、FOREIGNKEY(外鍵)約束和DEFAULT(默認(rèn))約束。1.約束的建立

【格式】ALTERTABLEtable_nameADDCONSTRAINTconstraint_namePRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column[,...n])}(1)主鍵約束的創(chuàng)建

【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的主鍵約束。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制在SQLServe7【例8-1】把CollegeMIS數(shù)據(jù)庫中SelectCourse表中的主鍵pk_xuanke刪除,然后重建。

USECollegeMISGOALTERTABLESelectCourse

DROPCONSTRAINTpk_xuankeGOALTERTABLESelectCourse

ADDCONSTRAINTpk_xuankePRIMARYKEY(StuNo,TeaNo,CourseNo)GO【例8-1】把CollegeMIS數(shù)據(jù)庫中SelectCou88.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-2】為CollegeMIS數(shù)據(jù)庫中的Department表的DepartName字段創(chuàng)建一個(gè)惟一約束,約束名為IX_DepartName。

(2)惟一約束的創(chuàng)建—使用企業(yè)管理器創(chuàng)建惟一約束在一張數(shù)據(jù)表中,有時(shí)除主鍵需要具有唯一性外,還有其他列也需要具有唯一性。例如,在“系部”表中,主鍵為“系部代碼”,但是另外一個(gè)字段“系部名稱”雖不是主鍵,也需保證它的唯一性,這時(shí)就需要?jiǎng)?chuàng)建表中的唯一約束。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【9使用對象資源管理器創(chuàng)建唯一約束下面以“系部”表為例,為“系部名稱”字段創(chuàng)建唯一約束。操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要設(shè)置唯一約束的表(本例為“系部”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)在“表設(shè)計(jì)器”窗口中,右擊需要設(shè)置為唯一約束的字段(本例為“系部名稱”字段),在彈出的快捷菜單中選擇“索引/鍵”命令,如圖6-7所示,也可以直接單擊工具欄中的“管理索引和鍵”按鈕,打開“索引/鍵”對話框,如圖6-8所示。圖6-7選擇“索引/鍵”命令圖6-8“索引/鍵”對話框使用對象資源管理器創(chuàng)建唯一約束(2)在“表設(shè)計(jì)器”窗口中,右10(3)在打開的“索引/鍵”對話框中,單擊“添加”按鈕,結(jié)果如圖6-9所示。圖6-9單擊“添加”按鈕創(chuàng)建唯一約束(4)設(shè)置好相關(guān)選項(xiàng)后,單擊“關(guān)閉”按鈕,完成唯一約束的創(chuàng)建。這時(shí),不只是該表的主鍵必須為唯一,并且被設(shè)置為唯一約束的字段同樣也必須為唯一。(3)在打開的“索引/鍵”對話框中,單擊“添加”按鈕,結(jié)果如118.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameUNIQUE[CLUSTERED|NONCLUSTERED]{(column[,...n])}

(2)惟一約束的創(chuàng)建—使用Transact-SQL語句【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的惟一約束。說明:惟一約束默認(rèn)的索引類型為NONCLUSTERED。

8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【128.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-3】通過Transact-SQL語句為CollegeMIS數(shù)據(jù)庫中的Department表的Telephone字段創(chuàng)建一個(gè)惟一約束,約束名為IX_Telephone。

(2)惟一約束的創(chuàng)建—使用Transact-SQL語句USECollegeMISGOALTERTABLEDepartmentADDCONSTRAINTIX_TelphoneUNIQUE(Telephone)GO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【138.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-4】為CollegeMIS數(shù)據(jù)庫中的“課程表”的“學(xué)分”

字段創(chuàng)建一個(gè)檢查約束,約束名為CK_Grade。檢查條件只允許為1~7分,不允許小于1分的學(xué)分和大于7分的學(xué)分出現(xiàn)。

。

(3)檢查約束的創(chuàng)建——使用對象資源管理器檢查約束對輸入的數(shù)據(jù)的值做檢查,可以限定數(shù)據(jù)輸入,從而維護(hù)數(shù)據(jù)的域完整性。操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要設(shè)置唯一約束的表(本例為“課程表”),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)在“表設(shè)計(jì)器”窗口中右擊需要?jiǎng)?chuàng)建檢查約束的字段(本例為“學(xué)分”字段),在彈出的快捷菜單中選擇“CHECK約束”命令,如圖6-11所示,打開“CHECK約束”對話框。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【14圖6-11選擇“CHECK約束”命令

圖6-11選擇“CHECK約束”命令15(3)在“CHECK約束”對話框中,單擊“添加”按鈕,然后在“(名稱)”文本框中輸入檢查約束名稱,在約束“表達(dá)式”文本框中輸入約束條件,這里輸入“([學(xué)分]>=1AND[學(xué)分]<=7)”,如圖6-12所示。圖6-12設(shè)置“CHECK約束”條件(4)單擊“關(guān)閉”按鈕關(guān)閉對話框,完成檢查約束的創(chuàng)建。注意:如果表中原來就有數(shù)據(jù),并且數(shù)據(jù)類型或范圍與所創(chuàng)建的約束相沖突,那么約束將不能成功創(chuàng)建。(3)在“CHECK約束”對話框中,單擊“添加”按鈕,然后在168.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameCHECK(logical_expression)

(3)檢查約束的創(chuàng)建—使用Transact-SQL語句【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的檢查約束。說明:“l(fā)ogical_expression”是檢查約束的檢查條件,通常是一個(gè)關(guān)系表達(dá)式或邏輯表達(dá)式。

8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【178.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-5】使用Transact-SQL語句,為CollegeMIS數(shù)據(jù)庫中的Student表的Birthday字段創(chuàng)建一個(gè)檢查約束,約束名為CK_Birthday。檢查條件為Birthday字段的值必須小于當(dāng)前日期。

(3)檢查約束的創(chuàng)建—使用Transact-SQL語句USECollegeMISGOALTERTABLEStudentADDCONSTRAINTCK_BirthdayCHECK(Birthday<=GetDate())GO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【188.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-6】為CollegeMIS數(shù)據(jù)庫中的Student表的Sex字段創(chuàng)建一個(gè)默認(rèn)約束,默認(rèn)值為“男”。(4)默認(rèn)約束的創(chuàng)建——使用對象資源管理器操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要?jiǎng)?chuàng)建默認(rèn)約束的表(這里為“學(xué)生”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)選擇需要?jiǎng)?chuàng)建默認(rèn)約束的字段(這里為“性別”字段),然后在下方的“列屬性”選項(xiàng)卡中的“默認(rèn)值或綁定”文本框中輸入默認(rèn)值,本例為選擇“性別”字段,在默認(rèn)值中輸入“男”,如圖6-13所示。在用戶輸入某些數(shù)據(jù)時(shí),希望一些數(shù)據(jù)在沒有特例的情況下被自動(dòng)輸入,例如,學(xué)生的注冊日期應(yīng)該是數(shù)據(jù)錄入的當(dāng)天日期;學(xué)生的修學(xué)年限是固定的值;學(xué)生性別默認(rèn)是“男”等情況,這個(gè)時(shí)候需要對數(shù)據(jù)表創(chuàng)建默認(rèn)約束。下面分別用例子說明如何在對象資源管理器中和利用SQL語句創(chuàng)建默認(rèn)約束8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【19圖6|13輸入默認(rèn)值注意:單引號不需要輸入,在表保存后,在單引號外還會(huì)自動(dòng)生成一對小括號。(3)關(guān)閉“表設(shè)計(jì)器”窗口。

圖注意:單引號不需要輸入,在表保存后,在單引號外還會(huì)自動(dòng)生成208.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameDEFAULTconstant_expressionFORcolumn_name(4)默認(rèn)約束的創(chuàng)建—使用Transact-SQL語句【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的默認(rèn)約束。說明:“column_name”是要設(shè)置默認(rèn)約束的列名,“constant_expression”是設(shè)置的默認(rèn)值。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【218.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-7】為CollegeMIS數(shù)據(jù)庫中的Student表的Grade字段創(chuàng)建一個(gè)默認(rèn)約束,約束名為DF_Grade,默認(rèn)值為1。

(4)默認(rèn)約束的創(chuàng)建—使用Transact-SQL語句USECollegeMISGOALTERTABLEStudentADDCONSTRAINTDF_GradeDEFAULT1FORGradeGO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【228.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-8】為CollegeMIS數(shù)據(jù)庫中的“教師”表的創(chuàng)建一個(gè)外鍵約束,約束名為FK_Teacher_Department。約束對應(yīng)的主鍵表為Department

(引用的主鍵字段為系部代碼),本表(“教師”表)的外鍵字段為系部代碼。(5)外鍵約束的創(chuàng)建

——使用對象資源管理器操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要?jiǎng)?chuàng)建外鍵約束的表(這里為“教師”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)選擇需要?jiǎng)?chuàng)建外鍵約束的字段(這里為“系部代碼”字段),單擊工具欄中的“關(guān)系”按鈕,或右擊該字段,在彈出的快捷菜單中選擇“關(guān)系”命令,打開“外鍵關(guān)系”對話框,如圖6-14所示。外鍵是用來維護(hù)表與表之間對應(yīng)唯一關(guān)系的一種方法。可以利用對象資源管理器或SQL語句來創(chuàng)建外鍵約束。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【23圖6-14“外鍵關(guān)系”對話框(3)在“外鍵關(guān)系”對話框中,單擊“添加”按鈕,然后單擊“表和列規(guī)范”的按鈕,打開“表和列”對話框。在“主鍵表”下拉列表中選擇“系部”表,在“外鍵表”的下拉列表框中選擇“教師”表,分別在“主鍵表”和“外鍵表”的下面選擇“系部代碼”字段,如圖6-15所示。

圖6-14“外鍵關(guān)系”對話框(3)在“外鍵關(guān)系”對話框中24圖6-15“表和列”對話框(4)單擊“確定”按鈕,然后在“外鍵關(guān)系”對話框中進(jìn)行相關(guān)設(shè)置后單擊“關(guān)閉”按鈕即可。圖6-15“表和列”對話框(4)單擊“確定”按鈕,然后在258.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameFOREIGNKEY(column_name[,...n])REFERENCESrel_table[(ref_column[,...n])][ONDELETE{CASCADE|NOACTION}][ONUPDATE{CASCADE|NOACTION}][NOTFORREPLICATION](5)外鍵約束的創(chuàng)建—使用Transact-SQL語句【功能】為由table_name作為表名指定的表創(chuàng)建一個(gè)由constraint_name作為約束名的外鍵約束。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【268.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-9】為CollegeMIS數(shù)據(jù)庫中的SelectCourse表的創(chuàng)建一個(gè)外鍵約束,約束名為FK_SelectCourse_Student。約束對應(yīng)的主鍵表為Student(引用的主鍵字段為StuNo),本表(SelectCourse表)的外鍵字段為StuNo。并設(shè)置級聯(lián)刪除和級聯(lián)更新。(6)默認(rèn)約束的創(chuàng)建—使用Transact-SQL語句USECollegeMISGOALTERTABLESelectCourseADDCONSTRAINTFK_SelectCourse_StudentFOREIGNKEY(StuNo)REFERENCESStudent(StuNo)ONDELETECASCADEONUPDATECASCADEGO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【278.1.2使用約束實(shí)施數(shù)據(jù)完整性控制2.約束定義的查看對于創(chuàng)建好的約束,根據(jù)實(shí)際需要可以查看其定義信息。SQLServer2005提供了多種查看約束信息的方法,經(jīng)常使用的有利用對象資源管理器和系統(tǒng)存儲(chǔ)過程。

(1)利用對象資源管理器查看約束信息

使用對象資源管理器查看約束信息的操作步驟如下:(1)在“對象資源管理器”窗格中,右擊要查看約束的表,在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)右擊該表,在彈出的快捷菜單中分別選擇“關(guān)系”、“索引/鍵”、“CHECK約束”等命令查看約束信息,如圖6-16所示。

圖6-16查看約束信息菜單8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制2.約束定義的查看28(2)利用系統(tǒng)存儲(chǔ)過程查看約束的定義存儲(chǔ)過程sp_helptext是用來查看約束的一個(gè)系統(tǒng)提供的存儲(chǔ)過程,可以通過查詢分析器來查看約束的名稱、創(chuàng)建者、類型和創(chuàng)建時(shí)間。其語法格式為:EXECsp_help約束名稱如果該約束有具體的定義和文本,那么可以用sp_helptext來查看。

其語法格式為:EXECsp_helptext約束名稱【例6.9】使用系統(tǒng)存儲(chǔ)過程查看student數(shù)據(jù)庫中定義的入學(xué)時(shí)間(名稱為ck_rxsj)的約束信息和文本信息。代碼如下,結(jié)果如圖6-17所示。USEstudentGOEXECsp_helpck_rxsjGOUSEstudentGOEXECsp_helptextck_rxsjGO(2)利用系統(tǒng)存儲(chǔ)過程查看約束的定義存儲(chǔ)過程sp_h298.1.2使用約束實(shí)施數(shù)據(jù)完整性控制3.刪除約束

使用對象資源管理器刪除約束非常方便,正如在建立約束時(shí)一樣,只需要在“表設(shè)計(jì)器”窗口中,將如圖6-2所示的“設(shè)置主鍵”前的復(fù)選框取消即可刪除主鍵約束,或刪除默認(rèn)值以刪除默認(rèn)約束;如圖6-8所示,單擊“刪除”按鈕刪除唯一約束;如圖6-12所示,單擊“刪除”按鈕刪除檢查約束;如圖6-14所示,單擊“刪除”按鈕刪除外鍵約束。(1)使用對象資源管理器來刪除表約束(2)使用Transact-SQL語句刪除約束【格式】ALTERTABLEtable_nameDROPCONSTRAINTconstraint_name[,…n]【功能】刪除由“table_name”作為表名指定的表中由“constraint_name”作為約束名的約束??梢酝瑫r(shí)刪除多個(gè)約束,約束名之間用“,”隔開。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制3.刪除約束308.1.2使用約束實(shí)施數(shù)據(jù)完整性控制3.刪除約束【例8-10】刪除CollegeMIS數(shù)據(jù)庫中的SelectCourse表的外鍵約束fk_scStuNo(該約束在第5章中建立)。USECollegeMISGOALTERTABLESelectCourseDROPCONSTRAINTfk_scStuNoGO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制3.刪除約束【例8-318.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制規(guī)則概述:

規(guī)則:是一種數(shù)據(jù)庫對象,與CHECK約束的作用基本相同,也是用來限制輸入值的取值范圍,從而實(shí)施域完整性控制。使用規(guī)則:首先要?jiǎng)?chuàng)建規(guī)則,然后把規(guī)則綁定到列上,或從列上解綁和刪除。它與CHECK約束有以下幾點(diǎn)不同:(1)CHECK約束可以在建表時(shí)由CREATETABLE語句將其作為表的一部分進(jìn)行指定,而規(guī)則需要單獨(dú)創(chuàng)建并綁定到列上;(2)在一個(gè)列上只能應(yīng)用一個(gè)規(guī)則,但是卻可以應(yīng)用多個(gè)CHECK約束。(3)一個(gè)規(guī)則只需定義一次就可以被多次應(yīng)用,可以應(yīng)用于多個(gè)表或多個(gè)列,還可以應(yīng)用到用戶定義的數(shù)據(jù)類型上。

(4)可以在查詢分析器中用SQL語句完成。

8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制規(guī)則概述:規(guī)則:是328.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制1.使用對象資源管理器管理規(guī)則(1)規(guī)則的創(chuàng)建【例8-11】為CollegeMIS數(shù)據(jù)庫創(chuàng)建一個(gè)名為xb_rule規(guī)則,將它綁定到“學(xué)生”表的“性別”字段,保證輸入數(shù)據(jù)只能為“男”或“女”規(guī)則作為一種數(shù)據(jù)庫對象,在使用前必須被創(chuàng)建。創(chuàng)建規(guī)則的SQL命令是CREATERULE。其語法格式如下:

CREATERULErule_nameAScondition_expression其中:

●rule_name是規(guī)則的名稱,命名必須符合SQLServer2005的命名規(guī)則?!馽ondition_expression是條件表達(dá)式。CREATERULExb_ruleAS@xbin('男','女')8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制1.使用對象資源管理338.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制(2)規(guī)則的綁定要使創(chuàng)建好的規(guī)則作用到指定的列或表等,還必須將規(guī)則綁定到列或用戶定義的數(shù)據(jù)類型上才能夠起作用。在查詢分析器中,可以利用系統(tǒng)存儲(chǔ)過程將規(guī)則綁定到字段或用戶定義的數(shù)據(jù)類型上。其語法格式如下:[EXECUTE]sp_bindrule'規(guī)則名稱','表名.字段名'|'自定義數(shù)據(jù)類型名'EXECsp_bindrule'xb_rule','學(xué)生.性別'將規(guī)則“xb_rule”綁定到“學(xué)生”表的“性別”列上8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制(2)規(guī)則的綁定34如果字段已經(jīng)不再需要規(guī)則限制輸入了,那么必須把已經(jīng)綁定了的規(guī)則去掉,這就是解綁規(guī)則。在查詢分析器中,同樣用存儲(chǔ)過程來完成解綁操作。其語法格式如下:[EXECUTE]sp_unbindrule'表名.字段名'|'自定義數(shù)據(jù)類型名'圖6-18刪除xb_rule規(guī)則(3)解綁規(guī)則如果規(guī)則已經(jīng)沒有用了,那么可以將其刪除。在刪除前應(yīng)先對規(guī)則進(jìn)行解綁,當(dāng)規(guī)則已經(jīng)不再作用于任何表或字段等時(shí),則可以用DROPRULE刪除一個(gè)或多個(gè)規(guī)則。其語法格式如下:DROPRULE規(guī)則名稱[,…n](4)刪除規(guī)則【例6.12】從student數(shù)據(jù)庫中刪除xb_rule規(guī)則。代碼和結(jié)果如圖6-18所示。如果字段已經(jīng)不再需要規(guī)則限制輸入了,那么必須把已358.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制1.使用Transact-SQL語句和系統(tǒng)存儲(chǔ)過程管理規(guī)則(1)創(chuàng)建規(guī)則

【格式】CREATERULErule_name

AScondition_expression

【功能】創(chuàng)建一個(gè)由“rule_name”指定名稱的規(guī)則,規(guī)則的條件表達(dá)式由“condition_expression”指定。

(2)綁定規(guī)則【格式】[EXEC]sp_bindrule'rule_name''tablename_columnname'|'UDTname'

【功能】把rule_name規(guī)則綁定到tablename_columnname指定的列上或UDTname指定的用戶自定義類型上。

8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制1.使用Transa36【例8-13】為CollegeMIS數(shù)據(jù)庫創(chuàng)建一個(gè)名為Sex_Rule的規(guī)則,規(guī)則的條件表達(dá)式為“@Sex='男'OR@Sex='女'”。然后把該規(guī)則分別綁定到Student表的Sex字段和Teacher表的Sex字段。

USECollegeMISGOCREATERULESex_RuleAs@Sex='男'OR@Sex='女'GOEXECsp_bindrule'Sex_Rule','Student.Sex'EXECsp_bindrule'Sex_Rule','Teacher.Sex'GO

【例8-13】為CollegeMIS數(shù)據(jù)庫創(chuàng)建一個(gè)名為Sex378.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制1.使用Transact-SQL語句和系統(tǒng)存儲(chǔ)過程管理規(guī)則(3)解綁規(guī)則

【格式】[EXEC]sp_unbindrule'tablename_columnname'|'UDTname'

【功能】把tablename_columnname指定的列上或UDTname指定的用戶自定義數(shù)據(jù)類型上綁定的規(guī)則去掉。

(4)刪除規(guī)則【格式】DROPRULErule_name[,...n]

【功能】刪除由rule_name作為規(guī)則名指定的規(guī)則??蓜h除多個(gè)規(guī)則,規(guī)則之間用“,”分開。

【例如】EXECsp_unbindrule'Teacher.Sex'

【例如】DROPRULESex_Rule

8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制1.使用Transa388.1.4使用默認(rèn)值實(shí)施數(shù)據(jù)完整性控制1.使用Transact-SQL語句和系統(tǒng)存儲(chǔ)過程管理默認(rèn)值(1)創(chuàng)建默認(rèn)值【格式】CREATEDEFAULTdefault_name

ASdefault_constant

【功能】創(chuàng)建一個(gè)由“default_name”指定名稱的默認(rèn)值,默認(rèn)值的值由“default_constant”確定。default_constant是常量表達(dá)式,可以包含常量、內(nèi)置函數(shù)或數(shù)學(xué)表達(dá)式。

(2)綁定默認(rèn)值【格式】[EXEC]sp_bindefault'default_name‘'tablename_columnname'|'UDTname'

【功能】把default_name默認(rèn)值綁定到tablename_columnname指定的列上或UDTname指定的用戶自定義數(shù)據(jù)類型上。

8.1.4使用默認(rèn)值實(shí)施數(shù)據(jù)完整性控制1.使用Trans39【例8-14】為CollegeMIS數(shù)據(jù)庫創(chuàng)建一個(gè)名為Sex_Default的默認(rèn)值,值為“男”。然后把該默認(rèn)值綁定到Teacher表的Sex字段上。USECollegeMISGOCREATEDefaultSex_DefaultAs'男'GOEXECsp_bindefault'Sex_Default','Teacher.Sex'GO【例8-14】為CollegeMIS數(shù)據(jù)庫創(chuàng)建一個(gè)名為Sex408.1.4使用默認(rèn)值實(shí)施數(shù)據(jù)完整性控制1.使用Transact-SQL語句和系統(tǒng)存儲(chǔ)過程管理默認(rèn)值(3)解綁默認(rèn)值【格式】[EXEC]sp_unbindefault'tablename_columnname'|'UDTname'

【功能】把tablename_columnname指定的列上或UDTname指定的用戶自定義數(shù)據(jù)類型上綁定的默認(rèn)值去掉。

(4)刪除默認(rèn)值【格式】DROPDEFAULTdefault_name[,...n]

【功能】刪除由default_name作為默認(rèn)值名指定的默認(rèn)值??蓜h除多個(gè)默認(rèn)值,默認(rèn)值之間用“,”分開。

【例如】EXECsp_unbindefault'Teacher.Sex'

【例如】DROPDEFAULTSex_Default

8.1.4使用默認(rèn)值實(shí)施數(shù)據(jù)完整性控制1.使用Trans41數(shù)據(jù)完整性強(qiáng)制選擇方法

SQLServer2005提供了許多實(shí)現(xiàn)數(shù)據(jù)完整性的方法。除了本章介紹的約束、默認(rèn)和規(guī)則外,還有前面章節(jié)介紹的數(shù)據(jù)類型和后面需要學(xué)習(xí)的觸發(fā)器等。對于某一問題可能存在多種解決辦法,應(yīng)該根據(jù)系統(tǒng)的實(shí)際要求,從數(shù)據(jù)完整性方法實(shí)現(xiàn)的功能和開銷綜合考慮。下面來簡單討論一下各種實(shí)現(xiàn)數(shù)據(jù)完整性的方法的功能和性能開銷。

觸發(fā)器功能強(qiáng)大,既可以維護(hù)基礎(chǔ)的數(shù)據(jù)完整性邏輯,又可以維護(hù)復(fù)雜的完整性邏輯,如多表的級聯(lián)操作,但是開銷較高;

約束的功能比觸發(fā)器弱,但開銷低;

默認(rèn)和規(guī)則功能更弱,開銷也更低;

數(shù)據(jù)類型提供最低級別的數(shù)據(jù)完整性功能,開銷也是最低的。在選擇完整性方案時(shí),應(yīng)該遵循在完成同樣任務(wù)的條件下,選擇開銷低的方案解決。也就是說,能用約束完成的功能,就不用觸發(fā)器完成;能用數(shù)據(jù)類型完成的功能,就不用規(guī)則來完成。數(shù)據(jù)完整性強(qiáng)制選擇方法SQLServer42應(yīng)用舉例

1.使用約束(1)用SQL語句創(chuàng)建cust_sample表,在其中創(chuàng)建四個(gè)字段,將cust_id創(chuàng)建為主鍵,并用檢查約束限制cust_id。代碼如下:USEstudentGOCREATETABLEcust_sample(cust_idintPRIMARYKEY,cust_namechar(16),cust_addresschar(30),cust_credit_limitmoney,CONSTRAINTchk_idCHECK(cust_idBETWEEN0and10000))GO應(yīng)用舉例1.使用約束43(2)用SQL語句將“教師”表中的“學(xué)歷”字段的默認(rèn)值改為“本科”。代碼如下:IFEXISTS(SELECTNAMEFROMsysobjectsWHERENAME='df_xl'ANDTYPE='D')BEGINALTERTABLE教師

DROPCONSTRAINTdf_xlENDGOALTERTABLE教師ADDCONSTRAINTdf_xlDEFAULT'本科'FOR學(xué)歷GOSQLServer2005數(shù)據(jù)庫控制與維護(hù)課件442.使用規(guī)則用SQL語句創(chuàng)建一個(gè)xbdm_rule規(guī)則,將其綁定到“系部”表的“系部代碼”字段上,用來保證輸入的“系部代碼”只能是數(shù)字字符,最后顯示規(guī)則的文本信息。代碼如下:USEstudentGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname='xbdm_rule'ANDTYPE='R')BEGINEXECsp_unbindrule'系部.系部代碼'DROPRULExbdm_ruleENDGOCREATERULExbdm_ruleAS@chlike'[0-9][0-9]'GOEXECsp_bindrule'xbdm_rule','系部.系部代碼'GOEXECsp_helptextxbdm_ruleGO

2.使用規(guī)則453.使用默認(rèn)用SQL語句創(chuàng)建一個(gè)df_bz默認(rèn)對象,將其綁定到“班級”表的“備注”字段上,使默認(rèn)值為“教學(xué)班”。最后查看默認(rèn)對象定義的文本信息。代碼如下:USEstudentGOIFEXISTS(SELECTnameFROMsysobjectsWHEREname='df_bz'ANDTYPE='D')BEGINEXECsp_unbindefault'班級.備注'DROPDEFAULTdf_bzENDGOCREATEDEFAULTdf_bzAS'教學(xué)班'GOEXECsp_bindefault'df_bz','班級.備注'GOEXECsp_helptextdf_bzGO3.使用默認(rèn)468.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制1.觸發(fā)器概述(1)觸發(fā)器的概念觸發(fā)器:也是實(shí)施數(shù)據(jù)完整性控制的一種手段,它是一種特殊類型的存儲(chǔ)過程,由Transact-SQL語句組成,不允許帶參數(shù),與表緊密相連,可以看作表定義的一部分。使用:它是在用戶對表中的數(shù)據(jù)進(jìn)行修改、插入或刪除時(shí),由系統(tǒng)自動(dòng)調(diào)用,而不允許由用戶或程序通過名稱調(diào)用。

功能:觸發(fā)器是基于一個(gè)表創(chuàng)建的,但是可以針對多個(gè)表進(jìn)行操作,因此利用觸發(fā)器不但能夠?qū)?shù)據(jù)庫中的相關(guān)表實(shí)施級聯(lián)操作,而且可以引用其他表中的列來完成檢查工作以實(shí)現(xiàn)比CHECK約束更為復(fù)雜的數(shù)據(jù)完整性約束。利用觸發(fā)器還可以評估數(shù)據(jù)修改前后的表狀態(tài),并根據(jù)其差異采取對策。種類:在一個(gè)表中可以存在三種不同操作(INSERT、UPDATE、DELETE)的觸發(fā)器,以對相應(yīng)的修改操作響應(yīng)并進(jìn)行處理。

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制1.觸發(fā)器概述(478.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制1.觸發(fā)器概述(2)觸發(fā)器的種類SOLServer2000按觸發(fā)器被激活的時(shí)機(jī)可以分為兩種類型:AFTER觸發(fā)器和INSTEADOF觸發(fā)器。

AFTER觸發(fā)器:又稱為后觸發(fā)器,該類觸發(fā)器是在引起觸發(fā)器執(zhí)行的修改語句成功執(zhí)行后被觸發(fā)執(zhí)行,如果修改語句執(zhí)行失敗,觸發(fā)器將不會(huì)執(zhí)行。此類觸發(fā)器只能定義在表上,而且可以為每個(gè)觸發(fā)操作(INSERT,UPDATE或DELETE)創(chuàng)建多個(gè)AFTER觸發(fā)器。注意,該類觸發(fā)器不能創(chuàng)建在視圖上。

INSTEADOF觸發(fā)器:又稱為替代觸發(fā)器,表示不執(zhí)行引起觸發(fā)器執(zhí)行的修改語句,而只執(zhí)行觸發(fā)器本身。該類觸發(fā)器既可在表上定義,也可在視圖上定義。對于每個(gè)觸發(fā)操作(INSERT,UPDATE和DELETE),只能定義一個(gè)INSTEADOF觸發(fā)器。

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制1.觸發(fā)器概述(488.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制1.觸發(fā)器概述(3)Deleted表與Inserted表在觸發(fā)器的執(zhí)行過程中,SQLServer建立并管理兩個(gè)臨時(shí)表:Deleted表和Inserted表。這兩個(gè)表包含了在激發(fā)觸發(fā)器的操作中插入、修改或刪除的記錄??梢岳眠@一特性來檢查某些數(shù)據(jù)修改情況,并根據(jù)修改情況決定觸發(fā)器應(yīng)執(zhí)行的操作。這兩個(gè)特殊表用戶只能查詢,而不能直接修改。

在執(zhí)行INSERT語句(插入操作)時(shí)被添加的記錄將存儲(chǔ)在Inserted表中。在執(zhí)行DELETE語句(刪除操作)時(shí),表中被刪除的記錄會(huì)發(fā)送到Deleted表。在執(zhí)行UPDATE語句(修改操作)時(shí),SQLServer先將要進(jìn)行修改的記錄存儲(chǔ)到Deleted表中,然后再將修改后的記錄復(fù)制到Inserted表中。

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制1.觸發(fā)器概述(498.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制2.創(chuàng)建觸發(fā)器(1)使用對象資源管理器創(chuàng)建觸發(fā)器【例8-15】為CollegeMIS數(shù)據(jù)庫的Teacher表創(chuàng)建一個(gè)名為Insert_DepartNo的INSERT觸發(fā)器。當(dāng)在Teacher表插入數(shù)據(jù)時(shí),如果在Department(系)表中沒有的DepartNo(系號)的值,則提示用戶不能插入記錄,否則提示記錄插入成功。

在創(chuàng)建觸發(fā)器時(shí),必須指明在哪一個(gè)表上定義觸發(fā)器以及觸發(fā)器的名稱、激發(fā)時(shí)機(jī)、激活觸發(fā)器的修改語句(INSERT、UPDATE或DELETE)。操作步驟如下:①在“對象資源管理器”窗格中,展開“數(shù)據(jù)庫”結(jié)點(diǎn)。②展開相應(yīng)的數(shù)據(jù)庫(選擇CollegeMIS數(shù)據(jù)庫)和“表”結(jié)點(diǎn)。③單擊相應(yīng)的表(選擇“Teacher”表),右擊“觸發(fā)器”結(jié)點(diǎn),在彈出的快捷菜單中選擇“新建觸發(fā)器”命令,打開新建觸發(fā)器初始界面,如圖9-6所示。8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制2.創(chuàng)建觸發(fā)器(50SQLServer2005數(shù)據(jù)庫控制與維護(hù)課件51⑤單擊“分析”按鈕,然后單擊“執(zhí)行”按鈕,完成觸發(fā)器的創(chuàng)建。CREATETRIGGER[Insert_DepartNo]ON[dbo].[Teacher]FORINSERTASDECLARE@DepartNochar(2)SELECT@DepartNo=Department.DepartNoFROMDepartment,InsertedWHEREDepartment.DepartNo=Inserted.DepartNoIF@DepartNo<>''PRINT('教師信息插入成功')ELSEBEGINPRINT('系表中沒有該系的信息,插入失敗')ROLLBACKTRANSACTION /*撤消事務(wù)*/END④輸入觸發(fā)器文本,本例中輸入的代碼如下:⑤單擊“分析”按鈕,然后單擊“執(zhí)行”按鈕,完成觸發(fā)器的創(chuàng)建528.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制2.創(chuàng)建觸發(fā)器(2)使用Transact-SQL語句創(chuàng)建觸發(fā)器【格式】CREATETRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]{

{{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][DELETE]}

[NOTFORREPLICATION]

AS

[{IFUPDATE(column)

[{AND|OR}UPDATE(column)][,...n]

|IF(COLUMNS_UPDATED(){bitwise_operator}updated_bitmask)

{comparison_operator}column_bitmask[,...n]}]

sql_statement[,...n]

}}

【功能】為table指定的表或view指定的視圖創(chuàng)建一個(gè)由trigger_name指定名稱的觸發(fā)器。

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制2.創(chuàng)建觸發(fā)器(53【例8-16】為CollegeMIS數(shù)據(jù)庫中的表Teacher表建立一個(gè)名為delete_Teacher的DELETE觸發(fā)器。當(dāng)用戶刪除Teacher表中的記錄時(shí),如果SelectCourse表中引用了該記錄的TeaNo值,則提示用戶不能刪除記錄,否則提示記錄已刪除。USECollegeMISGOCREATETRIGGERDelete_TeacherONTeacherFORDELETEASIF(SELECTCount(*)FROMSelectCourseINNERJOINDeletedONSelectCourse.TeaNo=Deleted.TeaNo)>0BEGINPRINT'該教師在選課表中已經(jīng)有授課信息,不能刪除!'ROLLBACKTRANSACTIONENDELSEPRINT'記錄刪除成功'GO【例8-16】為CollegeMIS數(shù)據(jù)庫中的表Teache54【例8-17】為CollegeMIS數(shù)據(jù)庫中的表Teacher表建立一個(gè)名為Update_Teacher的Update觸發(fā)器。當(dāng)用戶修改Teacher表的TeaID的值時(shí),提示用戶不能修改身份證號。USECollegeMISGOCREATETRIGGERUpdate_TeacherONTeacherFORUPDATEASIFUPDATE(TeaID)BEGINPRINT'不能修改教師的身份證號'ROLLBACKTRANSACTIONENDGO

【例8-17】為CollegeMIS數(shù)據(jù)庫中的表Teache558.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制3.查看觸發(fā)器信息(1)使用對象資源管理器查看觸發(fā)器信息(2)使用系統(tǒng)存儲(chǔ)過程查看觸發(fā)器信息可以使用系統(tǒng)存儲(chǔ)過程sp_help、sp_helptext和sp_helptrigger來查看觸發(fā)器信息。sp_help和sp_helptext的使用方法,在前面的各章已經(jīng)多次講解。調(diào)用sp_helptrigger的語句格式如下:[EXEC]sp_helptriggertable_name[INSERT][,][UPDATE][,][DELETE]例如:USECollegeMISGOEXECsp_helptriggerTeacherGO8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制3.查看觸發(fā)器信568.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制4.修改觸發(fā)器(1)使用對象資源管理器修改觸發(fā)器(2)使用Transact-SQL語句修改觸發(fā)器修改觸發(fā)器的定義,可以使用Transact-SQL語句:ALTERTRIGGER命令中有許多選項(xiàng),含義與CREATETRIGGER含義相同。8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制4.修改觸發(fā)器(57語法:ALTERTRIGGERtrigger_nameON(table|view)[WITHENCRYPTION]{{(FOR|AFTER|INSTEADOF){[INSERT][,][DELETE][,][UPDATE]}[NOTFORREPLICATION]ASsql_statement[,…n]}|{(FOR|AFTER|INSTEADOF){[INSERT][,][UPDATE]}[NOTFORREPLICATION]AS

[{IFUPDATE(column)[{AND|OR}UPDATE(column)][,…n]|IF(COLUMNS_UPDTED(){bitwise_operator}updated_bitmask)(comparison_operator)column_bitmask[,…n]}sql_statement[,…n]}}其中的參數(shù)與創(chuàng)建觸發(fā)器語句中的參數(shù)相同。語法:588.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制5.禁止或啟用觸發(fā)器【格式】ALTERTABLE{ENABLE|DISABLE}trigger_name

【功能】對由“trigger_name”作為名稱指定的觸發(fā)器禁止或啟用。

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制5.禁止或啟用觸598.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制6.刪除觸發(fā)器(1)使用對象資源管理器刪除觸發(fā)器信息

(2)使用Transact-SQL語句刪除觸發(fā)器【格式】DROPTRIGGERtrigger_name[,…n]

【功能】刪除由“trigger_name”作為名稱指定的觸發(fā)器,可以刪除多個(gè)觸發(fā)器,觸發(fā)器名之間用“,”隔開。【功能】把例8-16創(chuàng)建的名為delete_Teacher的觸發(fā)器刪除。

USECollegeMISIFEXISTS(SELECTnameFROMsysobjectsWHEREname='delete_Teacher'ANDtype='TR')DROPTRIGGERdelete_TeacherGO8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制6.刪除觸發(fā)器60嵌套觸發(fā)器

在觸發(fā)器中可以包含影響另外一個(gè)表的INSERT、UPDATE或者DELETE語句,這就是嵌套觸發(fā)器。具體來說就是,如果表A上的觸發(fā)器在執(zhí)行時(shí)引發(fā)了表B上的觸發(fā)器,而表B上的觸發(fā)器又激活表C上的觸發(fā)器,表C的觸發(fā)器又激活表D的觸發(fā)器……所有觸發(fā)器一起觸發(fā)。這些觸發(fā)器不會(huì)形成無限循環(huán),SQLServer規(guī)定觸發(fā)器最多可以嵌套至32層。如果允許使用嵌套觸發(fā)器,且鏈中的一個(gè)觸發(fā)器開始一個(gè)無限循環(huán),如果超出嵌套級,觸發(fā)器將被終止執(zhí)行。正確地使用套嵌觸發(fā)器,可以執(zhí)行一些有用的日常工作,但是嵌套觸發(fā)器的任意層中發(fā)生錯(cuò)誤,則整個(gè)事務(wù)都將取消,且所有的數(shù)據(jù)修改都將取消。一般情況下,在觸發(fā)器中包含PRINT語句,用以確定錯(cuò)誤發(fā)生的位置。嵌套觸發(fā)器在觸發(fā)器中可以包含影響另外一個(gè)表61在默認(rèn)情況下,系統(tǒng)允許嵌套,但是可以使用sp_config系統(tǒng)存儲(chǔ)過程或“嵌套觸發(fā)器”服務(wù)器配置選項(xiàng)修改是否允許嵌套。1.使用系統(tǒng)存儲(chǔ)過程改變嵌套使用sp_config系統(tǒng)存儲(chǔ)過程設(shè)置是否允許嵌套的語法格式如下:

EXECsp_configure'nestedtrigger',0|1其中,設(shè)置為0,則允許嵌套;設(shè)置為1,則禁止嵌套。2.使用對象資源管理器設(shè)置嵌套使用對象資源管理器設(shè)置觸發(fā)器是否嵌套的操作步驟如下:(1)在“對象資源管理器”窗格中,展開服務(wù)器結(jié)點(diǎn)。(2)右擊需要修改的服務(wù)器,在彈出的快捷菜單中選擇“屬性”命令,打開“服務(wù)器屬性”對話框。(3)在對話框中選擇“高級”選項(xiàng),如圖9-9所示。在“允許服務(wù)器激發(fā)其他服務(wù)器”選項(xiàng)中選擇TRUE。

使用嵌套觸發(fā)器

在默認(rèn)情況下,系統(tǒng)允許嵌套,但是可以使用sp_config系62圖9-9“服務(wù)器屬性”對話框圖9-9“服務(wù)器屬性”對話框638.2.1SQLServer的安全機(jī)制8.2.2服務(wù)器登錄帳號的管理8.2.3數(shù)據(jù)庫用戶管理

8.2數(shù)據(jù)庫的安全性控制8.2.4管理權(quán)限

8.2.1SQLServer的安全機(jī)制8.2.2服64謝謝!謝謝!65第8第8章SQLServer2005數(shù)據(jù)庫控制與維護(hù)——數(shù)據(jù)庫應(yīng)用教程第8第8章SQLServer2005數(shù)據(jù)庫控制與維66數(shù)據(jù)庫的完整性控制

數(shù)據(jù)庫的安全性管理

數(shù)據(jù)庫備份與還原

第8章SQLServer2005數(shù)據(jù)庫控制與維護(hù)

數(shù)據(jù)庫的完整性控制數(shù)據(jù)庫的安全性管理數(shù)據(jù)庫備份與還原678.1.1數(shù)據(jù)完整性概述

8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制8.1.3使用規(guī)則實(shí)施數(shù)據(jù)完整性控制

8.1數(shù)據(jù)庫的完整性控制8.1.4使用默認(rèn)值實(shí)施數(shù)據(jù)完整性控制

8.1.5使用觸發(fā)器實(shí)施數(shù)據(jù)完整性控制

8.1.1數(shù)據(jù)完整性概述8.1.2使用約束實(shí)施數(shù)據(jù)688.1.1數(shù)據(jù)完整性概述1.完整性的概念數(shù)據(jù)完整性是指數(shù)據(jù)的正確性、有效性、一致性和相容性。由于數(shù)據(jù)庫是一個(gè)動(dòng)態(tài)的集合,數(shù)據(jù)不斷地被插入和被修改,因此由于主觀或客觀的原因,可能破壞數(shù)據(jù)庫的數(shù)據(jù)完整性。2.破壞數(shù)據(jù)庫的數(shù)據(jù)完整性的情況

(1)無效的數(shù)據(jù)被添加到數(shù)據(jù)庫中。如:某在教師管理系統(tǒng)中,輸入的教師號不存在。(2)對數(shù)據(jù)庫的修改不一致。如:在兩個(gè)不同的表中,同一教師的系號不同。(3)將存在的數(shù)據(jù)修改為無效的數(shù)據(jù)。如:將某教師所在的系號修改為并不存在的系。8.1.1數(shù)據(jù)完整性概述1.完整性的概念數(shù)據(jù)完整性是指698.1.1數(shù)據(jù)完整性概述3.完整性機(jī)制為了保證存放數(shù)據(jù)的完整性,DBMS應(yīng)能對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)完整性控制。在SQLServer2000中,提供了約束、默認(rèn)值、規(guī)則、觸發(fā)器等維護(hù)機(jī)制對數(shù)據(jù)完整性進(jìn)行控制。4.完整性分類

在SQLServer中,數(shù)據(jù)完整性分成四類:實(shí)體完整性、域完整性、參照完整性和用戶自定義完整性。8.1.1數(shù)據(jù)完整性概述3.完整性機(jī)制為了保證存放數(shù)據(jù)708.1.1數(shù)據(jù)完整性概述域完整性:也可稱為列完整性。域完整性要求:向表中指定列輸入的數(shù)據(jù)必須具有正確的數(shù)據(jù)類型、格式以及有效的數(shù)據(jù)范圍。例如,在CollegeMIS數(shù)據(jù)庫的SelectCourse表中,向Score(成績)列輸入數(shù)據(jù)時(shí),不能出現(xiàn)字符,也不能輸入小于0或大于100的數(shù)值。域完整性的控制方法:主要有CHECK約束、外鍵約束、默認(rèn)約束、默認(rèn)值、非空定義、規(guī)則以及在創(chuàng)建表時(shí)設(shè)置的數(shù)據(jù)類型。實(shí)體完整性的控制方法:主要有主鍵約束、惟一索引、惟一約束和指定IDENTITY屬性。5.完整性控制方法

參照完整性的控制方法:主要有外鍵約束,有時(shí)利用觸發(fā)器也可實(shí)現(xiàn)參照完整性控制。8.1.1數(shù)據(jù)完整性概述域完整性:也可稱為列完整性。實(shí)體718.1.2使用約束實(shí)施數(shù)據(jù)完整性控制在SQLServer中,可通過約束來實(shí)施數(shù)據(jù)庫的數(shù)據(jù)完整性控制,常用的約束有NOTNULL(非空)約束、CHECK(檢查)約束、UNIQUE(惟一)約束、PRIMARYKEY(主鍵)約束、FOREIGNKEY(外鍵)約束和DEFAULT(默認(rèn))約束。1.約束的建立

【格式】ALTERTABLEtable_nameADDCONSTRAINTconstraint_namePRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column[,...n])}(1)主鍵約束的創(chuàng)建

【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的主鍵約束。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制在SQLServe72【例8-1】把CollegeMIS數(shù)據(jù)庫中SelectCourse表中的主鍵pk_xuanke刪除,然后重建。

USECollegeMISGOALTERTABLESelectCourse

DROPCONSTRAINTpk_xuankeGOALTERTABLESelectCourse

ADDCONSTRAINTpk_xuankePRIMARYKEY(StuNo,TeaNo,CourseNo)GO【例8-1】把CollegeMIS數(shù)據(jù)庫中SelectCou738.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-2】為CollegeMIS數(shù)據(jù)庫中的Department表的DepartName字段創(chuàng)建一個(gè)惟一約束,約束名為IX_DepartName。

(2)惟一約束的創(chuàng)建—使用企業(yè)管理器創(chuàng)建惟一約束在一張數(shù)據(jù)表中,有時(shí)除主鍵需要具有唯一性外,還有其他列也需要具有唯一性。例如,在“系部”表中,主鍵為“系部代碼”,但是另外一個(gè)字段“系部名稱”雖不是主鍵,也需保證它的唯一性,這時(shí)就需要?jiǎng)?chuàng)建表中的唯一約束。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【74使用對象資源管理器創(chuàng)建唯一約束下面以“系部”表為例,為“系部名稱”字段創(chuàng)建唯一約束。操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要設(shè)置唯一約束的表(本例為“系部”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)在“表設(shè)計(jì)器”窗口中,右擊需要設(shè)置為唯一約束的字段(本例為“系部名稱”字段),在彈出的快捷菜單中選擇“索引/鍵”命令,如圖6-7所示,也可以直接單擊工具欄中的“管理索引和鍵”按鈕,打開“索引/鍵”對話框,如圖6-8所示。圖6-7選擇“索引/鍵”命令圖6-8“索引/鍵”對話框使用對象資源管理器創(chuàng)建唯一約束(2)在“表設(shè)計(jì)器”窗口中,右75(3)在打開的“索引/鍵”對話框中,單擊“添加”按鈕,結(jié)果如圖6-9所示。圖6-9單擊“添加”按鈕創(chuàng)建唯一約束(4)設(shè)置好相關(guān)選項(xiàng)后,單擊“關(guān)閉”按鈕,完成唯一約束的創(chuàng)建。這時(shí),不只是該表的主鍵必須為唯一,并且被設(shè)置為唯一約束的字段同樣也必須為唯一。(3)在打開的“索引/鍵”對話框中,單擊“添加”按鈕,結(jié)果如768.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameUNIQUE[CLUSTERED|NONCLUSTERED]{(column[,...n])}

(2)惟一約束的創(chuàng)建—使用Transact-SQL語句【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的惟一約束。說明:惟一約束默認(rèn)的索引類型為NONCLUSTERED。

8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【778.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-3】通過Transact-SQL語句為CollegeMIS數(shù)據(jù)庫中的Department表的Telephone字段創(chuàng)建一個(gè)惟一約束,約束名為IX_Telephone。

(2)惟一約束的創(chuàng)建—使用Transact-SQL語句USECollegeMISGOALTERTABLEDepartmentADDCONSTRAINTIX_TelphoneUNIQUE(Telephone)GO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【788.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-4】為CollegeMIS數(shù)據(jù)庫中的“課程表”的“學(xué)分”

字段創(chuàng)建一個(gè)檢查約束,約束名為CK_Grade。檢查條件只允許為1~7分,不允許小于1分的學(xué)分和大于7分的學(xué)分出現(xiàn)。

(3)檢查約束的創(chuàng)建——使用對象資源管理器檢查約束對輸入的數(shù)據(jù)的值做檢查,可以限定數(shù)據(jù)輸入,從而維護(hù)數(shù)據(jù)的域完整性。操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要設(shè)置唯一約束的表(本例為“課程表”),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)在“表設(shè)計(jì)器”窗口中右擊需要?jiǎng)?chuàng)建檢查約束的字段(本例為“學(xué)分”字段),在彈出的快捷菜單中選擇“CHECK約束”命令,如圖6-11所示,打開“CHECK約束”對話框。8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【79圖6-11選擇“CHECK約束”命令

圖6-11選擇“CHECK約束”命令80(3)在“CHECK約束”對話框中,單擊“添加”按鈕,然后在“(名稱)”文本框中輸入檢查約束名稱,在約束“表達(dá)式”文本框中輸入約束條件,這里輸入“([學(xué)分]>=1AND[學(xué)分]<=7)”,如圖6-12所示。圖6-12設(shè)置“CHECK約束”條件(4)單擊“關(guān)閉”按鈕關(guān)閉對話框,完成檢查約束的創(chuàng)建。注意:如果表中原來就有數(shù)據(jù),并且數(shù)據(jù)類型或范圍與所創(chuàng)建的約束相沖突,那么約束將不能成功創(chuàng)建。(3)在“CHECK約束”對話框中,單擊“添加”按鈕,然后在818.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameCHECK(logical_expression)

(3)檢查約束的創(chuàng)建—使用Transact-SQL語句【功能】為table_name作為表名指定的表增加一個(gè)由constraint_name指定名稱的檢查約束。說明:“l(fā)ogical_expression”是檢查約束的檢查條件,通常是一個(gè)關(guān)系表達(dá)式或邏輯表達(dá)式。

8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【828.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-5】使用Transact-SQL語句,為CollegeMIS數(shù)據(jù)庫中的Student表的Birthday字段創(chuàng)建一個(gè)檢查約束,約束名為CK_Birthday。檢查條件為Birthday字段的值必須小于當(dāng)前日期。

(3)檢查約束的創(chuàng)建—使用Transact-SQL語句USECollegeMISGOALTERTABLEStudentADDCONSTRAINTCK_BirthdayCHECK(Birthday<=GetDate())GO8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【838.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【例8-6】為CollegeMIS數(shù)據(jù)庫中的Student表的Sex字段創(chuàng)建一個(gè)默認(rèn)約束,默認(rèn)值為“男”。(4)默認(rèn)約束的創(chuàng)建——使用對象資源管理器操作步驟如下:(1)在“對象資源管理器”窗格中,右擊需要?jiǎng)?chuàng)建默認(rèn)約束的表(這里為“學(xué)生”表),在彈出的快捷菜單中選擇“修改”命令,打開“表設(shè)計(jì)器”窗口。(2)選擇需要?jiǎng)?chuàng)建默認(rèn)約束的字段(這里為“性別”字段),然后在下方的“列屬性”選項(xiàng)卡中的“默認(rèn)值或綁定”文本框中輸入默認(rèn)值,本例為選擇“性別”字段,在默認(rèn)值中輸入“男”,如圖6-13所示。在用戶輸入某些數(shù)據(jù)時(shí),希望一些數(shù)據(jù)在沒有特例的情況下被自動(dòng)輸入,例如,學(xué)生的注冊日期應(yīng)該是數(shù)據(jù)錄入的當(dāng)天日期;學(xué)生的修學(xué)年限是固定的值;學(xué)生性別默認(rèn)是“男”等情況,這個(gè)時(shí)候需要對數(shù)據(jù)表創(chuàng)建默認(rèn)約束。下面分別用例子說明如何在對象資源管理器中和利用SQL語句創(chuàng)建默認(rèn)約束8.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立【84圖6|13輸入默認(rèn)值注意:單引號不需要輸入,在表保存后,在單引號外還會(huì)自動(dòng)生成一對小括號。(3)關(guān)閉“表設(shè)計(jì)器”窗口。

圖注意:單引號不需要輸入,在表保存后,在單引號外還會(huì)自動(dòng)生成858.1.2使用約束實(shí)施數(shù)據(jù)完整性控制1.約束的建立

【格式】

ALTERTABLEtable_nameADDCONSTRAINTconstraint_nameDEFAULTconstant_expressionFORcolumn_name(4)默認(rèn)約束的創(chuàng)建—使用Transact-SQL語句【功能】為table_name作為表名指定的表增加一個(gè)由constrain

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論