在 Oracle 開發與運維中,頻繁需要獲取當前會話的上下文信息(用戶、IP、終端、NLS 參數等)。Oracle 提供了兩個核心函數:USERENV(舊版)與 SYS_CONTEXT(推薦)。本文詳細列舉其用法與可獲取參數,並展示如何結合 V$SESSION 獲取更豐富信息(如客戶端程序)。
語法:USERENV('PARAMETER') 返回當前會話信息。
| 參數 | 說明 |
|---|---|
| ISDBA | 當前是否 DBA 角色(TRUE/FALSE) |
| LANGUAGE | 資料庫字符集 |
| SESSIONID | 當前會話標識符 |
| ENTRYID | 可審計會話標識符 |
| LANG | 會話語言 ISO 縮寫 |
| INSTANCE | 當前實例名 |
| TERMINAL | 當前計算機名 |
示例:SELECT USERENV('LANGUAGE') FROM DUAL;
語法: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;
通過 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 可打通「會話上下文」與「會話活動信息」,是排查性能、審計、安全的利器。