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

Oracle 會話信息獲取利器:USERENV 與 SYS_CONTEXT 詳解

     編輯:Oracle 資料庫基礎

前言

在 Oracle 開發與運維中,頻繁需要獲取當前會話的上下文信息(用戶、IP、終端、NLS 參數等)。Oracle 提供了兩個核心函數:USERENV(舊版)與 SYS_CONTEXT(推薦)。本文詳細列舉其用法與可獲取參數,並展示如何結合 V$SESSION 獲取更豐富信息(如客戶端程序)。

1. USERENV 函數(舊式語法)

語法:USERENV('PARAMETER') 返回當前會話信息。

參數說明
ISDBA當前是否 DBA 角色(TRUE/FALSE)
LANGUAGE資料庫字符集
SESSIONID當前會話標識符
ENTRYID可審計會話標識符
LANG會話語言 ISO 縮寫
INSTANCE當前實例名
TERMINAL當前計算機名

示例:SELECT USERENV('LANGUAGE') FROM DUAL;

2. SYS_CONTEXT 函數(標準、功能更強)

語法:SYS_CONTEXT('NAMESPACE', 'PARAMETER'),常用命名空間為 USERENV。

SELECT
  SYS_CONTEXT('USERENV','TERMINAL')        terminal,
  SYS_CONTEXT('USERENV','LANGUAGE')        language,
  SYS_CONTEXT('USERENV','SESSIONID')       sessionid,
  SYS_CONTEXT('USERENV','INSTANCE')        instance,
  SYS_CONTEXT('USERENV','ENTRYID')         entryid,
  SYS_CONTEXT('USERENV','ISDBA')           isdba,
  SYS_CONTEXT('USERENV','NLS_TERRITORY')   nls_territory,
  SYS_CONTEXT('USERENV','NLS_CURRENCY')    nls_currency,
  SYS_CONTEXT('USERENV','NLS_CALENDAR')    nls_calendar,
  SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
  SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
  SYS_CONTEXT('USERENV','NLS_SORT')        nls_sort,
  SYS_CONTEXT('USERENV','CURRENT_USER')    current_user,
  SYS_CONTEXT('USERENV','CURRENT_USERID')  current_userid,
  SYS_CONTEXT('USERENV','SESSION_USER')    session_user,
  SYS_CONTEXT('USERENV','SESSION_USERID')  session_userid,
  SYS_CONTEXT('USERENV','PROXY_USER')      proxy_user,
  SYS_CONTEXT('USERENV','PROXY_USERID')    proxy_userid,
  SYS_CONTEXT('USERENV','DB_DOMAIN')       db_domain,
  SYS_CONTEXT('USERENV','DB_NAME')         db_name,
  SYS_CONTEXT('USERENV','HOST')            host,
  SYS_CONTEXT('USERENV','OS_USER')         os_user,
  SYS_CONTEXT('USERENV','EXTERNAL_NAME')   external_name,
  SYS_CONTEXT('USERENV','IP_ADDRESS')      ip_address,
  SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
  SYS_CONTEXT('USERENV','BG_JOB_ID')       bg_job_id,
  SYS_CONTEXT('USERENV','FG_JOB_ID')       fg_job_id,
  SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
  SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
FROM dual;

3. 進階:結合 V$SESSION 獲取客戶端程序等信息

通過 AUDSID = SESSIONID 關聯,可獲得 PROGRAM、MODULE、ACTION、CLIENT_INFO 等 V$SESSION 專有欄位,從而知曉具體是哪個應用程序(如 JDBC、PL/SQL Developer)發起的連接。

SELECT se.*, base.*
FROM v$session se,
     (SELECT
        SYS_CONTEXT('USERENV','TERMINAL') terminal,
        SYS_CONTEXT('USERENV','LANGUAGE') language,
        SYS_CONTEXT('USERENV','SESSIONID') sessionid,
        SYS_CONTEXT('USERENV','INSTANCE') instance,
        SYS_CONTEXT('USERENV','ENTRYID') entryid,
        SYS_CONTEXT('USERENV','ISDBA') isdba,
        -- 其餘參數略
        SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
      FROM dual) base
WHERE se.AUDSID = base.sessionid;

總結

  • USERENV 為舊版兼容,功能有限;
  • SYS_CONTEXT('USERENV', ...) 是標準做法,參數豐富,含 NLS、認證、代理用戶、網絡等;
  • 結合 V$SESSION 可打通「會話上下文」與「會話活動信息」,是排查性能、審計、安全的利器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved