Dans une base de données Oracle, quelles sont les différences entre les éléments suivants:
S'agit-il également de valeurs liées possibles à ce que «l'utilisateur actuel» est?
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.
Extrait du manuel sur: http://docs.Oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825
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.
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:
Identifiant de l'utilisateur de la base de données à la connexion.
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
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.
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