讓你的應用程式不再對資料庫的改動“感冒”(一) (轉)

amyz發表於2007-11-10
讓你的應用程式不再對資料庫的改動“感冒”(一) (轉)[@more@]

原著作者:to:jczuprynski@zerodefectcomputing.com">Jim Czuprynski

大綱:namespace prefix = o ns = "urn:schemas--com::office" />

對的改動,使得應用中用到的資料物件在某段時間內處於無效狀態,從而帶來致命的錯誤。本文討論些技術,可供a在實際應用中竟可能地降低資料庫改動和應用程式間的衝突。

正如古時的一位著名哲學家說的那樣“唯一不變的就是變化”。DBA的職責就是要控制資料庫的變動,使之有序。依賴於你的IT團隊的穩定性和你們開發和支援應用的穩定性,你們可以從容應付每天甚至於每時每刻地呼叫,需要變動資料庫結構。

自從我負責為客戶的資料庫提供24(小時)×7(天)的支援以後,其中一個工作就是我非常關注讓我們的應用能夠提供持續的穩定的而不需要特定的資料庫維護。而且,我發現只要事先規劃周密,我可以建立一個層來讓應用和它們要訪問的資料庫物件是絕緣的。

安全層

使用基本的檢視來隔離應用

就其形式來看,一個基本的檢視只不過是一個view引用了表中的所有列。當建立了一個新的表後,我一般會馬上建立一個基本檢視和為這個檢視建立一個公共同義詞(public synonym),然後,把必要的物件訪問授權給適當的角色。

既然oracle允許用DML語句直接操作基本表,那我可以把DML重定位到基本檢視上從而替代基本表。下面就是一個例子在HR DEMO的下,有一個EMPLOYEES的表,我授予了角色OLTPROLE完全訪問檢視的權利。

CREATE OR REPLACE VIEW hr.bv_employees AS


* 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,


,


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_employeeDML語句,增加記錄的時候只需要必要的資訊。

INSERT INTO employees


VALUES (501, 'Damien', 'McGillicudy', 'damienm@oracle.com', TO_DATE('12/31/1999'), 'FI_ACCOUNT');


COMMIT;


 


 


> SELECT *


  2  FROM employees


  3  WHERE empid >= 500


  4  ORDER BY empid;


 


  EMPID FNAME  LNAME 


---------- -------------------- ------------------------- 


EMAIL  HIRE_DATE  JOB_ID 


------------------------- ------------------- ---------- 


 501 Damien  McGillicudy 


damienm@oracle.com  12/31/1999 00:00:00 FI_ACCOUNT 

 

未完待續


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-981643/,如需轉載,請註明出處,否則將追究法律責任。

相關文章