Quelle est la différence entre USER() et le contexte SYS('USERENV','CURRENT USER')?
dans une base de données Oracle, quelles sont les différences entre les suivantes:
- user ()
- sys_context ('USERENV', 'CURRENT_USER')
- sys_context ('USERENV','SESSION_USER')
Sont également possibles les valeurs liées à "l'utilisateur actuel"?
- sys_context ('USERENV', 'CURRENT_SCHEMA')
- sys_context ('USERENV','AUTHENTICATED_IDENTITY')
je suis spécifiquement intéressé par ce que l'on peut changer, ce qui peut les changer, ce que l'on ne peut pas changer de valeur, ce que l'on a des valeurs différentes basées sur le type de connexion, et ce que l'on(s) est(sont) toujours le schéma utilisé pour se connecter dans la base de données.
Dans la plupart de mes tests, les valeurs sont toujours les mêmes. La seule exception serait lors de l'exécution de ce qui suit pour modifier 'CURRENT_SCHEMA':
alter session set current_schema=<SCHEMA>
suivant génère une erreur:
alter session set current_user=<USER> --even as sys/system, which is good I suppose
Donc il y a une sorte de sécurité/règles autour de tout cela. Cependant, il doit y avoir une raison pour avoir un utilisateur de SESSION_ et un utilisateur de CURRENT_. Je suppose aussi que user () pourrait être un raccourci vers sys_context ("USERENV", "CURRENT_USER"), mais je n'ai pas trouvé de documentation à ce sujet.
3 réponses
du manuel à: http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825
CURRENT_USER
Le nom de l'utilisateur de 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 l'objet de droits de n'importe quel définisseur actif. Quand aucun objet de droits de definer n'est actif, CURRENT_USER retourne la même valeur que SESSION_USER. Lorsqu'elle est utilisée directement dans le corps d'une définition de la vue, renvoie l'utilisateur qui exécute le curseur qui utilise la vue; il ne respecte pas les vues utilisées dans le curseur comme étant des droits de definer.
SESSION_USER
le nom de l'utilisateur de la base de données à l'ouverture de session. 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 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 avouer que je ne sais pas ce que le terme "utilisateur" désigne bien.
Btw: il y en a un troisième:
SESSION_USERID
l'identifiant de L'utilisateur de base de données à l'ouverture de session.
sys_context('USERENV', 'CURRENT_SCHEMA')
- Le schéma qui est actuellement utilisé et comme vous l'avez déjà découvert peut être changé avec alter session
sys_context('USERENV', 'SESSION_USER')
- L'utilisateur qui a été utilisé pour l'authentification lors de la création de la session et ne peut pas être modifié
sys_context('USERENV', 'CURRENT_USER')
-un peu comme "session_user" dépréciée (au moins selon le 10g de documentation)
(modifié selon la réponse de @a_horse_with_no_name et la référence qu'il a donnée à 11g docs)
à partir de documentation:
- Kerberos authentifié par un utilisateur de l'entreprise: principal kerberos nom
- Kerberos-utilisateur externe authentifié: kerberos nom principal; même comme le nom du schéma
- utilisateur d'entreprise authentifié par SSL: le DN dans le l'utilisateur PKI certificat
- SSL-utilisateur externe authentifié: le DN dans le certificat ICP de l'utilisateur
- utilisateur d'entreprise authentifié par mot de passe: surnom; même que le nom de connexion
- 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
- OS-authentifié utilisateur externe: externe système d'exploitation nom de l'utilisateur
- Rayon/DCE-authentifié externe de l'utilisateur: le nom du schéma
- mandataire avec DN : Oracle Internet Directory DN of the client
- mandataire avec certificat: certificat de DN de la client
- mandataire avec nom d'utilisateur: nom d'utilisateur de la base de données si le client est un utilisateur local de la base de données; surnom si le client est un utilisateur d'entreprise.
- SYSDBA / SYSOPER using Password File: login name
- SYSDBA/SYSOPER l'aide d'authentification du système d'exploitation: système d'exploitation nom de l'utilisateur
user pseudo column
- je suis pas sûr, selon la documentation je pense que c'est 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 en spécifier le propriétaire. Par exemple, si mon CURRENT_SCHEMA
SCOTT
, puis SELECT * FROM EMP
est le même que SELECT * FROM SCOTT.EMP
. Par défaut, lorsque je me connecte pour la première fois à Oracle, le CURRENT_SCHEMA
est le même que CURRENT_USER.
Cependant, si je suis connecté en tant que SCOTT
, je ne peux émettre ALTER SESSION SET CURRENT_SCHEMA=JOE
et puis quand je fais SELECT * FROM EMP
, il est interprété comme JOE.EMP
plutôt que SCOTT.EMP
. Bien sûr, si je n'ai pas le SELECT
privilège sur JOE.EMP
, ou JOE
n'a pas d'objet nommé EMP
, le SELECT
échouera.