it-swarm.com.de

Was ist der Unterschied zwischen USER () und SYS_CONTEXT ('USERENV', 'CURRENT_USER')?

Welche Unterschiede bestehen in einer Oracle-Datenbank zwischen den folgenden Elementen:

  • nutzer()
  • sys_context ('USERENV', 'CURRENT_USER')
  • sys_context ('USERENV', 'SESSION_USER')

Sind diese möglichen Werte auch auf den aktuellen Benutzer bezogen?

  • sys_context ('USERENV', 'CURRENT_SCHEMA')
  • sys_context ('USERENV', 'AUTHENTICATED_IDENTITY')

Ich interessiere mich speziell dafür, welche sich ändern können, was sie ändern können, welche sich nicht ändern können, welche je nach Verbindungstyp unterschiedliche Werte haben und welche (n) immer das Schema ist (sind), das zur Anmeldung beim verwendet wird Datenbank.

In den meisten meiner Tests sind die Werte immer gleich. Die einzige Ausnahme wäre, wenn Folgendes ausgeführt wird, um 'CURRENT_SCHEMA' zu ändern:

alter session set current_schema=<SCHEMA>

Wenn Sie Folgendes tun, tritt ein Fehler auf:

alter session set current_user=<USER> --even as sys/system, which is good I suppose

Es gibt also eine Art Sicherheit/Regeln für all das. Es muss jedoch einen Grund dafür geben, einen SESSION_USER und einen CURRENT_USER zu haben. Ich vermute auch, dass user () eine Verknüpfung zu sys_context ('USERENV', 'CURRENT_USER') sein könnte, aber ich konnte keine Dokumentation zu diesem Thema finden.

12
Andrew Martinez

Aus dem Handbuch unter: http://docs.Oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825

CURRENT_USER

Der Name des Datenbankbenutzers, dessen Berechtigungen derzeit aktiv sind. Dies kann sich während der Dauer einer Sitzung ändern, um den Eigentümer des Rechteobjekts eines aktiven Definierers anzuzeigen. Wenn kein Rechteobjekt des Definierers aktiv ist, gibt CURRENT_USER denselben Wert zurück wie SESSION_USER. Bei direkter Verwendung im Hauptteil einer Sichtdefinition wird der Benutzer zurückgegeben, der den Cursor ausführt, der die Sicht verwendet. Ansichten, die im Cursor verwendet werden, gelten nicht als Rechte des Definierers.

SESSION_USER

Der Name des Datenbankbenutzers bei der Anmeldung. Gibt für Unternehmensbenutzer das Schema zurück. Gibt für andere Benutzer den Datenbankbenutzernamen zurück. Dieser Wert bleibt während der gesamten Sitzung gleich.

Also ist ist ein Unterschied zwischen SESSION_USER und CURRENT_USER, insbesondere wenn CURRENT_USER in einer gespeicherten Prozedur oder Funktion verwendet wird.

Ich muss zugeben, dass ich nicht weiß, was der Begriff "Enterprise User" bedeutet.

Übrigens: Es gibt einen dritten: 

SESSION_USERID

Die Kennung des Datenbankbenutzers bei der Anmeldung.

14

sys_context('USERENV', 'CURRENT_SCHEMA') - Das Schema, das gerade verwendet wird und wie Sie bereits herausgefunden haben, kann mit alter session geändert werden.

sys_context('USERENV', 'SESSION_USER') - Der Benutzer, der während der Erstellung der Sitzung zur Authentifizierung verwendet wurde und nicht geändert werden kann

sys_context('USERENV', 'CURRENT_USER')Ziemlich ähnlich wie "session_user"  veraltet (zumindest laut 10g Dokumentation )
(bearbeitet gemäß der Antwort von @ a_horse_with_no_name und der Referenz, die er an die 11g docs gab)

sys_context('USERENV', 'AUTHENTICATED_IDENTITY') - Die für die Authentifizierung verwendete Identität hängt von "AUTHENTICATION_METHOD" ab.
aus Dokumentation :

  • Von Kerberos authentifizierter Unternehmensbenutzer: Kerberos-Principal-Name
  • Von Kerberos authentifizierter externer Benutzer: Kerberos-Principal-Name; das gleiche wie der Schemaname 
  • SSL-authentifizierter Unternehmensbenutzer: der DN im PKI-Zertifikat des Benutzers
  • SSL-authentifizierter externer Benutzer: der DN im PKI-Zertifikat des Benutzers
  • Passwort-authentifizierter Enterprise-Benutzer: Spitzname; das gleiche wie der Login-Name 
  • Kennwort-authentifizierter Datenbankbenutzer: Der Datenbankbenutzername; das gleiche wie der Schemaname 
  • Vom Betriebssystem authentifizierter Externer Benutzer: Benutzername des externen Betriebssystems
  • Radius/DCE-authentifizierter externer Benutzer: Der Schemaname 
  • Proxy mit DN : Oracle Internet Directory-DN des Clients 
  • Proxy mit Zertifikat: Zertifikat-DN des Clients 
  • Proxy mit Benutzername: Datenbankbenutzername , Wenn der Client ein lokaler Datenbankbenutzer ist; Kurzname, wenn der Client ein Unternehmensbenutzer ist. 
  • SYSDBA/SYSOPER mit Kennwortdatei: Anmeldename
  • SYSDBA/SYSOPER mit Betriebssystemauthentifizierung: Benutzername des Betriebssystems

user pseudo column - Ich bin nicht sicher, laut Dokumentation würde ich denken, dass es wie CURRENT_SCHEMA ist, aber anscheinend ist es wie CURRENT_USER

3
A.B.Cade

Bei der Verwendung der Funktion USER in PL/SQL ist ein wichtiger Hinweis zu beachten. Wie ich in diesem Blogbeitrag dokumentiert habe, ist STANDARD.USER() wie folgt implementiert:

function USER return varchar2 is
c varchar2(255);
begin
    select user into c from sys.dual;
    return c;
end;

Daher wird die Auswertung von user in der SQL-Steuerkomponente delegiert, was zu einem versteckten Kontextwechsel von PL/SQL zu SQL führt. Wenn Sie das zu oft tun, z. Innerhalb eines Triggers kann sich das als ziemlich verletzend in einem Produktionssystem herausstellen. Versuchen Sie, den Aufruf von USER() aus PL/SQL zu vermeiden, und verwenden Sie stattdessen sys_context('USERENV', 'SESSION_USER').

1
Lukas Eder

CURRENT_SCHEMA ist das Schema, das angenommen wird, wenn Sie ein Objekt benennen, ohne seinen Besitzer anzugeben. Wenn beispielsweise mein CURRENT_SCHEMASCOTT ist, ist SELECT * FROM EMP dasselbe wie SELECT * FROM SCOTT.EMP. Wenn ich zum ersten Mal eine Verbindung zu Oracle herstelle, ist CURRENT_SCHEMA derselbe wie CURRENT_USER. 

Wenn ich jedoch als SCOTT verbunden bin, kann ich ALTER SESSION SET CURRENT_SCHEMA=JOE ausgeben, und wenn ich SELECT * FROM EMP tue, wird dies als JOE.EMP und nicht als SCOTT.EMP interpretiert. Wenn ich nicht das Privileg SELECT für JOE.EMP habe oder JOE kein Objekt mit dem Namen EMP hat, schlägt die SELECT fehl.

0
John Flack

Es gibt auch einen Leistungsunterschied zwischen USER und der Verwendung von sys_context

declare 
  v_result varchar2(100);
begin
  for i in 1..1000000 loop
  v_result := sys_context('userenv','session_user');
  end loop;
end;
/

-- 2.5s

declare 
  v_result varchar2(100);
begin
  for i in 1..1000000 loop
  v_result := user;
  end loop;
end;
/ 

-- 47s

Siehe auch https://svenweller.wordpress.com/2016/02/24/sequence-and-audit-columns-mit-apex-5-and-12c/ und http://www.grassroots-Oracle.com/2019/01/Oracle-user-vs-sys-context.html

0
Scott