Saltar al contenido

¿Cuál es la diferencia entre USER() y SYS_CONTEXT(‘USERENV’,’CURRENT_USER’)?

Te doy la bienvenida a nuestro espacio, ahora encontrarás la respuesta de lo que buscas.

Solución:

Del manual en: http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825

USUARIO ACTUAL

El nombre del usuario de la base de datos cuyos privilegios están actualmente activos. Esto puede cambiar durante la duración de una sesión para reflejar el propietario de cualquier objeto de derechos del definidor activo. Cuando ningún objeto de derechos del definidor está activo, CURRENT_USER devuelve el mismo valor que SESSION_USER. Cuando se usa directamente en el cuerpo de una definición de vista, devuelve el usuario que está ejecutando el cursor que está usando la vista; no respeta las vistas utilizadas en el cursor como derechos del definidor.

SESIÓN_USUARIO

El nombre del usuario de la base de datos en el inicio de sesión. Para usuarios empresariales, devuelve el esquema. Para otros usuarios, devuelve el nombre de usuario de la base de datos. Este valor permanece igual durante toda la duración de la sesión.

Por lo tanto, allí es una diferencia entre SESSION_USER y CURRENT_USER, especialmente cuando CURRENT_USER se usa en un procedimiento o función almacenados.

Sin embargo, debo admitir que no sé qué significa el término “usuario empresarial”.

Por cierto: hay una tercera:

SESIÓN_IDUSUARIO

El identificador del usuario de la base de datos en el inicio de sesión.

sys_context('USERENV', 'CURRENT_SCHEMA') – El esquema que se está utilizando actualmente y, como ya descubrió, se puede cambiar con alter session

sys_context('USERENV', 'SESSION_USER') – El usuario que se utilizó para la autenticación durante la creación de la sesión y no se puede cambiar

sys_context('USERENV', 'CURRENT_USER')Más o menos como “session_user” obsoleto (al menos según la documentación de 10g)
(editado de acuerdo con la respuesta de @a_horse_with_no_name y la referencia que dio a los documentos 11g)

sys_context('USERENV', 'AUTHENTICATED_IDENTITY') – La identidad utilizada para la autenticación depende del “MÉTODO DE AUTENTICACIÓN”.
de la documentación:

  • Usuario de empresa autenticado por Kerberos: nombre principal de Kerberos
  • Usuario externo autenticado por Kerberos: nombre principal de Kerberos; igual que el nombre del esquema
  • Usuario empresarial autenticado mediante SSL: el DN en el certificado PKI del usuario
  • Usuario externo autenticado mediante SSL: el DN en el certificado PKI del usuario
  • Usuario de empresa autenticado con contraseña: apodo; igual que el nombre de inicio de sesión
  • Usuario de la base de datos autenticado con contraseña: el nombre de usuario de la base de datos; igual que el nombre del esquema
  • Usuario externo autenticado por el sistema operativo: el nombre de usuario del sistema operativo externo
  • Usuario externo autenticado por Radius/DCE: el nombre del esquema
  • Proxy con DN: Oracle Internet Directory DN del cliente
  • Proxy con certificado: certificado DN del cliente
  • Proxy con nombre de usuario: nombre de usuario de la base de datos si el cliente es un usuario de la base de datos local; apodo si el cliente es un usuario empresarial.
  • SYSDBA/SYSOPER utilizando el archivo de contraseña: nombre de inicio de sesión
  • SYSDBA/SYSOPER usando la autenticación del sistema operativo: nombre de usuario del sistema operativo

user pseudo column – No estoy seguro, según la documentación creo que es como CURRENT_SCHEMA pero aparentemente es como CURRENT_USER

Hay una nota importante a tener en cuenta al usar el USER función de PL/SQL. Como he documentado en esta publicación de blog, STANDARD.USER() se implementa de la siguiente manera:

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

Entonces, delega en evaluar user en el motor SQL, lo que conduce a un cambio de contexto oculto de PL/SQL a SQL. Si lo hace con demasiada frecuencia, por ejemplo, desde dentro de un disparador, eso puede resultar bastante dañino en un sistema de producción. Trate de evitar llamar USER() de PL/SQL, y use sys_context('USERENV', 'SESSION_USER') en lugar de.

Si sostienes algún titubeo y forma de renovar nuestro escrito puedes realizar un exégesis y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *