Als DBA steht man oft vor dem Problem der Rechtevergabe an die Benutzer. Zu viele Rechte stellen ein Sicherheitsrisiko dar, zu wenige verhindern möglicherweise das Abfragen wichtiger Daten. Damit normale Benutzer Informationen über die genutzte Instanz abfragen können, ohne dass ihnen Rechte an den nötigen v$-Views zugewiesen werden müssen, gibt es eine Funktion namens SYS_CONTEXT.
In diesem Tipp werden von rund 60 Parametern nur die nützlichsten kurz erläutert und die seit Version 12c neu hinzugefügten Parameter aufgezeigt. Diese Parameter sind sehr hilfreich z. B. bei der Erstellung von Automatismen über Skripte.
Mit der Funktion SYS_CONTEXT ist es möglich, Werte verschiedener Parameter der aktuellen Instanz abzufragen. Die Parameter sind verbunden mit einem bestimmten Namensraum. Oracle hat standardmäßig zwei Namensräume integriert, nämlich USERENV, der die aktuelle Session beschreibt, und SYS_SESSION_ROLES (verfügbar ab 11.2.0.4), der anzeigt, ob eine bestimmte Rolle für die aktuelle Session aktiv ist.
Ein Beispiel für eine Abfrage mit USERENV, ausgegeben wird der Name der Datenbank:
SQL> select sys_context ('USERENV', 'DB_NAME') from dual;
SYS_CONTEXT('USERENV','DB_NAME')
---------------------------------------------------------
o11g
Die folgende Abfrage zeigt mithilfe von SYS_SESSION_ROLES, ob der angemeldete Benutzer die DBA-Rolle innehat:
SQL> show user
USER ist "SCOTT"
SQL> select sys_context('SYS_SESSION_ROLES', 'DBA') from dual;
SYS_CONTEXT('SYS_SESSION_ROLES','DBA')
--------------------------------------------------------------
FALSE
SQL> conn sys/<pwd> as sysdba;
SQL> grant dba to scott;
SQL> conn scott/tiger
SQL> select sys_context('SYS_SESSION_ROLES', 'DBA') from dual;
SYS_CONTEXT('SYS_SESSION_ROLES','DBA')
--------------------------------------------------------------
TRUE
Nachfolgend eine Liste von Parametern für den Namensraum USERENV, die für Skripte wohl am gebräuchlichsten sind:
CURRENT_USERID: Die ID des Benutzers, dessen Rechte momentan aktiv sind.
DATABASE_ROLE: Die Rolle der Datenbank ist entweder PRIMARY, PHYSICAL STANDBY, LOGICAL STANDBY oder SNAPSHOT STANDBY.
DB_UNIQUE_NAME: Name der Datenbank, wie er im Initialisierungsparameter angegeben ist.
HOST: Gibt den Computernamen (mit Domäne) aus.
INSTANCE: Gibt die ID der Instanz aus, zu der die Session verbunden ist.
INSTANCE_NAME: Name der Instanz, zu der die Session verbunden ist.
NLS-Parameter
SERVER_HOST: Gibt den Hostnamen der Maschine aus, auf der die Instanz läuft.
SERVICE_NAME: Name des Dienstes, zu der eine Session verbunden ist.
TERMINAL: Gibt den Computernamen (ohne Domäne) aus.
Seit Version 12.1 gibt es drei neue Parameter:
CDB_NAME: Gibt den Namen der Container-Datenbank aus:
SQL> SELECT sys_context('USERENV', 'CDB_NAME') FROM dual;
SYS_CONTEXT('USERENV','CDB_NAME')
---------------------------------------------------------
o12c
CON_ID: Gibt den Identifier des Containers aus:
SQL> SELECT sys_context('USERENV', 'CON_ID') FROM dual;
SYS_CONTEXT('USERENV','CON_ID')
-------------------------------------------------------
3
CON_NAME: Gibt den Namen des Containers aus:
SQL> SELECT sys_context('USERENV', 'CON_NAME') FROM dual;
SYS_CONTEXT('USERENV','CON_NAME')
---------------------------------------------------------
PDB3
Die Funktion SYS_CONTEXT bietet den Vorteil, dass man immer die gleiche Syntax verwendet und lediglich die Parameter austauschen muss. Auch wenn es für manche Parameter Alternativen gibt, wie beispielsweise für den Parameter "SESSION_USER", der dieselbe Information wie die SQL-Abfrage "show USER" ausgibt, ist es leichter mit einer Syntax zu arbeiten, als sich viele Views zu merken, auf die man evtl. gar keine Rechte hat.
Sollten Sie Interesse an weiteren neuen Funktionen der Version 12c haben, so besuchen Sie doch unseren Kurs Oracle Neuerungen 12c!
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.