讓你的應用程序不再對數據庫的改動"感冒"(一)
2024-07-21 02:08:35
供稿:網友
原著作者:jim czuprynski
大綱
對oracle數據庫對象的改動,使得應用程序中用到的數據對象在某段時間內處于無效狀態,從而帶來致命的錯誤。本文討論些技術,可供dba在實際應用中竟可能地降低數據庫改動和應用程序間的沖突。
正如古時的一位著名哲學家說的那樣“唯一不變的就是變化”。dba的職責就是要控制數據庫的變動,使之有序。依賴于你的it團隊的穩定性和你們開發和支持應用的穩定性,你們可以從容應付每天甚至于每時每刻地呼叫,需要變動數據庫結構。
自從我負責為客戶的數據庫系統提供24(小時)×7(天)的支持以后,其中一個工作就是我非常關注讓我們的應用能夠提供持續的穩定的性能而不需要特定的數據庫維護。而且,我發現只要事先規劃周密,我可以建立一個安全層來讓應用和它們要訪問的數據庫對象是絕緣的。
安全層
使用基本的視圖來隔離應用
就其形式來看,一個基本的視圖只不過是一個view引用了表中的所有列。當創建了一個新的表后,我一般會馬上創建一個基本視圖和為這個視圖創建一個公共同義詞(public synonym),然后,把必要的對象訪問權限授權給適當的角色。
既然oracle允許用dml語句直接操作基本表,那我可以把dml重定位到基本視圖上從而替代基本表。下面就是一個例子在hr demo的模式下,有一個employees的表,我授予了角色oltprole完全訪問視圖的權利。
create or replace view hr.bv_employees as
select * from hr.employees
/
create public synonym employees for hr.bv_employees;
grant select, insert, update, delete on hr.bv_employees to oltprole;
使用基本視圖的最大好處就是我可以把精力集中在應用的讀寫數據上,與此同時也把應用同破壞性的drop table和truncate語句隔離。同時,我也防止了那些“低級dba”和“過分熱心的開發者”在匆忙或意外地刪除了重要的數據庫對象。
忠告:注意如果往基本表了添加了新的列,基本視圖中是不會自動添加這個列的,除非重新把編譯基本視圖。這是把雙刃劍,當你達到了隔離應用與數據庫對象的變動,但同時也不能立即得到新增加的列。而且,要記住,字段上的約束是不包括在基本視圖中的(例如:列有一個not null的約束而且沒有提供缺省值,或者有一個check約束),發出的insert語句會失敗。
使用基本視圖隔離應用訪問指定的數據
既然可以為視圖的列指定別名,我們可以利用這個特性來限制用戶返回的數據。我們還是使用employees這個表,我想限制oltpuser角色只能訪問必需的列,換句話說,在插入一條雇員信息的時候只需要填寫那些非空的必需列。
drop view hr.bv_employees;
create or replace view hr.bv_employees (
empid,
fname,
lname,
email,
hire_date,
job_id)
as
select
employee_id,
first_name,
last_name,
email,
hire_date,
job_id
from hr.employees
/
drop public synonym employees;
create public synonym employees for bv_employees;
grant select, insert, update, delete on hr.bv_employees to oltprole;
現在我以oltpuser用戶對基本視圖bv_employee執行dml語句,增加記錄的時候只需要必要的信息。
insert into employees
values (501, 'damien', 'mcgillicudy', '[email protected]', to_date('12/31/1999'), 'fi_account');
commit;
sql> select *
2 from employees
3 where empid >= 500
4 order by empid;
empid fname lname
---------- -------------------- -------------------------
email hire_date job_id
------------------------- ------------------- ----------
501 damien mcgillicudy
[email protected] 12/31/1999 00:00:00 fi_account
未完待續