2009-12-10 9 views
12

Le but est d'envoyer des informations supplémentaires aux déclencheurs tels que l'ID utilisateur actuel d'une application Web. Étant donné qu'un pool de connexions est utilisé et que le même identifiant utilisateur est utilisé pour toutes les connexions, comment puis-je transmettre l'identifiant d'utilisateur Web initial à déclencher? Je dois l'implémenter sans toucher au code de l'application. C'est une application basée sur Java.Comment envoyer des paramètres arbitraires au déclencheur Oracle?

John

Répondre

1

Vous pouvez utiliser un paquet pour garder la trace de l'utilisateur 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; 

Dans la page Web appel web_user_pkg.set_username avec l'ID de l'utilisateur actuel avant d'effectuer une DML ou d'autres appels de paquet .

Dans le déclencheur, utilisez web_user_pkg.username pour obtenir le nom d'utilisateur Web.

+0

Semble être une bonne solution. Cette variable de package est-elle partagée entre d'autres connexions? –

+0

Non, c'est unique à la connexion. Le regroupement de connexions serait inutilisable si différents utilisateurs partageaient le même état de base de données! –

+1

Juste pour clarifier, s'il y a 10 sessions de base de données, il y a un maximum de 10 états de base de données simultanés même si vous avez 50 utilisateurs finaux d'application. Le point d'un pool de connexions est de partager ces sessions de base de données. L'application saisirait une connexion/session pour la durée d'une transaction. Il n'utiliserait pas nécessairement la même connexion pour une transaction ultérieure par le même utilisateur final de l'application. –

15

Vous pouvez utiliser la variable de session client_identifier pour transmettre un utilisateur d'application à un déclencheur.

Set après la connexion à la base de données comme ceci:

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

et récupérer à l'intérieur du déclencheur:

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

Plus d'informations peuvent être trouvées dans le Oracle docs

+0

+1 Cela semble être la "bonne" façon de le faire! –

+0

Cela fonctionne si vous avez juste besoin de passer l'un des quelques attributs relativement communs au déclencheur. L'approche de Vincent d'utiliser des contextes, cependant, permet le passage de paramètres arbitraires. –

+4

Merci, beaucoup aidé quand j'étais coincé! Je veux juste mentionner, l'utilisation du mot «USERNAME» dans toutes les majuscules dans la première ligne de code est un peu confuse. On dirait qu'il est censé être pris au pied de la lettre, mais en réalité, c'est un substitut de l'identifiant de l'utilisateur de l'application connectée que vous voulez envoyer au déclencheur. La deuxième ligne de code est censée être littérale, en supposant que vous voulez que 'nom d'utilisateur' soit la variable contenant l'identifiant de l'utilisateur de l'application connectée. –

8

vous pouvez utiliser 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 
Questions connexes