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.

10
demandé sur Andrew Martinez 2012-06-12 22:37:59

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.

14
répondu a_horse_with_no_name 2012-06-12 21:30:41

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

3
répondu A.B.Cade 2012-06-13 06:29:26

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_SCHEMASCOTT, 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.

0
répondu John Flack 2017-07-03 17:06:04