首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 獲取 Session 資訊的兩大核心函數:USERENV 與 SYS_CONTEXT 完整參考

     編輯:Oracle 教學

Oracle 獲取 Session 資訊的兩大核心函數:USERENV 與 SYS_CONTEXT

在 PL/SQL、觸發器、審計、應用上下文中,常需獲取當前會話的用戶、終端、IP、語言等資訊。Oracle 提供兩套機制:

一、USERENV (Legacy,仍支援)

語法:USERENV('parameter')

範例

SELECT USERENV('LANGUAGE') FROM DUAL;
-- AMERICAN_AMERICA.ZHS16GBK

二、SYS_CONTEXT (推薦,功能更強、可擴充)

語法:SYS_CONTEXT('namespace', 'parameter')

最常用命名空間為 USERENV,支援超過 50 種參數:

參數回傳值說明
ISDBATRUE/FALSE當前是否具備 DBA 角色 (SYSDBA/SYSOPER)
LANGUAGE字串資料庫字元集 (如 AMERICAN_AMERICA.ZHS16GBK)
SESSIONIDNUMBER當前會話 AUDSID (等同 V$SESSION.AUDSID)
ENTRYIDNUMBER可審計會話 ID
LANG字串ISO 語言縮寫 (如 US)
INSTANCENUMBER實例編號
TERMINAL字串客戶端機器名 (作業系統層面)

一鍵查詢所有常用參數

SELECT
  SYS_CONTEXT('USERENV','TERMINAL')        terminal,
  SYS_CONTEXT('USERENV','LANGUAGE')        language,
  SYS_CONTEXT('USERENV','SESSIONID')       sessionid,
  SYS_CONTEXT('USERENV','INSTANCE')        instance,
  SYS_CONTEXT('USERENV','ISDBA')           isdba,
  SYS_CONTEXT('USERENV','CURRENT_USER')    current_user,
  SYS_CONTEXT('USERENV','SESSION_USER')    session_user,
  SYS_CONTEXT('USERENV','PROXY_USER')      proxy_user,
  SYS_CONTEXT('USERENV','DB_NAME')         db_name,
  SYS_CONTEXT('USERENV','HOST')            host,
  SYS_CONTEXT('USERENV','OS_USER')         os_user,
  SYS_CONTEXT('USERENV','IP_ADDRESS')      ip_address,
  SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') auth_type
FROM DUAL;

三、進階應用:結合 V$SESSION 獲取完整會話畫像

SELECT s.sid, s.serial#, s.username, s.machine, s.program, s.module, s.action,
       s.logon_time, s.status, s.sql_id, s.prev_sql_id,
       ctx.ip_address, ctx.os_user, ctx.terminal, ctx.authentication_type
FROM   v$session s
JOIN (
  SELECT
    SYS_CONTEXT('USERENV','SESSIONID')       sessionid,
    SYS_CONTEXT('USERENV','IP_ADDRESS')      ip_address,
    SYS_CONTEXT('USERENV','OS_USER')         os_user,
    SYS_CONTEXT('USERENV','TERMINAL')        terminal,
    SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type
  FROM DUAL
) ctx ON s.audsid = ctx.sessionid
WHERE  s.sid = SYS_CONTEXT('USERENV','SID');  -- 當前會話

四、最佳實踐建議

  1. 統一使用 SYS_CONTEXT:功能超集、支援自訂命名空間 (CREATE CONTEXT)、效能優於 USERENV。
  2. 審計/安全觸發器:記錄 IP_ADDRESS, OS_USER, MODULE, ACTION (配合 DBMS_APPLICATION_INFO.SET_MODULE)。
  3. 應用上下文:建立自訂 Context 存放租戶 ID、權限標籤,實現 VPD (Virtual Private Database) 行級安全。
  4. 注意權限:SYS_CONTEXT('USERENV', ...) 需 EXECUTE ON SYS.DBMS_SESSION (PUBLIC 默認擁有)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數說明範例值
TERMINAL客戶端機器名DB_SERVER_01
LANGUAGE語言/地區/字元集AMERICAN_AMERICA.AL32UTF8
SESSIONID會話 AUDSID123456
INSTANCE實例編號1
ENTRYID審計條目 ID7890
ISDBA是否 DBA 角色TRUE
NLS_TERRITORY地區設定AMERICA
NLS_CURRENCY貨幣符號$
CURRENT_USER當前生效用戶 (Definer's Rights 為擁有者)SCOTT
CURRENT_USERID當前用戶 ID45
SESSION_USER登入用戶 (Invoker)APP_USER
PROXY_USER代理用戶 (若為 Proxy 連線)APP_PROXY
DB_NAME資料庫名稱ORCL
HOST資料庫主機名db01
OS_USER作業系統用戶oracle
IP_ADDRESS客戶端 IP192.168.1.100
AUTHENTICATION_TYPE認證方式PASSWORD / KERBEROS / SSL
FG_JOB_ID前景作業 ID (DBMS_JOB)123