2009-12-10 32 views
12

El objetivo es enviar información adicional a desencadenantes como la identificación de usuario actual de una aplicación web. Dado que se utiliza un grupo de conexiones, y se utiliza la misma identificación de usuario para todas las conexiones, ¿cómo paso el ID de usuario web original para que se active? Esto necesito implementarlo sin tocar el código de la aplicación. Es una aplicación basada en Java.¿Cómo enviar parámetros arbitrarios a Oracle trigger?

John

Respuesta

1

Puede utilizar un paquete para realizar un seguimiento del usuario de la web:

create package web_user_pkg is 

    procedure set_username (p_username varchar2); 

    function username return varchar2; 

end; 

create package body web_user_pkg is 

    g_username varchar2(30); 

    procedure set_username (p_username varchar2) 
    is 
    begin 
     g_username := p_username; 
    end; 

    function username return varchar2 is 
    begin 
     return g_username; 
    end; 

end; 

En la página web web_user_pkg.set_username llamada con el ID del usuario actual antes de realizar cualquier LMD u otras llamadas de paquetes .

En el desencadenador use web_user_pkg.nombre de usuario para obtener el nombre de usuario web.

+0

Parece ser una buena solución. ¿Esta variable de paquete se comparte entre otras conexiones? –

+0

No, es exclusivo de la conexión. ¡La agrupación de conexiones sería inutilizable si diferentes usuarios finales estuvieran compartiendo el mismo estado de base de datos! –

+1

Solo para aclarar, si hay 10 sesiones de base de datos, entonces hay un máximo de 10 estados de base de datos concurrentes, incluso si tiene 50 usuarios finales de la aplicación. El objetivo de un grupo de conexiones es compartir esas sesiones de base de datos. La aplicación tomaría una conexión/sesión durante la duración de una transacción. No necesariamente usaría la misma conexión para una transacción posterior por el mismo usuario final de la aplicación. –

15

Puede usar la variable de sesión identificador_cliente para pasar un usuario de la aplicación a un activador.

Conjunto que después de conectarse a la base de datos de esta manera:

CALL dbms_session.set_identifier('<<username>>'); 

y recuperarlo en el interior del gatillo:

SELECT sys_context('USERENV','CLIENT_IDENTIFIER') INTO username FROM DUAL; 

Más información se puede encontrar en el Oracle docs

+0

+1 ¡Esta parece ser la forma "correcta" de hacerlo! –

+0

Esto funciona si solo necesita pasar uno de un puñado de atributos relativamente comunes al activador. El enfoque de Vincent de usar contextos, sin embargo, permite el paso de parámetros arbitrarios. –

+4

¡Gracias, me ayudó mucho cuando estaba atascado! Solo quiero mencionar que el uso de la palabra 'USUARIO' en letras mayúsculas en la primera línea de código es un poco confuso. Parece que debe tomarse literalmente, pero en realidad, es un sustituto de la ID de usuario del usuario de la aplicación que ha iniciado sesión y que desea enviar al desencadenador. Sin embargo, la segunda línea de código pretende ser literal, suponiendo que desee que 'nombre de usuario' sea la variable que contiene el ID de usuario del usuario de la aplicación que ha iniciado sesión. –

8

podría utilizar Oracle Contexts:

SQL> CREATE OR REPLACE PACKAGE test_pkg AS 
    2  PROCEDURE set_context(p_attribute VARCHAR2, p_value VARCHAR2); 
    3 END test_pkg; 
    4/

Package created 
SQL> CREATE OR REPLACE PACKAGE BODY test_pkg AS 
    2  PROCEDURE set_context(p_attribute VARCHAR2, p_value VARCHAR2) IS 
    3  BEGIN 
    4  dbms_session.set_context('test_ctx', p_attribute, p_value); 
    5  END; 
    6 END test_pkg; 
    7/

Package body created 

SQL> create context test_ctx using test_pkg; 

Context created 

SQL> exec test_pkg.set_context ('user_id', 'Vincent'); 

PL/SQL procedure successfully completed 

SQL> select sys_context('test_ctx', 'user_id') from dual; 

SYS_CONTEXT('TEST_CTX','USER_I 
-------------------------------------------------------------------------------- 
Vincent 
Cuestiones relacionadas