王文軍
[摘要]數(shù)據(jù)庫技術(shù)已經(jīng)被廣泛應(yīng)用于各行業(yè),據(jù)有關(guān)報(bào)道,數(shù)據(jù)庫的應(yīng)用已經(jīng)占到整個(gè)計(jì)算機(jī)應(yīng)用的80%。數(shù)據(jù)庫中的數(shù)據(jù)越來越重要,不論是在單機(jī)還是在網(wǎng)絡(luò)環(huán)境下,數(shù)據(jù)庫系統(tǒng)受到各個(gè)方面的威脅,數(shù)據(jù)存儲(chǔ)的安全設(shè)計(jì)問題越來越引起人們的重視。
[關(guān)鍵詞]數(shù)據(jù)庫管理系統(tǒng)安全設(shè)計(jì)
中圖分類號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671—7597(2009)1010069—01
數(shù)據(jù)庫安全涉及的范圍很廣,本文主要從數(shù)據(jù)庫管理系統(tǒng)層所提供的數(shù)據(jù)庫安全和保護(hù)功能角度來設(shè)計(jì)。主要有以下四個(gè)方面:1,安全性(security)保護(hù):即防止非法用戶對(duì)數(shù)據(jù)庫的非法使用,以避免數(shù)據(jù)的泄露、篡改或破壞。2,完整性(integrity)保護(hù):即保證數(shù)據(jù)源的正確性和一致性。3,并發(fā)控制(concurrent control):即保證多個(gè)用戶能共享數(shù)據(jù)庫,并維護(hù)數(shù)據(jù)的一致性。4,數(shù)據(jù)庫恢復(fù)(database recovery);即在系統(tǒng)失效后的數(shù)據(jù)庫恢復(fù),配合定時(shí)備份數(shù)據(jù)庫,使數(shù)據(jù)庫不丟失數(shù)據(jù)。
一、數(shù)據(jù)庫的安全性保護(hù)
采取前臺(tái)和后臺(tái)相結(jié)合的安全性保護(hù)措施來共同維護(hù)數(shù)據(jù)庫應(yīng)用系統(tǒng)的安全。
1,用戶身份鑒別。對(duì)于后臺(tái)數(shù)據(jù)庫,服務(wù)器主機(jī)用戶如果采用了Windows集成登錄方式,只有合法的服務(wù)器計(jì)算機(jī)用戶才能登錄數(shù)據(jù)庫,遠(yuǎn)程數(shù)據(jù)庫用戶采用身份驗(yàn)證方式,給遠(yuǎn)程每一個(gè)合法用戶建立用戶名和密碼,在用戶連接數(shù)據(jù)庫時(shí),需要驗(yàn)證。只有通過驗(yàn)證的用戶才能順利進(jìn)入數(shù)據(jù)庫。對(duì)于前臺(tái)程序,同樣采取此方法,在數(shù)據(jù)庫中為每一個(gè)應(yīng)用系統(tǒng)用戶建立了用戶編號(hào)、用戶名、密碼及權(quán)限,每次登錄時(shí)都要進(jìn)行身份驗(yàn)證,只有合法的系統(tǒng)用戶才能進(jìn)入該系統(tǒng)。
2,權(quán)限控制。對(duì)于后臺(tái)數(shù)據(jù)庫,可以根據(jù)用戶終端的不同而設(shè)置不同的權(quán)限。對(duì)于前臺(tái)程序,系統(tǒng)設(shè)置要更加細(xì)致,首先對(duì)每個(gè)合法用戶在建立用戶時(shí)就設(shè)好權(quán)限等級(jí),具有不同權(quán)限的用戶看到的同一模塊的窗體是有差別的。再次,對(duì)外部用戶,只設(shè)置了有限的查詢功能,故不會(huì)危及到數(shù)據(jù)庫系統(tǒng)的安全。
3,視圖機(jī)制。視圖機(jī)制就是把要保密的數(shù)據(jù)對(duì)無權(quán)查看這些數(shù)據(jù)的用戶隱藏起來,并且用戶看到的數(shù)據(jù)仍然存在于原來的地方,從而自動(dòng)地對(duì)數(shù)據(jù)庫提供根本性的安全保護(hù)。
二、數(shù)據(jù)庫的完整性保護(hù)
數(shù)據(jù)庫的完整性是指數(shù)據(jù)庫中數(shù)據(jù)的正確性、一致性和相容性。完整性是防止合法用戶使用數(shù)據(jù)庫時(shí)向數(shù)據(jù)庫中加入不合語義的數(shù)據(jù)。保證數(shù)據(jù)庫中數(shù)據(jù)的完整性的方法之一設(shè)置完整性檢查,對(duì)數(shù)據(jù)庫中的數(shù)據(jù)設(shè)置一些約束條件,數(shù)據(jù)庫管理系統(tǒng)自動(dòng)檢查。完整性約束條件的作用對(duì)象分為列、元組和關(guān)系三種級(jí)別,其中對(duì)列的約束主要指對(duì)其取值類型、范圍、精度、排序等的約束條件。對(duì)元組的約束主要指對(duì)記錄中各個(gè)屬性之間的聯(lián)系的約束條件。對(duì)關(guān)系的約束是指對(duì)若干記錄間、關(guān)系集合上以及關(guān)系之間聯(lián)系的約束條件。在一個(gè)數(shù)據(jù)庫管理系統(tǒng)中,完整性約束功能一般包括完整性約束條件設(shè)置和檢查兩部分,一般通過完整性約束語句給出。
三、數(shù)據(jù)庫的并發(fā)控制
在數(shù)據(jù)庫系統(tǒng)運(yùn)行過程中,如果數(shù)據(jù)庫管理系統(tǒng)可以同時(shí)接納多個(gè)事務(wù),事務(wù)可以在時(shí)間上重疊執(zhí)行,則稱這種執(zhí)行方式為并發(fā)訪問(concurr ent access)。實(shí)現(xiàn)數(shù)據(jù)庫并發(fā)控制的方法很多,常用的是封鎖技術(shù)。所謂封鎖即是在某一時(shí)間內(nèi)禁止某用戶對(duì)數(shù)據(jù)對(duì)象做某些操作以避免產(chǎn)生數(shù)據(jù)不一致的問題。基本的封鎖一般有排它鎖(x鎖)和共享鎖(s鎖)兩種類型。
在任何數(shù)據(jù)庫系統(tǒng)中,不可避免地會(huì)產(chǎn)生死鎖現(xiàn)象。數(shù)據(jù)庫管理系統(tǒng)使用的SQLServer數(shù)據(jù)庫也不例外,死鎖的發(fā)生并不可怕,最重要的發(fā)生死鎖后能盡快消除,使系統(tǒng)重新正常運(yùn)轉(zhuǎn)。在sQL Server系統(tǒng)中,在以下兩種情況下都可能發(fā)生死鎖現(xiàn)象。第一種情況是,當(dāng)兩個(gè)事務(wù)分別鎖定了兩個(gè)單獨(dú)的對(duì)象,這時(shí)每個(gè)事務(wù)又要求在對(duì)方已經(jīng)封鎖的對(duì)象上獲得一個(gè)鎖,因此每一個(gè)事務(wù)都必須等待另外一個(gè)事務(wù)釋放占有的鎖,這時(shí),就發(fā)生了死鎖。這種死鎖是最典型的死鎖形式。死鎖的第二種情況是,在一個(gè)數(shù)據(jù)庫中,有若干個(gè)長(zhǎng)時(shí)間運(yùn)行的事務(wù)執(zhí)行并行的操作,當(dāng)查詢分析器處理一種非常復(fù)雜的連接查詢時(shí),由于不能控制處理的順序,有可能發(fā)生死鎖現(xiàn)象。當(dāng)發(fā)生死鎖時(shí),SQL Server系統(tǒng)可以自動(dòng)檢測(cè)到,然后通過自動(dòng)取消其中一個(gè)事務(wù)來結(jié)束死鎖。在發(fā)生死鎖的兩個(gè)事務(wù)中,根據(jù)事務(wù)處理時(shí)間的長(zhǎng)短作為規(guī)則來確定它們的優(yōu)先級(jí)。處理時(shí)間長(zhǎng)的事務(wù)具有較高的優(yōu)先級(jí),處理時(shí)間短的事務(wù)具有較低的優(yōu)先級(jí)。在發(fā)生死鎖沖突時(shí),保留優(yōu)先級(jí)高的事務(wù),取消優(yōu)先級(jí)低的事務(wù)。
四、數(shù)據(jù)庫的恢復(fù)
數(shù)據(jù)庫恢復(fù)的基本原理其實(shí)十分簡(jiǎn)單,就是數(shù)據(jù)庫中任何一部分?jǐn)?shù)據(jù)可以利用存儲(chǔ)在系統(tǒng)其他存儲(chǔ)器上的冗余數(shù)據(jù)來重建。數(shù)據(jù)庫恢復(fù)首先要建立冗余數(shù)據(jù),然后利用這些冗余數(shù)據(jù)實(shí)施恢復(fù)。建立冗余數(shù)據(jù)最常用的技術(shù)是數(shù)據(jù)轉(zhuǎn)儲(chǔ)和日志文件。
1,數(shù)據(jù)轉(zhuǎn)儲(chǔ)。所謂數(shù)據(jù)轉(zhuǎn)儲(chǔ)即由DBA(數(shù)據(jù)庫管理員)定期地將整個(gè)數(shù)據(jù)庫復(fù)制到磁帶或另一個(gè)磁盤上保存起來的過程。這些備用的數(shù)據(jù)文件稱為后備副本或后援副本。當(dāng)數(shù)據(jù)庫遭到破壞后就可以利用后備副本把數(shù)據(jù)庫恢復(fù)至某個(gè)一致性狀態(tài)。轉(zhuǎn)儲(chǔ)可以分為靜態(tài)轉(zhuǎn)儲(chǔ)和動(dòng)態(tài)轉(zhuǎn)儲(chǔ)。靜態(tài)轉(zhuǎn)儲(chǔ)指的是轉(zhuǎn)儲(chǔ)期間不允許對(duì)數(shù)據(jù)庫有任何操作(包括存取、修改等),靜態(tài)轉(zhuǎn)儲(chǔ)操作相對(duì)簡(jiǎn)單,但要求在數(shù)據(jù)庫無用戶使用的情況下進(jìn)行;動(dòng)態(tài)轉(zhuǎn)儲(chǔ)指的是在轉(zhuǎn)儲(chǔ)期間允許對(duì)數(shù)據(jù)庫進(jìn)行存取等操作,即數(shù)據(jù)轉(zhuǎn)儲(chǔ)和用戶事務(wù)并發(fā)進(jìn)行,動(dòng)態(tài)存儲(chǔ)雖然可以隨時(shí)進(jìn)行,但由于與用戶事務(wù)并行執(zhí)行,不容易保證轉(zhuǎn)儲(chǔ)結(jié)束時(shí)后備副本上數(shù)據(jù)的一致性,因此實(shí)現(xiàn)起來技術(shù)要求較高。
數(shù)據(jù)轉(zhuǎn)儲(chǔ)還可分為海量轉(zhuǎn)儲(chǔ)與增量轉(zhuǎn)儲(chǔ)。海量轉(zhuǎn)儲(chǔ)指的是每次轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫的全部數(shù)據(jù),而增量轉(zhuǎn)儲(chǔ)指的是每次只轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫中上次轉(zhuǎn)儲(chǔ)以來所產(chǎn)生變化的那些數(shù)據(jù),即數(shù)據(jù)庫中的數(shù)據(jù)只轉(zhuǎn)儲(chǔ)其修改過的物理塊,這樣轉(zhuǎn)儲(chǔ)的數(shù)據(jù)量少,也不必花很多時(shí)間,但需經(jīng)常轉(zhuǎn)儲(chǔ),從而減少事故發(fā)生時(shí)更新丟失。由于海量轉(zhuǎn)儲(chǔ)數(shù)據(jù)量大,不易進(jìn)行,因此,增量轉(zhuǎn)儲(chǔ)往往是一種有效的方法。
2,日志文件。日志文件是記錄每一次對(duì)數(shù)據(jù)庫進(jìn)行更新操作的文件,該文件由數(shù)據(jù)庫管理系統(tǒng)自動(dòng)建立和記錄。文件中包括的內(nèi)容有t事務(wù)名稱、操作時(shí)間、操作類型、修改前數(shù)據(jù)值以及修改后數(shù)據(jù)值等等,還有事務(wù)的開支、提交(COMMIT)及回滾(ROLLBACK)等執(zhí)行情況記錄。在動(dòng)態(tài)轉(zhuǎn)儲(chǔ)方式中必須建立日志文件,后各副本和日志文件綜合起來才能有效地恢復(fù)數(shù)據(jù)庫。靜態(tài)轉(zhuǎn)儲(chǔ)方式也可建立日志文件。日志文件在數(shù)據(jù)恢復(fù)中起著非常重要的作用,為了保證數(shù)據(jù)庫是可恢復(fù)的,日志文件登記時(shí)必須遵循兩條原則;一是嚴(yán)格按照并行事務(wù)執(zhí)行的時(shí)間次序登記;二是必須先寫日志文件,后寫數(shù)據(jù)庫。
總而言之,為了實(shí)現(xiàn)數(shù)據(jù)庫中的數(shù)據(jù)恢復(fù),必須將數(shù)據(jù)轉(zhuǎn)儲(chǔ)與日志文件相結(jié)合才能完成。一般情況下,當(dāng)數(shù)據(jù)庫遭到破壞后,可以先用后備副本,將數(shù)據(jù)庫恢復(fù)到拷貝此副本時(shí)的一致狀態(tài),再利用日志文件將拷貝后至破壞時(shí)刻所更改過的數(shù)據(jù)全部恢復(fù)。