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