5.1 數據庫的安全性
5.1.1 數據庫安全性含義
- 數據庫的安全性:指保護數據庫防止非法使用所造成的數據泄露、更改或破壞。
5.1.2 安全性控制的一般方法
- 安全性控制:指要儘可能地杜絕所有可能的數據庫非法訪問。
- 安全性措施:
- 用戶標識和鑑定:系統提供的最外層的安全保護措施。
- 用戶存取權限控制
- 授權:定義用戶存取權限
- 存取權限兩要素:數據對象和操作類型
- 存取權限:系統權限和對象權限
- 定義視圖
- 數據加密
- 將明文加密成不可直接識別的密文,數據以密文形式存儲和傳輸
- 審計
5.1.3 SQL Server 2012的數據安全性機制
- SQL Server 2012安全模型:
- 服務器安全管理
- 數據庫安全管理
- 數據庫對象訪問權限管理
5.1.4 SQL Server 2012身份驗證模式
- Windows身份驗證模式
- 特點:“登陸一次”,授信連接
- 優點:
- 數據庫管理員的工作可以集中在管理數據庫方面,而不是管理用戶賬戶。
- Windows有着更強的用戶賬戶管理工具
- Windows的組策略支持多個用戶同時被授權訪問SQL Server
- 混合身份驗證模式
- 允許使用SQL Server身份驗證模式或Windows身份驗證模式
- 優點:
- 比Windows驗證模式更安全
- 能夠支持更大範圍的用戶
- 允許用戶從未知或不可信的域進行連接
- 允許SQL Server支持基於Web的應用程序
- 設置身份驗證模式
5.1.5 SQL Server 2012登陸賬號和服務器角色
- SQL Server的服務器角色
- 角色:對權限集中管理的一種機制,角色可以方便管理員對用戶權限的集中管理
- 服務器角色:是執行服務器級管理操作的用戶權限的集合。是SQL Server系統內置的,數據庫管理員(DBA)不能創建服務器角色
5.1.6 SQL Server 2012的數據庫用戶賬號和數據庫角色
- 數據庫的用戶賬號
- 登錄名:訪問SQL Server的通行證,存在master數據庫的表syslogins中
- 用戶名:主要用於數據庫權限管理,必須和某個登錄名相關聯,存放在其相關數據庫的sysusers表中
- 一個登陸賬戶可以創建多個用戶,但一個登陸賬戶對於每一個數據庫只能創建一個用戶與之對應
- 數據庫角色:與服務器角色不同的是,數據庫角色權限的作用域僅限在特定的數據庫內
- 用戶權限管理
- 系統權限:表示用戶對數據庫的操作權限
- 對象權限:授予數據庫用戶對特定數據庫中的表、視圖和存儲過程等對象的操作權限,相當於數據庫操縱語言的語句權限
5.2 完整性控制
5.2.1 數據庫完整性含義
- 數據庫完整性:保護數據庫中數據的正確性、有效性和相容性,防止錯誤的數據進入數據庫造成無效操作
- 完整性和安全性的區別
- 安全性措施的防範對象時非法用戶和非法操作
- 完整性的防範對象時不合語義的數據
5.2.2 完整性規則的組成
- 構成
- 觸發條件
- 約束條件
- 違約響應
- 從執行時間上分兩類
- 立即執行約束
- 延遲執行約束
- 一條完整性規則五元組——D,O,A,C,P
- D(Data)——代表約束作用的數據對象,可以是關係、元組和列
- O(Operation)——代表出發完整性檢查的數據庫操作
- A(Assertion)——代表數據對象必須滿足的語義約束,這是規則主體
- C(Condition)——代表選擇A作用的數據對象值的謂詞
- P(Oricedure)——代表違反完整性規則時觸發執行的操作過程
5.2.3 完整性約束條件的分類
- 值約束和結構約束
- 值約束:對數據類型、數據格式、取值範圍和空值進行規定
- 結構約束:函數依賴約束,實體完整性約束,參照完整性約束,統計約束
- 靜態約束和動態約束
- 靜態約束,值的約束和結構的約束均屬於靜態約束
- 動態約束,反映的是數據庫狀態變遷的約束
5.2.4 數據完整性的實施
- 聲明式數據完整性
- 程序化數據完整性
- 實施數據完整性的方法
- 約束(優先選擇,執行速度比默認值和規則快)
- 默認值
- 規則
- 存儲過程
- 觸發器
5.2.5 規則
- 創建規則
CREATE RULE rule_name AS condition_expression
- 規則的綁定與鬆綁
使用存儲過程sp_bindrule綁定規則
sp_bindrule [@rulename =] 'rule', [@objname =] 'object_name'[, 'futureonly']
futureonly:僅在綁定規則到用戶自定義數據類型上時纔可以使用
使用存儲過程sp_unbindrule解綁規則
sp_unbindrule [@objname =] 'object_name'[, 'futureonly']
5.2.6 默認
- 創建默認
CREATE DEFAULT default_name AS constant_expression
- 默認的綁定和鬆綁
使用存儲過程sp_binddefault綁定默認
sp_binddefault [@defaultname =] 'default', [@objname =] 'object_name'[, 'futureonly']
使用存儲過程sp_unbinddefault綁定默認
sp_binddefault [@objname =] 'object_name'[, 'futureonly']
如果同時綁定了一個規則和默認,默認應該符合規則的規定
- 刪除默認(刪除前應先解綁)
DROP DEFAULT {default_name} [,...n]
5.3 併發控制與封鎖
5.3.1 數據庫併發性的含義
併發控制:防止多個用戶併發存取同一數據時產生不正確的數據或破壞數據的完整性
併發控制就是解決這類問題保持數據庫中數據的一致性
5.3.2 事務(Transaction)
- 事務:是數據庫系統中執行的一個工作單位,它是由用戶定義的一組操作序列,
- 事務的特徵
- 原子性
- 一致性
- 隔離性
- 持久性
5.3.3 併發操作導致的數據不一致性
- 丟失更新
- 污讀
- 不可重讀
5.3.4 封鎖,實現併發控制的方法(重點)
- 封鎖類型
- 排他型鎖(寫封鎖,簡稱X封鎖):原理,禁止併發操作
- 共享封鎖(讀封鎖,簡稱S封鎖):原理,允許其他用戶對同一數據對象進行查詢,但不能進行修改
- 封鎖協議
- 一級封鎖協議:事務T在修改數據對象之前必須對其加X鎖,直到事務結束。此級別只有修改數據時才進行加鎖,讀取並不加鎖,所以不能防止“污讀”和“不可重讀”數據
- 二級封鎖協議:在一級封鎖協議的基礎上,加上事務T在讀取數據R之前必須對其加S鎖,讀完後釋放S鎖。可防止“污讀”,但在讀取數據之後立即釋放S鎖,仍然不能防止“不可重讀”數據
- 三級封鎖協議:在一級封鎖協議的基礎上,嘉盛事務T在讀取數據R之前必須先對其加S鎖,讀完後不釋放S鎖,直到事務T結束後才釋放。此類徹底解決了併發操作帶來的三個不一致性問題
- 封鎖粒度
- 封鎖數據對象的大小稱爲封鎖粒度
- 封鎖粒度越小,系統能夠被封鎖的對象就越多,併發度越高,但封鎖機構越複雜,系統開心越大。封鎖粒度越大則相反
- 在實際應用中選擇封鎖粒度時應同時考慮封鎖機構和併發度兩個因素
- 死鎖和活鎖
- 活鎖:當某個事物請求對某一數據進行排他性封鎖時,由於其他事務對該數據的操作而使這個事務處於永久等待狀態,這種狀態稱爲活鎖。避免活鎖的簡單方法採用先來先服務的策略
- 死鎖:在同時處於等待狀態的兩個或多個事務中,其中的每一個在它能夠進行之前,都等待着某個數據,而這個數據已被他們中的某個事務所封鎖,這種狀態稱爲死鎖
- 死鎖產生的必要條件
- 互斥條件:對數據的封鎖採用排他式
- 不可搶佔條件:不能別別的事務強行搶佔
- 部分分配條件:一個事務已經封鎖分給它的數據對象,但仍然要求封鎖其他數據
- 循環等待條件:允許等待其他事物釋放數據對象,系統處於加鎖請求相互等待的狀態
- 死鎖的預防
- 一次加鎖法:每個事務將所要使用的數據對象全部一次枷鎖,只要有一個加鎖不成功,則本次加鎖失敗,立即釋放所有加鎖成功的數據對象,然後重新開始加鎖
- 擴大了封鎖範圍,降低了系統的併發度
- 由於數據是動態變化的,很難事先精確的確定每個事務要封鎖數據對象,進一步降低了併發度,影響了系統的運行效率
- 順序加鎖法:預先對所有可加鎖的數據對象規定一個加鎖順序,對每個事務都需要按此順序加鎖,在釋放時,按逆序進行
- 一次加鎖法:每個事務將所要使用的數據對象全部一次枷鎖,只要有一個加鎖不成功,則本次加鎖失敗,立即釋放所有加鎖成功的數據對象,然後重新開始加鎖
- 死鎖的診斷與解除:選擇一個處理死鎖代價最小的事務,將其撤銷,並在之後加以恢復
5.4 數據庫的恢復
5.4.1 數據庫恢復的含義
數據庫的恢復:系統必須具有檢測故障並把數據從錯誤狀態中恢復到某一正確狀態的功能
5.4.2 數據庫恢復的原理及其實現技術
- 數據庫恢復的原理:利用數據冗餘,恢復系統應提供兩種類型的功能:生成冗餘數據和冗餘重建
- 生成冗餘數據
- 登記日誌文件
- 數據轉儲
5.4.3 數據庫的故障和恢復策略
- 事務故障:採用事務撤銷
- 系統故障
- 介質故障