羅紅飛
浙江商業(yè)職業(yè)技術(shù)學(xué)院應(yīng)用工程學(xué)院 浙江 310053
目前Oracle的自帶的權(quán)限管理和控制還不夠靈活,而且對于數(shù)據(jù)的誤刪除、誤清空等的操作,無法進行有效和及時的恢復(fù),不能滿足有些用戶對Oracle數(shù)據(jù)庫的需要。本系統(tǒng)的重點在于解決上述的幾個關(guān)鍵問題,為Oracle數(shù)據(jù)庫的用戶,提供了更加安全、有效的數(shù)據(jù)管理和恢復(fù),也為企業(yè)的核心業(yè)務(wù)數(shù)據(jù)上了雙保險。
傳統(tǒng)的模式是用戶直接操作數(shù)據(jù)庫內(nèi)部的表等相關(guān)信息,本系統(tǒng)擬在用戶和數(shù)據(jù)庫之間架構(gòu)一個“層”,該層包括“權(quán)限控制”、“數(shù)據(jù)恢復(fù)”、“系統(tǒng)管理”三大功能模塊,其總體架構(gòu)圖如圖1所示,用戶通過UI界面輸入數(shù)據(jù),spring將從UI界面中獲得的數(shù)據(jù)根據(jù)三大功能模塊進行處理,實現(xiàn)相應(yīng)的數(shù)據(jù)配置,最后通過觸發(fā)器和存儲過程作用于數(shù)據(jù)庫,下面按順序分模塊介紹。
圖1 系統(tǒng)總體架構(gòu)圖
在具體實現(xiàn)過程中,擬用Extjs實現(xiàn)展現(xiàn)給用戶的User Interface,提供用戶對權(quán)限控制和數(shù)據(jù)控制等的增刪改操作,因ExtJs在使用的方式上,不同于普通的html語言,它充分融入了面向?qū)ο蟮乃枷?,做了很多封裝,利用ExtJs實現(xiàn)表格,加載數(shù)據(jù),方便直觀。根據(jù)具體需求,畫出實現(xiàn)框圖如圖2。
圖2 ExtJs實現(xiàn)UI界面原理框圖
圖3 spring進行數(shù)據(jù)配置的代碼原理圖
ExtJs把數(shù)據(jù)從UI界面提交給了Web Server以后,利用Spring,更好地對數(shù)據(jù)進行面向?qū)ο蟮姆庋b,然后以面向?qū)ο蟮姆绞奖4娴綌?shù)據(jù)庫中,同時對于異常情況發(fā)生的時候,Spring能及時提供事務(wù)的回滾,保證數(shù)據(jù)的一致性,杜絕數(shù)據(jù)庫中臟數(shù)據(jù)的產(chǎn)生,過程實現(xiàn)框圖如圖3。
根據(jù)具體使用需求,權(quán)限控制應(yīng)包括DDL權(quán)限控制、DML權(quán)限控制和表空間管理。DDL權(quán)限控制主要為了更加靈活地控制用戶操作數(shù)據(jù)庫對象的權(quán)限,特別是表,因為表是數(shù)據(jù)存儲的核心對象,非常重要。DML權(quán)限控制的實現(xiàn)是通過存儲過程動態(tài)地去創(chuàng)建觸發(fā)器,來控制用戶是否能夠?qū)Ρ磉M行插入、刪除和修改的操作,表空間的管理主要提供的是對表空間的刪除等危險操作,確保操作能夠被授權(quán),同時誤操作后能夠被恢復(fù),對操作的所有記錄能夠通過日志進行查看。
(1) DDL權(quán)限控制的實現(xiàn)
Oracle提供了grant的命令,能夠?qū)τ脩糍x予某種權(quán)限,例如:
SQL>grant create table on user1,這個就是允許用戶user1可以創(chuàng)建表,但是有些需求卻不能滿足,例如我們要求user1用戶只能drop tmp開頭的table,不能drop 其他名字的表,這個在實際的業(yè)務(wù)系統(tǒng)中也是比較常見的,Oracle目前還沒有類似支持正則表達式這樣的grant命令,本系統(tǒng)就是為了解決這樣一些問題。具體思路是,首先,創(chuàng)建一張表,叫Tor$DDL_Privs,這張表的作用,就是保存DDL權(quán)限控制的各個模塊,如表1所示。
表1 權(quán)限控制表
TOR$DDL_PRIVS表里,添加了記錄以后,如何才能生效呢,這就需要從實現(xiàn)過程上來詳細地進行分析,例如,我們限制了Test用戶 Create portal* 的table的權(quán)限,也就是說,Test用戶沒有辦法創(chuàng)建以portal開頭的表名稱,如果Test去執(zhí)行了,就會收到提示:你無法執(zhí)行該操作,這個過程將由觸發(fā)器結(jié)合業(yè)務(wù)邏輯過程實現(xiàn),實現(xiàn)框圖如圖4所示。
ora_sysevent等這些是由trigger自動捕獲的,是有值的
ora_sysevent=create
ora_dict_obj_owner=test
ora_dict_obj_type=table
ora_dict_obj_name=portal1
有了這些值后,我們在存儲過程里,就可以做出相應(yīng)的邏輯處理。
圖4 DDL權(quán)限控制原理圖
(2) ML權(quán)限控制的實現(xiàn)
DML權(quán)限控制主要是用來限制用戶操作表的,關(guān)心的是表的數(shù)據(jù),根據(jù)實際情況禁止用戶插入和刪除某些表,實現(xiàn)方式主要分兩步,創(chuàng)建存儲過程、創(chuàng)建動態(tài)觸發(fā)器。例如限制sys用戶,向portal1表中插入、更新、刪除數(shù)據(jù),如圖5所示:具體包括:a、動態(tài)創(chuàng)建觸發(fā)器;b、存儲函數(shù)判斷。
圖5 DML權(quán)限控制原理圖
(3) 表空間管理
表空間是Oracle數(shù)據(jù)庫中非常重要的一個對象,表空間的刪除屬于非常危險的操作,本系統(tǒng)擬把Oracle自帶的表空間刪除操作進行屏蔽,把真正的表空間刪除操作放到系統(tǒng)中來。具體做法是:令觸發(fā)器在表空間刪除之前,做以下工作:
a、判斷是否表空間為只讀,如果不是只讀,則提示失??;
b、如果用戶確實有drop tablespace的權(quán)限,則繼續(xù);
c、執(zhí)行存儲過程,導(dǎo)出dmp文件,并且把dmp文件名保存到表TOR$DATAFILES,以備后續(xù)恢復(fù)。
數(shù)據(jù)恢復(fù)模塊主要包括DDL數(shù)據(jù)恢復(fù)和DML數(shù)據(jù)恢復(fù)。
(1) DDL數(shù)據(jù)恢復(fù)的實現(xiàn)
實現(xiàn)方法是用一個表TOR$DDL_RECOVE_CONF,記錄了用戶需要對哪些表,在被drop或者truncate以后,數(shù)據(jù)能夠恢復(fù)回來的,當(dāng)然了,首先是該用戶在權(quán)限控制里面,不應(yīng)該被限制drop或者truncate table,否則,該操作根本就不能成功,恢復(fù)也就沒有必要了。表恢復(fù)的數(shù)據(jù)是來自于drop或truncate的操作之前,由trigger把該數(shù)據(jù)寫入到臨時表中的,如圖6所示。
臨時表數(shù)據(jù)多了,當(dāng)然要清空,清空臨時表擬分為手動清空、自動清空。自動清空默認是1個月執(zhí)行一次,手動清空則可以選擇性地進行清空數(shù)據(jù)。
圖6 表恢復(fù)原理圖
(2) DML數(shù)據(jù)恢復(fù)實現(xiàn)
在表TOR$DML_TABLE_RECV里保存DML數(shù)據(jù)的恢復(fù)配置,記錄了用戶需要對哪些用戶的那些表進行DML恢復(fù),主要也是通過創(chuàng)建動態(tài)觸發(fā)器來實現(xiàn)的,在用戶進行DML操作之前,由觸發(fā)器記錄當(dāng)前的SCN的值,記錄到表TOR$DML_LOG中,以備將來的恢復(fù)用,實現(xiàn)框圖如圖7所示。
在實際的業(yè)務(wù)系統(tǒng)中,考慮到DML操作是非常頻繁的,如果要對這些所有DML操作都進行記錄的話,TOR$DML_LOG里面的記錄會非常龐大,而且恢復(fù)的復(fù)雜度會大大提高,因此,我們需要提供信任IP的功能來供用戶填寫。信任IP是一個IP列表,里面一般填寫的是,我們信任的,可以對數(shù)據(jù)庫的某些關(guān)鍵業(yè)務(wù)表進行DML操作的機器IP,例如數(shù)據(jù)庫管理員的機器的IP地址等。觸發(fā)器一旦檢測到是這些機器做的操作,它就不會把數(shù)據(jù)存入TOR$DML_LOG中去。
圖7 DML數(shù)據(jù)恢復(fù)原理圖
Oracle中的互保護技術(shù),就是仿照木馬程序中的雙進程保護的原理,通過兩個觸發(fā)器,互相之間進行保護,同時利用了Java當(dāng)中的加密技術(shù),對于某個令牌進行加密和解密,如果令牌值相同的話,兩個觸發(fā)器就同時失效,這樣,我們的系統(tǒng)保護就能夠正常關(guān)閉掉,而想通過人為的方式直接去drop觸發(fā)器的操作,是無效的。如圖8所示。
圖8 互觸發(fā)保護原理圖
目前我們開發(fā)的擴展改進系統(tǒng)總體運行情況良好,達到了預(yù)期的效果。從系統(tǒng)的穩(wěn)定性、安全性、靈活性及易用性四個方面進行了測試。
系統(tǒng)運行前后的情況對比電腦各項指標對比見表2。
表2 本系統(tǒng)安裝前后電腦各項指標對比
通過安裝系統(tǒng)使用前后的對比情況統(tǒng)計,基本上對業(yè)務(wù)沒有任何的影響。
由于本系統(tǒng)采用了巧妙的雙觸發(fā)保護機制,使得本身的保護程序比較難被卸載,同時,觸發(fā)器的實時性保護性,對于數(shù)據(jù)的保護比較及時。采用二種測試方法加以檢驗。
測試方法1:SYS用戶對系統(tǒng)本身的各種卸載和破壞操作。
表3統(tǒng)計了SYS用戶對系統(tǒng)本身的各種卸載和破壞操作的情況。
表3 SYS用戶對系統(tǒng)本身的各種卸載和破壞操作的情況
測試方法2:通過書寫具體的壓力測試程序。
通過書寫具體的壓力測試程序,對于test用戶下的table1表進行truncate操作,觀察其保護功能。測試結(jié)果如表4所示。
表4 壓力測試情況(基于table1的truncate操作)
系統(tǒng)通過靈活的權(quán)限配置方式,能夠執(zhí)行類似正則表達式的通配符匹配權(quán)限,對Oracle權(quán)限進行了擴充,使得用戶使用更加得心應(yīng)手,同時程序本身支持啟動/關(guān)閉,垃圾自動清理、自動數(shù)據(jù)備份和導(dǎo)出等的功能,作為業(yè)務(wù)系統(tǒng)的補充,顯得非常靈活。
系統(tǒng)的B/S架構(gòu)的模式,界面友好,華麗,使用方便,無須安裝額外的客戶端,支持當(dāng)前任何版本的瀏覽器,包括IE6.0,IE7.0,IE8.0,F(xiàn)ireFox,Opera,Chrome,Safari等的瀏覽器。
[1] 康諾利.數(shù)據(jù)庫系統(tǒng)——設(shè)計、實現(xiàn)與管理(第三版)英文版.北京:電子工業(yè)出版社.2003.
[2] MarleneTheriaul,RachelCarmieae,JameSVISCusi(美)著,王蘭成等譯.Oracle數(shù)據(jù)庫管理員基礎(chǔ)教程.北京:機械工業(yè)出版社.2000.
[3] KevinLoney,Marlene Thierault.Oracle 9iDBA Handbook.oracle Press.1999.
[4] Oracle公司.Oracle Streams技術(shù)白皮書.ORACLE公司.2002.
[5] 王春曉.基于數(shù)據(jù)庫復(fù)制技術(shù)的公安機關(guān)固定資產(chǎn)匯總系統(tǒng).碩士學(xué)位論文.北京化工大學(xué).2008.
[6] 王彬,代彥波,顏鵬博.Oracle 10g簡明教程.北京:清華大學(xué)出版社.2006.