SYS_CONTEXT('namespace','attribute') 不僅能讀取舊有 USERENV 參數(Session ID、語言、DBA 權限等),更支援應用自訂屬性(如部門號、角色、租戶 ID),且資料儲於 SGA,避免重複查表,效能與安全性雙贏。
CREATE OR REPLACE PACKAGE hr_context_pkg AS
PROCEDURE initialize_hr_context;
END hr_context_pkg;
/
CREATE OR REPLACE PACKAGE BODY hr_context_pkg AS
PROCEDURE initialize_hr_context IS
v_dept NUMBER;
BEGIN
-- 依當前用戶查詢所屬部門
SELECT department_id INTO v_dept
FROM employees WHERE employee_id = SYS_CONTEXT('USERENV','SESSION_USER');
-- 寫入應用上下文
DBMS_SESSION.SET_CONTEXT('HR_CONTEXT','DEPT',v_dept);
EXCEPTION WHEN OTHERS THEN NULL; -- 防止登入失敗
END;
END hr_context_pkg;
/
CREATE CONTEXT hr_context USING hr.hr_context_pkg;
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;