web-dev-qa-db-fra.com

Quelle est la différence entre USER () et SYS_CONTEXT ('USERENV', 'CURRENT_USER')?

Dans une base de données Oracle, quelles sont les différences entre les éléments suivants:

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

S'agit-il également de valeurs liées possibles à ce que «l'utilisateur actuel» est?

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

Je suis particulièrement intéressé par ceux qui peuvent changer, ce qui peut les changer, lesquels ne peuvent pas changer de valeur, lesquels ont des valeurs différentes en fonction du type de connexion et lesquels sont toujours le schéma utilisé pour se connecter au base de données.

Dans la plupart de mes tests, les valeurs sont toujours les mêmes. La seule exception serait lorsque vous exécutez ce qui suit pour modifier 'CURRENT_SCHEMA':

alter session set current_schema=<SCHEMA>

Ce qui suit entraîne une erreur:

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

Il y a donc une sorte de sécurité/règles autour de tout cela. Cependant, il doit y avoir une raison pour avoir un SESSION_USER et un CURRENT_USER. Je suppose aussi que user () pourrait être un raccourci vers sys_context ('USERENV', 'CURRENT_USER'), mais je n'ai trouvé aucune documentation à ce sujet.

12
Andrew Martinez

Extrait du manuel sur: http://docs.Oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825

UTILISATEUR ACTUEL

Nom de l'utilisateur de la base de données dont les privilèges sont actuellement actifs. Cela peut changer pendant la durée d'une session pour refléter le propriétaire de tout objet de droits du définisseur actif. Quand aucun objet de droits du définisseur n'est actif, CURRENT_USER renvoie la même valeur que SESSION_USER. Lorsqu'il est utilisé directement dans le corps d'une définition de vue, cela renvoie l'utilisateur qui exécute le curseur qui utilise la vue; il ne respecte pas les vues utilisées dans le curseur en tant que droits du défineur.

SESSION_USER

Nom de l'utilisateur de la base de données à la connexion. Pour les utilisateurs d'entreprise, renvoie le schéma. Pour les autres utilisateurs, renvoie le nom d'utilisateur de la base de données. Cette valeur reste la même pendant toute la durée de la session.

Donc, il y a est une différence entre SESSION_USER et CURRENT_USER, en particulier lorsque CURRENT_USER est utilisé dans une procédure ou une fonction stockée.

Je dois admettre que je ne sais pas ce que le terme "utilisateur d'entreprise" signifie bien.

Btw: il y en a un troisième: 

SESSION_USERID

Identifiant de l'utilisateur de la base de données à la connexion.

14

sys_context('USERENV', 'CURRENT_SCHEMA') - Le schéma actuellement utilisé et que vous avez déjà découvert peut être modifié avec alter session

sys_context('USERENV', 'SESSION_USER') - L'utilisateur utilisé pour l'authentification lors de la création de la session ne peut pas être modifié.

sys_context('USERENV', 'CURRENT_USER')Un peu comme "session_user"  obsolète (au moins selon la documentation 10g )
(édité en fonction de la réponse de @ a_horse_with_no_name et de la référence qu'il a donnée aux 11g docs )

sys_context('USERENV', 'AUTHENTICATED_IDENTITY') - L'identité utilisée pour l'authentification dépend de "AUTHENTICATION_METHOD".
de documentation :

  • Utilisateur d'entreprise authentifié par Kerberos: nom principal de Kerberos
  • Utilisateur externe authentifié par Kerberos: nom principal de Kerberos; même que le nom du schéma 
  • Utilisateur d'entreprise authentifié par SSL: le DN dans le certificat PKI de l'utilisateur
  • Utilisateur externe authentifié par SSL: le DN dans le certificat PKI de l'utilisateur
  • Utilisateur d'entreprise authentifié par mot de passe: Pseudonyme; identique à l'identifiant 
  • Utilisateur de base de données authentifié par mot de passe: Nom d'utilisateur de la base de données; identique au nom du schéma 
  • Utilisateur externe [.____. Authentifié par le système d'exploitation: nom d'utilisateur du système d'exploitation externe
  • Utilisateur externe authentifié par Radius/DCE: nom du schéma 
  • Proxy avec DN : DN du répertoire client Oracle Internet Directory 
  • Proxy avec certificat: DN du certificat du client 
  • Proxy avec nom d'utilisateur: nom d'utilisateur de la base de données Si le client est un utilisateur de la base de données locale; pseudo si le client est un utilisateur d'entreprise . 
  • SYSDBA/SYSOPER à l'aide du fichier de mot de passe: nom d'utilisateur
  • SYSDBA/SYSOPER utilisant l'authentification de système d'exploitation: nom d'utilisateur du système d'exploitation

user pseudo column - Je ne suis pas sûr, selon la documentation, que ce serait comme CURRENT_SCHEMA mais apparemment, c'est comme CURRENT_USER

3
A.B.Cade

CURRENT_SCHEMA est le schéma qui sera utilisé si vous nommez un objet sans spécifier son propriétaire. Par exemple, si mon CURRENT_SCHEMA est SCOTT, alors SELECT * FROM EMP est identique à SELECT * FROM SCOTT.EMP. Par défaut, lorsque je me connecte pour la première fois à Oracle, le CURRENT_SCHEMA est identique à CURRENT_USER. 

Cependant, si je suis connecté en tant que SCOTT, je peux émettre ALTER SESSION SET CURRENT_SCHEMA=JOE et ensuite, lorsque je crée SELECT * FROM EMP, il est interprété comme étant JOE.EMP plutôt que SCOTT.EMP. Bien sûr, si je n'ai pas le privilège SELECT sur JOE.EMP, ou si JOE n'a pas d'objet nommé EMP, la SELECT échouera.

0
John Flack

Il existe également une différence de performance entre USER et 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

Voir également https://svenweller.wordpress.com/2016/02/24/sequence-and-audit-columns-with-apex-5-and-12c/ et http://www.grassroots-Oracle.com/2019/01/Oracle-user-vs-sys-context.html

0
Scott