首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 9i SYS_CONTEXT 與 After Logon 觸發器:建立應用程式上下文實現高效安全會話管理

     編輯:Oracle 資料庫相關知識

從 USERENV 到 SYS_CONTEXT

USERENV 函數回傳會話資訊(用戶 ID、語言、DBA 權限等),Oracle 8i 引入 SYS_CONTEXT 取代並增強:不僅回傳 USERENV 資料,更能回傳應用程式自訂資料值。

應用程式上下文

包含一組名稱(屬性)與對應值,可被 SYS_CONTEXT 存取。例:人事應用回傳用戶部門號:

v_dept := SYS_CONTEXT('HR_CONTEXT', 'DEPT');

Oracle 9i 新特性:After Logon 觸發器自動初始化

用戶成功登入後觸發,在指定套件執行預存程序查詢資料,透過 DBMS_SESSION.SET_CONTEXT 寫入上下文。

三大優勢

  1. 效能優:上下文資料駐留 SGA,避免重複磁碟讀取
  2. 安全性高:單一 PL/SQL 物件(通常為套件)控制上下文變更/清除,After Logon 觸發器執行該套件
  3. 彈性大:可建立任意上下文,每上下文含無限屬性-值對

完整實作範例

1. 安全套件 HR_CONTEXT_PKG:查詢當前用戶會話關聯部門,初始化 HR_CONTEXT。

2. 建立命名空間關聯套件:

CREATE CONTEXT hr_context USING HR.HR_CONTEXT_PKG;

3. 登入觸發器:

CREATE OR REPLACE TRIGGER dbt_logon
AFTER LOGON ON DATABASE
BEGIN
  HR.HR_CONTEXT_PKG.INITIALIZE_HR_CONTEXT;
EXCEPTION
  WHEN OTHERS THEN NULL;
END;

定位部門失敗時不阻擋登入(無部門用戶仍可登入)。

應用端調用

SELECT SYS_CONTEXT('HR_CONTEXT', 'DEPT') FROM DUAL;

即時回傳當前用戶部門 ID,無需多次邏輯讀查表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved