我們今天主要和大家分享的是高級Oracle數據訪問控制,在Java存儲過程中是可以用來控制與限制對Oracle數據的相關訪問,其主要方法是只允許用戶通過存儲過程管理數據,而存儲過程在其調用者的權限內執行,而不能對表本身進行訪問。
例如,你可以在特定時間內禁止更新數據,或者使管理者只具有查詢工資數據的權利,而不能進行更新,或者記錄所有的訪問並通知某一安全機構。
原有應用程序與J2EE應用程序之間的數據邏輯共享
因為原有應用程序與J2EE應用程序都通過Call Spec調用存儲過程,所以J2EE和非J2EE應用程序可以共享相同的Oracle數據邏輯。由於有了Call Spec,所以不用考慮所用的是何種實現語言(無論是PL/SQL還是Java),該數據邏輯都可以共享。
為BMP實體Bean自動生成主關鍵字
在對EJB實體bean應用BMP時,一個bean實例可以由自動生成的與新插入的Oracle數據相關聯的主關鍵字惟一確定,它是ejbCreate()的返回值。可以利用一個插入相應數據的存儲過程在一個數據庫操作中檢索ejbCeater()中的該值,並檢索或計算主關鍵字。
作為另一種方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性,以一個SQL語句插入該數據並檢索相應的關鍵字(或ROWID)。但是,存儲過程方法在各個JDBC驅動器版本和數據庫之間更具可移植性。
可以用以下三個步驟實現這一模式:
創建一個Java存儲過程,在公共GenPk類中定義一個公共靜態Java方法insertAccount()。此方法將插入Oracle數據、計算惟一的關鍵字(通過發出一個序列號),並返回計算出的關鍵字作為主關鍵字。
定義Call Spec
- CREATE OR REPLACE PROCEDURE insertAccount
(owner IN varchar, bal IN number, newid OUT number)
AS LANGUAGE JAVA NAME ''GenPK.insertAccount( Java.lang.String [])''; /
在ejbCreate()內調用存儲過程
- Public AccountPK ejbCreate(String ownerName, int balance)
throws CreateException { try { CallableStatement call =
conn.prepareCall
{ "{call insertAccount(?, ?, ?)}"}; return new AccountPK(accountID); } }