數據庫安全技術及應用.ppt_第1頁
數據庫安全技術及應用.ppt_第2頁
數據庫安全技術及應用.ppt_第3頁
數據庫安全技術及應用.ppt_第4頁
數據庫安全技術及應用.ppt_第5頁
已閱讀5頁,還剩77頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章 數據庫安全技術,目 錄,本章要點及教學目標,本章要點 數據庫的安全性、權限及監控方法 數據完整性控制 并發控制與封鎖技術 數據備份與恢復 數據庫安全解決方案 教學目標 理解數據庫的安全性、權限及監控方法 了解數據完整性控制、并發控制與封鎖技術 掌握數據備份與恢復 理解數據庫安全解決方案,重點,6.1 數據庫的安全性,6.1.1數據庫安全性問題 1數據庫安全性的概念 數據庫的安全性是指保護數據庫系統和數據,以防止非法使用所造成的數據泄漏、更改或破壞。數據庫管理系統安全性保護是通過各種防范措施以防止用戶越權使用數據庫。數據庫系統中一般采用用戶標識和鑒別、存取控制、視圖以及密碼存儲等技術進行安全控制。數據庫安全的核心和關鍵是其數據安全。 數據安全是指防止數據信息被故意的或偶然的非授權泄露、更改、破壞或使數據信息被非法的系統辨識與控制。以確保數據的完整性、保密性、可用性和可控性。由于數據庫保存著大量的重要信息和機密數據,而且在數據庫系統中大量數據集中存放,為許多用戶共享,因此,加強對數據庫訪問的控制和數據安全防護至關重要。,主要指標之一,6.1 數據庫的安全性,數據庫安全分為系統安全性和數據安全性. 系統安全性是指在系統級控制數據庫的存取和使用的機制,包含: (1) 有效的用戶名/口令的組合; (2) 對用戶可連接數據庫授權; (3) 用戶對象可用的磁盤空間的數量; (4) 用戶的資源限制; (5) 數據庫審計有效性; (6) 用戶可執行的系統操作。 數據安全性是在對象級控制數據庫的存取和使用的機制,包括用戶可存取指定的模式對象及在對象上允許具體操作類型。 【案例6-1】某銀行以數據安全業務價值鏈,可將數據庫安全的技術手段分為預防保護類、檢測跟蹤類和響應恢復類等3大類,如圖6-1所示:,圖6-1 數據庫安全關鍵技術,6.1 數據庫的安全性,2SQL Server的安全性 SQL Server系統負責管理大量的業務數據,保證其業務數據的安全是數據庫管理員DBA的一項最重要任務。SQL erver系統提供了強大的安全機制來保證數據的安全。安全性包括3個方面:管理規章制度方面的安全性、數據庫服務器物理方面的安全性和數據庫服務器邏輯方面的安全性。在此主要討論數據庫服務器邏輯方面的安全性,身份驗證模式是SQL Server系統驗證客戶端和服務器之間連接的方式。SQL系統提供了兩種身份驗證模式:Windows身份驗證模式和混合模式。 3. SQL Server的安全機制 SQL Server具有權限層次安全機制。SQL Server 2005的安全性管理可分為3個等級:操作系統級、SQL Server級和數據庫級。,6.1 數據庫的安全性,(1)操作系統級的安全性 用戶使用客戶機通過網絡實現SQL Server服務器訪問時,首先要獲得操作系統的使用權。SQL可直接訪問網絡端口,對Windows安全體系以外的服務器及其數據庫的訪問。由于SQL采用了集成Windows網絡安全性機制,所使得OS安全性提高。 (2)SQL Server級的安全性 SQL Server 的服務器級安全性建立在控制服務器登錄帳號和口令基礎上。采用標準SQL Server登錄和集成Windows NT登錄兩種方式。用戶在登錄時提供的登錄帳號和口令,決定了用戶能否獲得SQL Server的訪問權和在獲得訪問權后擁有的具體權限。 (3)數據庫級的安全性 用戶通過SQL Server服務器的安全性檢驗后,直接面對第三次安全性檢驗。在建立用戶的登錄帳號信息時,提示用戶選擇默認的數據庫。在默認的情況下只有數據庫的擁有者才可訪問該數據庫的對象,并分配訪問權限給別的用戶,以便讓別的用戶也擁有該數據庫的訪問權利,在SQL Server中并不是所有的權利都可轉讓分配。,6.1 數據庫的安全性,6.1.2 數據庫權限管理 1. 權限管理概念 權限是執行操作及訪問數據的通行證。主體和安全對象之間通過權限相關聯,主體可請求系統資源的用戶、組和進程。SQL管理者可以通過權限保護分層實體(安全對象)集合。 權限用于控制用戶對數據庫對象的訪問,指定用戶對數據庫可執行的操作,用戶可以設置服務器和數據庫的權限。主要包括 3種權限:服務器權限(DBA)、數據庫對象權限和數據庫權限。 (1) 服務器權限 服務器權限允許DBA執行任務。權限定義在固定服務器角色中.這些角色可分配給登錄用戶,但這些角色是不能修改。一般只將服務器權限授給DBA,而不需修改或者授權給別的用戶登錄. (2) 數據庫對象權限 數據庫對象是授予用戶以允許他們訪問數據庫中對象的一類權限,對象權限對于使用SQL語句訪問表或視圖是必須的。,數據庫權限用于控制對象訪問和語句執行,6.1 數據庫的安全性,【案例6-2】在SQL Server Management Studio(簡稱SSMS)中給用戶添加對象權限。依次單擊“對象資源管理器”窗口中樹型節點前“”號,直到展開目標數據庫“用戶”節點.在“用戶”節點下的目標用戶上右鍵,彈出快捷菜單,選擇“屬性(R)”命令。,圖6-2 利用對象資源管理器為用戶添加對象權限,6.1 數據庫的安全性,(3) 數據庫權限 對象權限使用戶能夠訪問存在于數據庫中的對象,除了數據庫對象權限外,還可給用戶分配數據庫權限。它除了授權用戶可以創建數據庫對象和進行數據庫備份外,還增加一些更改數據庫對象的權限。一個用戶可直接分配到權限也可作為一個角色中的成員間接得到權限.【案例6-3】通過下面方式給用戶添加數據庫權限。 在“對象資源管理器”窗口中,單擊服務器前的“+”號,展開服務器節點。單擊“數據庫”前的“+”號,展開數據庫節點。在要給用戶添加數據庫權限的目標數據庫上單擊鼠標右鍵,彈出快捷菜單,如圖6-3所示,從中選擇“屬性(R)”命令。,圖6-3利用對象資源管理器為用戶添加DB權限,6.1 數據庫的安全性,2. SQL的安全模式與驗證 (1)SQL的安全模式 SQL Server采用兩層安全模式:第一層是訪問SQL ,驗證連接人的有效賬號(稱為登錄)。第二層訪問數據庫。SQL支持多個數據庫,每個數據庫都有各自的安全層,通過用戶賬號提供對數據庫的訪問。在各數據庫中建立用戶時,可根據需要限制對數據庫的訪問。 (2)登錄身份驗證模式及設置 用戶連接到SQL賬戶稱為登錄:用戶為特定數據庫定義時才可創建。SQL為每一用戶分配了唯一的用戶名和密碼。可為不同賬號授予不同的安全級別。訪問SQL登錄有兩種驗證模式:Windows身份驗證和混合模式身份驗證(登錄名和密碼)。SQL Server 與Windows 二者登錄安全過程結合起來提供安全登錄服務。網絡安全性通過向Windows 提供復雜加密過程進行驗證。用戶登錄一經過驗證,訪問SQL Server不再需要其他身份驗證。,6.1 數據庫的安全性,【案例6-4】在SSMS中設置身份驗證模式的方法。 1)打開SSMS并連接到目標服務器,在“資源管理器”窗口中,在目標服務器上單擊鼠標右鍵,彈出快捷菜單,從中選擇“屬性”命令,如圖6-4所示. 2)出現“服務器屬性”窗口,選擇“選擇頁”中的“安全性”選項,進入安全性設置頁面,如圖6-5所示。,圖6-4利用對象資源管理器設置身份驗證模式 圖6-5服務器屬性窗口的安全性頁面,6.1 數據庫的安全性,3)在“服務器身份驗證”選項級中選擇驗證模式前的單選按鈕,選中需要的驗證模式。用戶還可以在“登錄審核”選項級中設置需要的審核方式,如圖6-6所示。,圖6-6 服務器屬性,審核方式取決于安全性要求,4種審核級別為: “無”:不使用登錄審核. “僅限失敗的登錄”:記錄所有的失敗登錄。 “僅限成功的登錄”:記錄所有的成功登錄。 “失敗和成功的登錄”:記錄所有的登錄。 最后單擊“確定”按鈕,完成登錄驗證模式的設置,6.1 數據庫的安全性,3. 權限的管理 在SQL中,不同對象有不同的權限。權限管理的內容包括:權限的類型、授予權限、收回權限、否認權限等幾個方面。 (1) 權限的種類 權限的種類,可按照預先定義分為:預先定義的權限和預先未定義的權限。按照針對的對象也可分為:針對所有對象的權限和針對特殊對象的權限。常按權限等級分為3種:系統權限(隱含權限)、對象權限和語句權限。 1)系統權限(隱含權限)。是服務器級別上對整個服務器和數據庫進行管理的權限。服務器角色sysadmin具有全部系統權限。數據庫對象所有者和服務器固定角色均具有這種權限,可對所擁有的對象執行一切活動。如擁有表的用戶可查看、添加或刪除數據,更改表定義,或控制允許其他用戶對表操作的權限。,6.1 數據庫的安全性,2)對象權限。用于控制一個用戶與一個數據庫對象交互操作,有5個不同的權限:查詢、插入、修改、刪除和執行。 不同的安全對象具有不同的權限,對各對象主要操作包括:,表6-1 對象類型和操作權限,6.1 數據庫的安全性,3)語句權限。授予用戶執行相應的語句命令的能力,可以決定用戶能否操作和創建數據庫對象,語句權限(如 CREATE DATABASE)適用于語句自身,而不適用于數據庫中定義的特定對象。其語句權限主要包括: 表6-2語句權限的執行操作,6.1 數據庫的安全性,(2) 授予權限 在SQL系統中,可使用GRANT語句將安全對象的權限授予給指定的安全主體。這些可使用GRANT語句授權的安全對象包括應用程序角色、程序集、非對稱密鑰、證書、約定、數據庫、端點、全文目錄、函數、消息類型、對象、隊列、角色、路由、架構、服務器、服務、存儲過程、對稱密鑰、系統對象、表、類型、用戶、視圖、XML架構集合等。GRANT語句的語法如下: GRANT ALL | permission ( column ,.n ) ,.n ON securable TO principal ,.n WITH GRANT OPTION 其中各參數的含義為: 1)ALL:該選項并不授予全部可能的權限。 2)permission:權限的名稱。 3)column:指定表中將授予其權限的列名稱。需使用括號“()”。 4)securable:指定將授予其權限的安全對象。 5)TO principal:主體的名稱。 6)GRANT OPTION:指示被授權者在獲得指定權限的同時還可將其權限授予其他主體。,6.1 數據庫的安全性,(3) 收回權限 利用REVOKE語句,可從某個安全主體處收回(也稱撤銷)權限.它與GRANT語句相對應,可將通過它授予給安全主體的權限收回(刪除),使用REVOKE語句也可收回對特定數據庫對象的權限。 收回權限是指不再賦予此權限,但并非禁止。因為用戶可能從角色中繼承了該項權限。REVOKE語句語法格式為: REVOKE GRANT OPTION FOR ALL |permission ( column ,.n ) ,.n ON securable TO | FROM principal ,.n CASCADE 其中各參數的含義為: 1)GRANT OPTION FOR:將撤銷授予指定權限的能力. 2)CASCADE:指示當前正在撤銷的權限也將從其他被該主體授權的主體中撤銷。 其余參數的含義與GRANT語句中的各參數含義相同。,6.1 數據庫的安全性,(4) 拒絕(否認)權限 安全主體可以通過兩種方式獲得權限:直接使用GRANT語句為其授予權限,通過作為角色成員繼承角色的權限。使用REVOKE語句只能刪除安全主體,通過方式得到的權限,要徹底刪除安全主體的指定權限必須使用DENY語句。DENY語法形式與REVOKE非常類似。 使用DENY語句可以拒絕(否認)對特定數據庫對象的權限,防止主體通過其組或角色成員身份繼承權限。語法格式如下: DENY ALL | permission ( column ,.n ) ,.n ON securable TO principal ,.n CASCADE 其中:參數CASCADE指示拒絕授予指定主體該權限,同時,拒絕該主體將該權限授予其他主體。其余參數的含義與Grant語句中的各參數含義相同。,6.1 數據庫的安全性,4. 管理權限的設置 設置權限下面兩種方法各有利弊,前者操作簡單而直觀,但不能設置表或視圖的列權限;用T-SQL語句操作功能齊較繁瑣。 (1) 使用SSMS(SQL Server Management Studio)設置權限 在“數據庫屬性”窗口,選擇“選擇頁”窗口中的“權限”項,可以進入“權限設置”頁面。 (2) 使用T-SQL語句設置權限 T-SQL語句中的權限設置有下面3種: 1)GRANT語句:允許權限。 2)REVOKE:禁止權限。 3)DENY:取消允許設置。 GRANT語句的權限設置語法格式為: GRANT ALL | statement ,.n TO security_account ,.n REVOKE ALL | statement ,.n FROM security_account ,.n DENY ALL | statement ,.n TO security_account ,.n ,6.1 數據庫的安全性,6.1.3 安全監控方法 1.登錄名管理 登錄名管理包括創建登錄名、設置密碼策略、查看登錄名信息、修改和刪除登錄名。登錄名管理的方法主要有兩種。 (1) 創建登錄名 創建基于Windows登錄名,創建SQL Server登錄名,查看登錄名信息 【案例6-5】登錄屬于服務器級的安全策略,通過合法的登錄才能連接到數據庫。SQL系統登錄驗證過程如圖6-7 所示.在SSMS中創建登錄的步驟如下。,1)打開SSMS并連接到目標服務器,在“對象資源管理器” 窗口中, 單擊“安全性”前的“”號 .在“登錄名”上單擊鼠標右鍵,彈出快捷菜單, 從中選擇“新建登錄”命令,如圖6-8所示。,圖6-8 利用對象資源管理器創建登錄,圖6-7 SQL Server系統登錄驗證過程,6.1 數據庫的安全性,2)出現“登錄名”對話框,單擊需要創建的登錄模式前的單選按鈕,選定驗證方式。如圖6-9所示,并完成“登錄名”、“密碼”、“確認密碼”和其他參數設置。,圖6-9 登錄名對話框,3)選擇“選擇頁”中的“服務器角色”項,出現服務器角色設定頁面,用戶可為此用戶添加服務器角色。 4)選擇“登錄名”對話框中的“用戶映射”項,進入映射設置頁面,為新建的登錄添加映射到此登錄名的用戶,并添加數據庫角色,從而使該用戶獲得數據庫的相應角色對應的數據庫權限。最后單擊“確定”按鈕,完成登錄名創建。 (2)修改和刪除登錄名 DBA應定期檢查訪問的用戶.,6.1 數據庫的安全性,2.監控錯誤日志 用戶應經常查看SQL Server錯誤日志。在查看時,應注意在正常情況下不應出現的錯誤消息。錯誤日志的內容不僅包括出錯的消息,也包括大量關于事件狀態、版權信息等各類消息。要求學會在繁雜的錯誤信息中找到關鍵的出錯信息。當瀏覽錯誤日志時,要特別注意以下的關鍵字:錯誤、故障、表崩潰、16級錯誤和嚴重錯誤等。 查看日志2種方法:利用SSMS查看日志;利用文本編輯器查看日志。 3.記錄配置信息 當無法啟動 SQL Server時借助服務器的配置信息,微軟公司技術支持部門可以幫助恢復. 服務器的運行。在日常的維護計劃中應該安排對配置信息的維護,特別是當配置信息修改時。使用系統過程sp_configure 可以生成服務器的配置信息列表。 (1)打開SSMS。 (2)選擇服務器,單擊“連接”按鈕,進入SSMS窗口。 (3)打開一個新的查詢窗口,可以輸入各種SQL命令。 (4)在查詢窗口中輸入命令。,6.1 數據庫的安全性,6.1.4 用戶與角色管理 用戶是數據庫級的安全策略,在為數據庫創建新的用戶前,必須存在創建用戶的一個登錄或使用已經存在的登錄創建用戶. 1. 使用SSMS創建用戶 【案例6-6】使用 SSMS創建用戶的具體步驟如下。 (1)打開SSMS并連接到目標服務器,在“對象資源管理器”窗口中,單擊“數據庫”節點前的“”號,展開數據庫節點。單擊要創建用戶的目標數據節點前的“”號, 展節點Northwind。單擊“安全性” 節點前的“”號。 在“用戶”上單擊鼠標右鍵,彈出 快捷菜單,從中選擇“新建用戶” 命令,如圖6-10所示。,圖6-10 利用對象資源管理器創建用戶,6.1 數據庫的安全性,(2)在出現“數據庫用戶新建”對話框的“常規”頁面中,填寫“用戶名”,選擇“登錄名”和“默認架構”名稱。添加此用戶擁有的架構和數據庫角色。 (3)在“數據庫用戶新建”對話框的“選擇頁”中選擇“安全對象”,進入權限設置頁面(即“安全對象”頁面). “安全對象頁面”主要用于設置數據庫用戶擁有的能夠訪問的數據庫對象以及相應的訪問權限。單擊“添加”按鈕為該用戶添加數據庫對象,并為添加的對象添加顯示權限。 2角色管理 角色用來簡化將很多權限分配給用戶這一復雜任務的管理。用戶可根據所執行的任務成為一個或多個角色的成員。用戶可不必是任何角色的成員,也可為用戶分配個人權限。,6.1 數據庫的安全性,1)在“對象資源管理器”中,單擊服務器前“+”號展開.單擊“安全性”節點前“+”號.在次節點可看到固定服務器角色,在要給用戶添加的目標角色上單擊鼠標右鍵,彈出快捷菜單從中選擇“屬性”. 2)在“服務器角色屬性”對話框中,單擊“添加(A)”按鈕.3)在出現“選擇登陸名”對話框中單擊“瀏覽(B)”按鈕。 4)在出現“查找對象”對話框中,選擇目標用戶前的復選框,選中其用戶,最后單擊“確定”按鈕. 5)回到“選擇登陸名”對話框,可以看到選中的目標用戶已包含在對話框中,確定無誤后,單擊“確定”. 6)回到“服務器角色屬性”對話框。確定添加的用戶無誤后,單擊“確定” 。,圖6-11 利用對象資源管理器為用戶分配固定服務器角色,(1) 固定服務器角色 SQL安裝時就創建了在服務器級別上應用大量預定義的角色,每個角色對應著相應的管理權限。通過給用戶分配固定服務器角色,可以使用戶具有執行管理任務的角色權限。固定服務器角色的維護比單個權限容易,但是固定服務器角色不能修改。 【案例6-7】用SSMS為用戶分配固定服務器角色,從而使該用戶獲取相應的權限。,6.1 數據庫的安全性,(2) 數據庫角色 在創建每個數據庫時都添加這些角色到新創建的數據庫中,每個角色對應著相應的權限。這些數據庫角色用于授權給數據庫用戶,擁有某種或某些角色的用戶會獲得相應角色對應的權限。 可為數據庫添加角色,然后把角色分配給用戶,使用戶擁有相應的權限,在SSMS中,給用戶添加角色(或將角色授權用戶)操作與將固定服務器角色授予用戶方法類似,通過相應角色的屬性對話框可方便添加用戶,使用戶成為角色成員。 用戶也可使用圖形界面工具Transact-SQL命令創建新角色,使之擁有某個或某些權限;創建的角色還可修改其對應的權限。各種方法都需完成以下3項任務:創建新的數據庫角色、給創建的角色分配權限、將角色授予某個用戶。 【案例6-8】在SSMS創建新的數據庫角色操作步驟如下。 展開要添加新角色的目標數據庫,單擊目標數據庫節點下的“安全性”節點前的“+”號,展開節點。然后在“角色”節點上單擊右鍵,彈出快捷菜單,選擇快捷菜單中的“新建”下“ 新建數據庫角色”命令,如圖6-12所示。,6.1 數據庫的安全性,出現“數據庫角色-新建”對話框,在“常規”頁面中,添加“角色名稱”和“所有者”,并選擇此角色所擁有的架構。在此對話框中也可以單擊“添加”按鈕為新創建的角色添加用戶。 選擇“選擇頁”中的“安全對象”項,進入權限設置頁面(即“安全對象”頁面),之后可以為新創建的角色添加所擁有的數據庫對象的訪問權限。 此外,還可以使用 T-SQL語句來實現同樣目標的相關內容。,6-12新建數據庫角色,6.2 完整性控制,6.2 完整性控制 6.2.1 數據的完整性 數據完整性(Data Integrity)是指數據的精確性(Accuracy)和可靠性(Reliability)。用于防止數據庫中存在不符合語義規定的數據,造成無效操作或錯誤。DBMS提供一種檢查數據庫中的數據是否滿足語義規定的條件的機制,數據語義檢查條件稱為數據完整性約束條件,作為表定義的一部分存儲在數據庫中。DBMS中檢查數據完整性條件的機制就稱為完整性檢查。 狹義上數據的完整性和安全性是數據庫保護的兩個不同的方面。安全性側重保護數據庫,以防止非法使用所造成數據的泄露、更改或破壞,其防范對象是非法用戶和非法操作;完整性是防止合法用戶使用數據庫時向其中加入不符合語義的數據,防范對象側重不合語義的數據。但從宏觀角度,安全性和完整性密切相關,完整性也屬于安全性范疇。,6.2 完整性控制,6.2.2 完整性規則構成 由DBA或應用開發者所決定的一組預定義的完整性約束條件稱為規則。關系數據庫允許可用完整性約束和數據庫觸發器定義各種數據完整性規則。數據完整性規則主要由以下3部分構成: 觸發條件:規定系統何時使用規則檢查數據; 約束條件:規定系統檢查用戶發出的操作請求違背了什么樣的完整性約束條件; 違約響應:規定系統如果發現用戶的操作請求違背了完整性約束條件,應該采取一定的動作來保證數據的完整性,即違約時要做的事情。 完整性規則從執行時間上可分為立即執行約束和延遲執行約束.關系數據模型的完整性約束,是對表的列定義規則的說明性方法,其完整性約束條件包括3大類:實體完整性、參照完整性和用戶定義完整性.,6.2 完整性控制,6.2.3 完整性約束條件的分類 數據的完整性約束可分以下兩類: 1從約束條件使用的對象分 從約束條件使用的對象分為值約束和結構約束2種: (1)值約束:對數據類型、數據格式、取值范圍及空值等進行規定。 (2)結構約束:即對數據之間聯系的約束。 數據庫中同一關系的不同屬性間應滿足一定約束條件,同時不同關系的屬性間也有聯系也應滿足一定約束條件。常見的結構約束有4種: 1) 函數依賴約束。明確同一關系中不同屬性之間應滿足的約束條件。 2) 實體完整性約束。規定鍵的屬性列必須唯一,其值不能為空或部分為空, 3) 參照完整性約束。規定不同關系的屬性之間的約束條件. 4) 統計約束。 2從約束對象的狀態分 從約束對象的狀態分為靜態約束和動態約束2種。 (1)靜態約束.指對數據庫每一個確定狀態所應滿足的約束條件,是反映數據庫狀態合理性的約束,這是最重要的一類完整性約束。 (2)動態約束.指數據庫從一種狀態轉變為另一種狀態時,新舊值之間所應滿足的約束條件,動態約束反映的是數據庫狀態變遷的約束。,6.2 完整性控制,6.2.4 數據完整性的實施 數據庫采用多種方法以保證數據完整性,包括外鍵、束約、規則和觸發器。 1實現數據完整性的方法 1)在服務器端。定義表時聲明數據完整性,在服務器端以觸發器來實現。 2)在客戶端。在應用程序中編寫代碼來保證。在客戶端實現數據完整性的好處是在將數據發送到服務器端之前,可以先進行判斷,然后,只將正確的數據發送給數據庫服務器。 2. 完整性約束條件的作用對象及實現 完整性約束條件的作用對象為: 字段(列)級約束:數據類型、格式、取值范圍、空值約束 行(元組)級約束:各字段之間聯系的約束.訂貨數量小于等于庫存數量. 表(關系)級約束:表約束是指若干行之間、表之間的聯系的約束.如零件ID的取值不能重復也不能取空值。 具體實現包括:主關鍵字約束、外關鍵字約束、唯一性約束、檢查約束、缺省約束.約束提供了自動保持數據完整性的一種方法,6.2 完整性控制,(1)主關鍵字約束 主關鍵字約束(Primary Key Constraint,簡稱主鍵約束)指定表的一列或幾列的組合的值在表中具有唯一性,每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的字段都不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。主鍵約束可以確保實體完整性。可在創建表時定義主鍵約束,也可在以后改變表時添加。 定義主鍵約束時需指定約束名.如未指定SQL會自動為該約束分配一名字。如果將主鍵約束定義在一個已包含數據的列上,那么,該列中已存在的數據將被檢查. 如果發現任何重復的值,則主鍵約束將被拒絕。其語法如下: CONSTRAINT constraint_name PRIMARY KEY CLUSTERED | NONCLUSTERED (column_name1, column_name2,column_name16) 【案例6-9】創建訂單(Orders)表,訂單編號(cOrderNo)為主鍵. CREATE TABLE Orders ( cOrderNo CHAR(6) CONSTRAINTpkOrderNoPRIMARYKEYCLUSTERED, ) 也可用:ALTER TABLE Orders ADD CONSTRAINT pkOrderNo PRIMARY KEY CLUSTERED (cOrderNo),6.2 完整性控制,(2)外關鍵字約束 外關鍵字約束(Foreign Key Constraint,簡稱外鍵約束)定義了表之間的關系。當一個表中的數據依賴于另一個表中的數據時,你可以使用外鍵約束避免兩個表之間的不一致性。 當一個表中的一個列/多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列/列的組合定義為外關鍵字,并設定它適合哪個表中哪些列相關聯。還可以使用級聯更新和插入檢查方法。外鍵約束實施了引用完整性。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 數據類型的列創建外關鍵字。外關鍵字最多由16個列組成。 外關鍵字約束語法如下: CONSTRAINT constraint_name FOREIGN KEY (column_name1, column_name2,column_name16) REFERENCES ref_table (ref_column1,ref_column2, ref_column16) ON DELETE CASCADE | NO ACTION ON UPDATE CASCADE | NO ACTION NOT FOR REPLICATION ,6.2 完整性控制,(3)唯一性約束 唯一性約束(Unique Constraint)指定一個或多個列的組合的值具有唯一性,以防止在列中輸入重復的值。唯一性約束指定的列可有NULL屬性。 由于主關鍵字值具有唯一性,因此主關鍵字列不能再設定唯一性約束。唯一性約束最多由16個列組成。創建UNIQUE約束有關的規則為:可以創建在列級,也可以創建在表級。不允許一個表中有兩行取相同的非空值。一個表中可有多個UNIQUE約束。即使指定了WITH NOCHECK 選項,也不能阻止根據約束對現有數據進行的檢查.語法如下: CONSTRAINT constraint_name UNIQUE CLUSTERED | NONCLUSTERED (column_name1, column_name2,column_name16 ),6.2 完整性控制,(4)檢查約束 檢查約束(Check Constraint)通過限制插入列中的值來實施域完整性。可在一列上定義多個檢查約束.按定義次序實施。當約束被定義成表級時,單一的檢查約束可被應用到多列.語法如下: CONSTRAINT constraint_name CHECK NOT FOR REPLICATION(logical_expression) 1)IN關鍵字。用IN 關鍵字可以確保:鍵入的值被限制在一個常數表達式列表中。 2)LIKE關鍵字。使用LIKE關鍵字可通過通配符來確保輸入某一列的值符合一定的模式。 3)BETWEEN關鍵字。可通過BETWEEN指明常數表達式的范圍。該范圍中包括上限值和下限值。如CHECK(siToyQoh BETWEEN 0 AND 100)。 (5)缺省約束 缺省約束(Default Constraint)可用于為某列指定一常數值,這樣用戶就不需要為該列插入值。只能在一列上創建一個缺省約束,且該列不能是IDENTITY列。 缺省約束通過定義列的默認值或使用數據庫的默認值對象綁定表的列,來指定列的默認值。SQL Server 推薦使用缺省約束,而不使用定義默認值的方式來指定列的默認值。,6.2 完整性控制,語法如下: CONSTRAINT constraint_name DEFAULT constant_expression FOR column_name 如果表已經創建,而沒有指定缺省,則可用ALTER TABLE 命令來指定缺省: ALTER TABLE Shopper ADD CONSTRAINT defCity DEFAULT “Chicago” FOR cCity (6)在企業管理器中創建約束 通過“屬性”對話框選擇操作, 如圖6-13所示。,圖6-13 在企業管理器中創建約束,6.2 完整性控制,(7)系統對約束的檢查 1)主鍵約束。每當用戶執行插入數據時,系統檢查新插入的數據的主鍵值是否與已存在的主鍵值重復,或新插入的主鍵值是否為空. 2)唯一值約束。對唯一值約束的檢查同主鍵很類似只是在檢查有唯一值約束的列時,系統只需檢查新插入數據或者更改后的有唯一值約束的列的值是否與表中已有數據有重復,而不檢查是否有空值。只要新插人數據或更改后的值滿足不重復這個條件,才可進行操作。 【注意】對于有唯一值約束的列,可以有空值,但整個列只允許有一個空值。系統會將后續的空值看成與第一個空值重復的值,因此全拒絕操作。 3)外鍵約束。 4)檢查約束 5)缺省約束,6.2 完整性控制,6.2.5完整性規則實現 規則(Rule)是數據庫中對存儲在表的列或用戶自定義數據類型中的值的規定和限制。規則是單獨存儲的獨立的數據庫對象。規則與其作用的表或用戶自定義數據類型是相互獨立的。規則和約束可以同時使用,表的列可以有一個規則及多個檢查約束。 1. 創建規則 (1)用命令創建 語法為:CREATE RULE rule_name AS condition_expression 其中condition_expression 子句是規則的定義。可用于WHERE 條件子句中的任何表達式,可包含算術運算符、關系運算符和謂詞(IN、LIKE、BETWEEN 等)。 【注意】condition_expression 子句中的表達式必須以字符“”開頭。,表6-3 規則的示例,6.2 完整性控制,(2)用企業管理器創建規則 在企業管理器中選擇數據庫對象“規則”,單擊右鍵從快捷菜單中可選“新建規則”項。 (3)使用規則的限制 某一個時刻只有一條規則可綁定到某列或某用戶自定義數據類型。如果一條規則被綁定到某用戶自定義數據類型上,它并不會替代綁定到該數據類型的列上的規則。如果一條新的規則綁定到某列或某數據類型上,而該列或類型上已經綁定了一條規則,那么,新規則將替代舊規則。,2. 查看規則 語法: sp_helptext objname = name 如:exec sp_helptext birthday_defa 查看birthday_defa規則, 也可用企業管理器查看規則如圖所示,圖6-14 用企業管理器查看規則,6.2 完整性控制,3. 規則的綁定與松綁 創建規則后,規則只是一個存在于數據庫中的對象,并未發生作用。將規則與數據庫表或用戶自定義對象聯系起來,才能達到創建規則的目的。解除規則與對象的綁定稱為“松綁”. (1)用存儲過程Sp_bindrule 綁定規則 語法:sp_bindrule rulename = rule, objname = object_name , futureonly 其中,參數為: rulename = rule:指定規則名稱。 objname = object_name:指定規則綁定的對象。 futureonly:此選項僅在綁定規則到用戶自定義數據類型上時才可以使用。當指定此選項時,僅以后使用此用戶自定義數據類型的列會應用新規則,而當前已經使用此數據類型的列則不受影響。,第6 章 數據庫安全,【案例6-14】綁定規則rulMaxPrice到用戶自定義數據類型 MaxPrice上,帶futureonly選項。exec sp_bindrule rulMaxPrice, MaxPrice, futureonly 【注意】規則對已經輸入表中的數據不起作用。 (2)用Sp_unbindrule解除規則的綁定 語法為:sp_unbindrule objname = object_name,futureonly 4. 刪除規則 語法為:DROP RULE rule_name ,.n 【注意】在刪除一個規則前,必須先將與其綁定的對象解除綁定。,6.2 完整性控制,6.2.6 默認值 默認值(Default)也稱缺省值,是往用戶輸入記錄時沒有指定具體數據的列中自動插入的數據。默認值對象與ALTER TABLE 或CREATE TABLE 命令操作表時用DEFAULT選項指定的默認值功能相似,但默認值對象可以用于多個列或用戶自定義數據類型,它的管理與應用同規則有許多相似之處。表的一列或一個用戶自定義數據類型也只能與一個默認值相綁定。 1. 創建默認值 用CREATE DEFAULT 命令創建默認值,用于在當前數據庫中創建默認值對象。其語法如下: CREATE DEFAULT default_name AS constant_expression 其中constant_expression 子句是默認值的定義,可以是數學表達式或函數,也可以包含表的列名或其它數據庫對象。,6.2 完整性控制,【案例6-17】創建生日默認值birthday_defa。 CREATE DEFAULT birthday_defa AS 1978-1-1 2. 默認值的綁定與松綁 (1)用存儲過程Sp_bindefault 綁定默認值 ,語法如下: sp_bindefault defname = default, objname = object_name , futureonly (2)用存儲過程Sp_unbindefault解除默認值的綁定,語法: Sp_unbindefault objname = object_name ,futureonly 3. 刪除默認值 可以在企業管理器中選擇默認值,單擊右鍵,從快捷菜單中選擇“刪除”選項刪除默認值。也可使用DROP DEFAULT 命令刪除當前數據庫默認值。 其語法為:DROP DEFAULT default_name ,.n 【注意】在刪除一個默認值前須先將與其綁定的對象解除綁定,6.3 并發控制與封鎖,6.3.1 并發操作帶來的問題 為了充分利用數據資源,經常進行并行存取,就會發生多用戶并發存取同一數據塊的情況,即數據庫的并行操作。數據庫并發控制是對多個用戶程序并行存取的控制機制,目的是避免數據的丟失修改、無效數據的讀出與不可重復讀數據現象的發生,從而保持數據的一致性。 6.3.2 事務 1事務 (1)事務的定義 數據庫的并發控制是以事務為基本單位進行的。事務是數據庫系統中執行的一個工作單位,它是由用戶定義的一組操作序列。一個事務可以是一組SQL語句、一條SQL命令或整個程序,一個應用程序可以包括多個事務。 在SQL語言中,定義事務的語句有3條: BEGIN TRANSACTION COMMIT ROLLBACK,6.3 并發控制與封鎖,(2)事務的特征 事務是由有限的數據庫操作序列組成,但并不是任意的數據庫操作序列都能成為事務,為了保護數據的完整性,一般要求事務具有以下4個特征: 1) 原子性(Atomic)。各事務為不可分割的工作單位,執行時應遵守“要么不做,要么全做”的原則,不允許事務部分完成。若意外故障而使事務未能完成,它執行的部分結果應被取消。 2) 一致性(Consistency)。事務對數據庫的功能是從一個一致狀態轉變到另一個一致狀態。所謂數據庫的一致狀態是指數據庫中的數據滿足完整性約束。 3) 隔離性(Isolation)。如果多個事務并發地執行,應像各事務獨立執行一樣,各事務的執行不能被其他事務干擾。并發控制可保證事務間的隔離性。 4) 持久性(Durability)。指一個事務一旦提交,它對數據庫中數據的改變就應該是持久的,即使數據庫因故障而受到破壞,DBMS也應該能夠恢復。 上述4個性質的英文術語的第一個字母為ACID。故稱4個性質為事務的ACID準則。,6.3 并發控制與封鎖,2并發控制概述 事務是數據庫并發控制的基本單位。保證事務ACID特性是事務處理的重要任務,而并發操作有可能會破壞其ACID特性。DBMS并發控制機制有對并發操作進行正確調度,保證事務的隔離性更強,確保數據庫的一致性。 【案例6-18】以飛機訂票系統說明并發操作帶來的數據不一致的問題. 拿飛機訂票系統中的一個活動序列(同一時刻讀取)為例,分4步: 甲售票點(甲事務)讀取某航班的機票余額A,A=16; 乙售票點(乙事務)讀取同一航班機票余額A,A=16; 甲售票點賣出一張機票,修改A=A-1,即A=15,寫入數據庫; 乙售票點也賣出一張機票,修改A=A-1,即A=15,寫入數據庫. 結果:賣出兩張票,數據庫中機票余額只減少1。 造成數據庫的不一致性是由并發操作引起的。在此情況下,對甲、乙事務的操作序列是隨機的。若按上面的調度序列執行,甲事務的修改被丟失,因為第4步中乙事務修改A并寫回后覆蓋了甲事務的修改。,6.3 并發控制與封鎖,如果沒有鎖定且多個用戶同時訪問一個數據庫,則當多個事務同時使用相同數據時可能會發生問題。并發操作帶來的數據不一致性包括: (1)丟失更新 當多個事務選擇同一行,然后基于最初選定的值更新該行時,會發生丟失更新問題。每個事務都不知道其它事務的存在。最后的更新將重寫由其它事務所做的更新,這將導致數據丟失。 (2)讀“臟”數據(臟讀) 讀“臟”數據是指事務T1修改某一數據,并將其寫回磁盤,事務T2讀取同一數據后,T1由于某種原因被撤消,而此時T1把已修改過的數據又恢復原值,T2讀到的數據與數據庫的數據不一致,則T2讀到的數據就為“臟”數據,即不正確的數據。 (3)不可重復讀 當事務T1讀取數據后,事務T2執行更新操作,使T1無法讀取前一次結果。不可重復讀包括3種情況:事務T1讀取某一數據后,T2對其做了修改,當T1再次讀該數據后,得到與前一不同的值。,6.3 并發控制與封鎖,產生數據的不一致性的主要原因是并發操作破壞了事務的隔離性。其現象如表6-4所示。 表6-4 數據庫并發操作中3種數據不一致性現象,6.3 并發控制與封鎖,6.3.3 封鎖技術 并發控制措施的本質是用正確方式調度并發操作,使一個用戶事務的執行不受其它事務干擾,從而避免造成數據的不一致性。并發控制的主要技術是封鎖(locking).如在飛機訂票例中,甲事務要修改A,若在讀出A前先鎖住A,其它事務不能再讀取和修改A,直到甲修改并寫回A后解除了對A的封鎖為止,這樣甲就不會丟失修改。 事務T在對某個數據對象(表、記錄等)操作之前,先向系統發出請求,對其加鎖。加鎖后T對數據對象有一定的控制(具體由封鎖類型決定),在事務T釋放前,其它事務不能更新.基本的封鎖類型有兩種: (1)排它鎖(X鎖、寫鎖) 若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其它任何事務不能對A加任何類型的鎖,直到T釋放A上的鎖。以保證其它事務在T釋放A上的鎖前不再讀取和修改A。 (2)共享鎖(S鎖、讀鎖) T對數據對象A加上S鎖,則T可以讀A但不能修改A,其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。保證了在T對A加S鎖過程中其它事務對A只能讀,不能修改。,6.3 并發控制與封鎖,6.3.4并發操作的調度 系統對并行操作的調度是隨機的,不同的調度可能會產生不同結果。如果一個事務運行中不同時運行其他事務,則可認為該事務的運行結果是正常的或預期的,因此將所有事務串行起來的調度策略是正確的。雖然以不同的順序串行執行事務也可能會產生不同的結果,但由于不會將數據庫置于不一致狀態,所以都可認為是正確的。由此可得結論:幾個事務的并行執行是正確的,當且僅當其結果與按某一次序串行地執行它們的結果相同。這種并行調度策略稱為可串行化(serializable)的調度。可串行性(serializability)是并行事務正確性的唯一準則 。 【案例6-20】現有兩個事務,分別包含下列操作: 事務1:讀B;A=B+1;寫回A; 事務2:讀A;B=A+1;寫回B; 假設A的初值為10,B的初值為2。表6-5給出了對這兩個事務的三種不同的調度策略,(a)和(b)為兩種不同的串行調度策略,雖然執行結果不同,但他們都是正確的調度.(c)中兩個事務是交錯執行的,由于執行結果與(a)(b)的結果都不同,所以是錯誤的調度。,6.3 并發控制與封鎖,(d)中的兩個事務也是交錯執行的,由于執行結果與串行調度1(a)的執行結果相同,所以是正確的調度。 DBMS普遍采用悲觀封鎖方法,如DM和SQL Server,以保證調度的正確性,即并行操作調度的可串行性。還有時標封鎖方法、樂觀封鎖方法等.,表6-5 對兩個事務的不同調度策略,6.4 數據備份與恢復,數據備份與恢復非常重要,是防止意外故障的必備措施。意外故障包括:存儲媒體損壞、用戶操作錯誤、硬件故障或自然災難等。 6.4.1 數據備份 1數據備份概述 數據備份(Data Backup)是指為防止系統出現操作失誤或系統故障導致數據丟失,而將全系統或部分數據從應用主機中復制(轉存)到其它存儲介質上的過程。其目的是為了系統數據崩潰時能夠快速的恢復數據,使系統迅速恢復運行。數據備份不僅是簡單的文件復制,在多數是指數據庫備份,指制作數據庫結構和數據的副本。備份的內容包括:用戶和系統的數據庫內容。 數據備份也是將數據庫數據復制到備份設備的過程,也常將存放于備份設備中的數據庫的拷貝稱為原數據庫的備份或備份.常用的技術就是數據備份和登記日志文件。,6.4 數據備份與恢復,(1)備份 備份也稱轉儲是DBA定期地將數據庫復制到儲存介質的過程。其備用的數據文本稱為后備副本或后援副本。系統在Ta時刻停止運行事務進行數據庫備份,在Tb時刻備份完畢,得到Tb時刻的數據庫一致性副本。系統運行到Tf時發生故障。為恢復數據庫,首先由DBA重裝數據庫后備副本,將數據庫恢復至Tb時刻的狀態,然后重新運行自Tb時刻至Tf時刻的所有更新事務,就可將數據庫恢復到故障發生前的狀態。如圖所示。 備份十分耗費時間

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論