Blog Name
  • Februar 2019

Session Informationen mit SYS_CONTEXT

Wie erhält man schnell und einfach mit SQL Hilfsmittel Informationen über die aktuelle Datenbank Session? Gemeint sind damit nicht nur die Informationen zur Datenbankversion selbst, die man einfach mit V$VERSION abfragen kann, sondern beispielsweise Informationen zum User selbst, zur Connection, zu den NLS Einstellungen - ohne sich mit den Data Dictionary Views oder den Kommandos der Linemode Werkzeugen auszukennen.

Die einfache Antwort darauf lautet mit der Funktion SYS_CONTEXT. Möchte man beispielsweise Informationen zur Datenbank (wie Name der CDB oder PDB) oder zur Session des Users selbst bekommen, ist SYS_CONTEXT das Mittel der Wahl. Eigentlich ist SYS_CONTEXT im Zusammenhang mit dem Application Context Feature eingeführt worden, liefert aber schon in ganz einfachen Fällen out-of-the-box hilfreiche Informationen.

Die Verwendung der Funktion SYS_CONTEXT folgt dabei folgender Syntax:

SYS_CONTEXT('USERENV', parameter2) .

Der erste Parameter USERENV (kurz für USER ENVironment) gibt einen festgelegten internen Namespace an. Er zeigt an, dass man Informationen zur Sessionumgebung ausgeben möchte. Der zweite Parameter (hier parameter2) legt dann fest, um welche Sessioneigenschaft es sich handeln soll. Im Handbuch in der Tabelle Table 7-11 Predefined Parameters of Namespace USERENV finden sich die vordefinierten Parameter, die man verwenden kann.

Folgende Beispiele sollen ein paar typische Anwendungsfälle demonstrieren. Im ersten Fall möchten wir Informationen zu der Datenbank Umgebung erhalten. Da wir uns in einer Multitenant Datenbank befinden, geht es um den Namen der Container Datenbank (hier CDB_NAME) und den Namen der Pluggable Database (hier CON_NAME), mit der wir gerade verbunden sind. Ist man mit einer NON CDB verbunden, reicht die Abfrage mit dem Parameterwert DB_NAME aus.

SQL> --- Verbindung mit ROOT Container
SQL> select sys_context('USERENV','CDB_NAME') CDB, sys_context('USERENV','CON_NAME') PDB, sys_context('USERENV','DB_NAME') dbname 
     from dual;

CDB                  PDB                  DBNAME
-------------------- -------------------- --------------------
BY                   CDB$ROOT             BY

SQL>-- Wechsel in pluggable database PDB1 - zum Beispiel als User SCOTT
SQL>
SQL> select sys_context('USERENV','CDB_NAME') CDB, sys_context('USERENV','CON_NAME') PDB, sys_context('USERENV','DB_NAME') dbname 
     from dual;

CDB                  PDB                  DBNAME
-------------------- -------------------- --------------------
BY                   PDB1                 PDB1

Nun wollen wir Informationen zu den NLS Einstellungen der Datenbank erhalten. Folgende Abfrage gibt Informationen zur Sortierung, zu Territory und Language Einstellungen.

SQL> select sys_context('USERENV','NLS_SORT') sort, sys_context('USERENV','NLS_TERRITORY') terr, sys_context('USERENV','LANGUAGE') lang 
     from dual;

SORT            TERR                 LANG
--------------- -------------------- ----------------------------------------
BINARY          AMERICA              AMERICAN_AMERICA.AL32UTF8

Und natürlich benötigen wir auch die Informationen zum User selbst. Welches ist der Session User und das Current Schema, das vielleicht mit ALTER SESSION geändert worden ist? Besitzt man vielleicht sogar DBA Rechte? Geprüft werden dabei allerdings nur die SYSDBA Privilegien; es wird nicht abgfragt, ob die Rolle DBA gegranted worden ist.

SQL> col sess_user format a20
SQL> col curr_schema format a20
SQL> col isdba format a10
SQL> select sys_context('USERENV', 'SESSION_USER') sess_user, sys_context('USERENV','CURRENT_SCHEMA') curr_schema, sys_context('USERENV','ISDBA') isdba 
     from dual;

SESS_USER            CURR_USER            ISDBA
-------------------- -------------------- --------------------
SCOTT                SYSTEM               TRUE

SQL> connect  sys@pdb1 as sysdba
Enter password:
Connected.

SQL> select sys_context('USERENV', 'SESSION_USER') sess_user, sys_context('USERENV','CURRENT_SCHEMA') curr_schema, sys_context('USERENV','ISDBA') isdba
     from dual;

SESS_USER            CURR_SCHEMA          ISDBA
-------------------- -------------------- ----------
SYS                  SYS                  TRUE

SQL> select sys_context('USERENV', 'SESSION_USER') sess_user, sys_context('USERENV','CURRENT_SCHEMA') curr_schema, sys_context('USERENV','ISDBA') isdba
     from dual;

SESS_USER            CURR_SCHEMA          ISDBA
-------------------- -------------------- ----------
SYS                  SYS                  TRUE

Wird ein Proxy User verwendet, kann man diese Informationen natürlich auch erhalten.

SQL> select sys_context('USERENV','PROXY_USER') PROXY_USER, sys_context('USERENV','SESSION_USER') SESSION_USER 
     from dual;

PROXY_USER           SESSION_USER
-------------------- --------------------
NSIBBING             SCOTT

Zum Schluss mag es vielleicht auch von Interesse sein, mit welchem Servicenamen und welchem Client Programm man verbunden ist.

SQL> select sys_context('USERENV','CLIENT_PROGRAM_name') programm,  sys_context('USERENV','SERVICE_NAME') service
     from dual;

PROGRAMM                       SERVICE                                      
------------------------------ --------------------------------------------- 
sqlplus@by (TNS V1-V3)         pdb1.sub01031029250.us1.oraclevcn.com        

Auch im Zusammenhang mit Unified Auditing, eingeführt mit Oracle Database 12c, gibt es die Möglichkeit SYS_CONTEXT zu verwenden. Die folgende Anweisung beispielsweise weist die Datenbank an, die Werte der Attribute CURRENT_USER und DB_NAME in alle Audit-Datensätze des Benutzers SCOTT mitaufzunehmen.

SQL> audit context namespace userenv attributes current_user, db_name
     by scott;

Die Einstellungen lassen sich dabei über folgende View verifizieren.

SQL> col namespace format a20
SQL> col attribute format a20
SQL> col user_name format a20;
SQL> select namespace, attribute, user_name 
     from audit_unified_contexts;

NAMESPACE            ATTRIBUTE            USER_NAME
-------------------- -------------------- --------------------
USERENV              CURRENT_USER         SCOTT
USERENV              DB_NAME              SCOTT

Eine Auswertung der Tabelle UNIFIED_AUDIT_TRAIL zeigt dann folgende zusätzliche Informationen in der Spalte APPLICATION_CONTEXTS.

set linesize window
col APPLICATION_CONTEXTS format a60
col EVENT_TIMESTAMP format a30
col ACTION_NAME format a20

SQL> select event_timestamp, application_contexts, action_name 
     from unified_audit_trail order by EVENT_TIMESTAMP;

EVENT_TIMESTAMP                APPLICATION_CONTEXTS                                         ACTION_NAME
------------------------------ ------------------------------------------------------------ --------------------
...
01-FEB-19 01.38.06.783529 PM                                                                AUDIT
01-FEB-19 01.38.06.840841 PM                                                                AUDIT
01-FEB-19 01.41.02.688237 PM                                                                LOGON
01-FEB-19 01.42.44.255281 PM   (USERENV,CURRENT_USER=SCOTT); (USERENV,DB_NAME=PDB1)         ALTER USER

Weitere Informationen

 

Zurück zur Community-Seite
 

Visit the Oracle Blog

 

Contact Us

Oracle

Integrated Cloud Applications & Platform Services