Application Context是記憶體中的一組name-value對,application context從屬於某個命名空間(namespace)。
使用者只能通過一個自訂procedure調用dbms_session.set_context來設定application context的值。使用者使用sys_context(<namespace>,<name>)來擷取某個application context的值。
Application context分為三種
- dabase session-based application context,又稱為local application context。
- global application context
- client session-based application context。通常被OCI使用,儲存在用戶端記憶體,而不是Oracle伺服器端,也由OCI程式管理。
Local application context儲存在UGA中,dedicated server mode, UGA在PGA中,shared server mode,UGA在SGA中。local application context是會話/server process層級的。只有本會話能夠訪問。當會話/server process終止時,local application context的生命週期也結束了。另一篇部落格Oracle VPD http://blog.csdn.net/chncaesar/article/details/18550029 給出了一個local application context的例子。
Global application context儲存在SGA中,只要SGA不消亡,global application context就一直存在。global application context常常用於跨會話,與會話無關的情境。dbms_session.set_context有兩個預設值為NULL的參數:
username = null , client_id=null。所有使用者都能訪問。
username = null, client_id=<client_id>。 只要session 的client_id =<client_id>,而不管username,都能訪問。
username = <database username>, client_id=null。只要session使用指定的oracle schema登陸,不管client_id,都能訪問。
username = <database username>, client_id=<client_id>. 常用於statless web session ,如http。
username = <non-database username>, client_id=<client_id> . 該username將用於資料庫連接池的owner。
例子1: 所有使用者都能訪問的application context
CREATE OR REPLACE CONTEXT global_hr_ctx USING hr_ctx_pkg ACCESSED GLOBALLY;
CREATE OR REPLACE PACKAGE hr_ctx_pkg
AS
PROCEDURE set_hr_ctx(sec_level IN VARCHAR2);
PROCEDURE clear_hr_context;
END;
/
CREATE OR REPLACE PACKAGE BODY hr_ctx_pkg
AS
PROCEDURE set_hr_ctx(sec_level IN VARCHAR2)
AS
BEGIN
DBMS_SESSION.SET_CONTEXT(
<strong> namespace => 'global_hr_ctx',
attribute => 'job_role',
value => sec_level);</strong>
END set_hr_ctx;
PROCEDURE clear_hr_context
AS
BEGIN
DBMS_SESSION.CLEAR_CONTEXT('global_hr_ctx', 'job_role');
END clear_context;
END;
/
例子2: 跨session/application,但是使用同一個資料庫schema的application context。
CREATE OR REPLACE PACKAGE hr_ctx_pkg
AS
PROCEDURE set_hr_ctx(sec_level IN VARCHAR2, user_name IN VARCHAR2);
PROCEDURE clear_hr_context;
END;
/
CREATE OR REPLACE PACKAGE BODY hr_ctx_pkg
AS
PROCEDURE set_hr_ctx(sec_level IN VARCHAR2, user_name IN VARCHAR2)
AS
BEGIN
DBMS_SESSION.SET_CONTEXT(
namespace => 'global_hr_ctx',
attribute => 'job_role',
value => sec_level,
<strong> username => user_name);</strong>
END set_hr_ctx;
PROCEDURE clear_hr_context
AS
BEGIN
DBMS_SESSION.CLEAR_CONTEXT('global_hr_ctx');
END clear_context;
END;
/
兩個例子都提供了clear_hr_context 預存程序。這是因為global application context常駐SGA,需要使用者使用完畢就清理,以免資訊泄露。
USERENV
USERENV是Oracle預定義的命名空間。它包含了許多常用的application context。
- CURRENT_USER
- DB_NAME
- HOST: 用戶端機器名
- CLIENT_INFO: 用戶端程式用作計數,標識符等
其他application context請參考SQL Language Reference。
VMware+Linux+Oracle 10G RAC全程詳細圖解
在CentOS 6.4下安裝Oracle 11gR2(x64)
Oracle 11gR2 在VMWare虛擬機器中安裝步驟
Debian 下 安裝 Oracle 11g XE R2
Oracle 11gR2 在VMWare虛擬機器中安裝步驟