2009-12-10 14 views
12

Celem jest wysłanie dodatkowych informacji do wyzwalaczy, takich jak bieżący identyfikator użytkownika z aplikacji internetowej. Ponieważ używana jest pula połączeń i dla wszystkich połączeń jest używany ten sam identyfikator użytkownika, w jaki sposób mogę przekazać pierwotny identyfikator użytkownika WWW do uruchomienia? Muszę to wdrożyć bez dotykania kodu aplikacji. Jest to aplikacja oparta na Javie.Jak wysłać dowolne parametry do wyzwalacza Oracle?

John

Odpowiedz

1

Można użyć pakietu śledzić użytkownika internetowej:

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; 

na stronie internetowej połączeń web_user_pkg.set_username z ID bieżącego użytkownika przed wykonaniem jakichkolwiek połączeń DML lub innych pakietów .

W wyzwalaczu użyj web_user_pkg.username, aby uzyskać nazwę użytkownika WWW.

+0

Wydaje się być dobrym rozwiązaniem. Czy ta zmienna pakietu jest współużytkowana między innymi połączeniami? –

+0

Nie, jest to unikalne połączenie. Łączenie połączeń byłoby bezużyteczne, gdyby różni użytkownicy końcowi dzielili ten sam stan bazy danych! –

+1

Aby wyjaśnić, jeśli istnieje 10 sesji bazy danych, istnieje maksymalnie 10 współbieżnych stanów bazy danych, nawet jeśli masz 50 użytkowników końcowych aplikacji. Punkt puli połączeń polega na współużytkowaniu tych sesji bazy danych. Aplikacja przechwyci jedno połączenie/sesję na czas trwania transakcji. To niekoniecznie wykorzystuje to samo połączenie dla kolejnej transakcji przez tego samego użytkownika końcowego aplikacji. –

15

Możesz użyć zmiennej sesji client_identifier, aby przekazać użytkownikowi aplikacji wyzwalacz.

Set to po podłączeniu do bazy danych takich jak to:

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

i pobrać go wewnątrz wyzwalacza:

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

Więcej informacji można znaleźć w Oracle docs

+0

+1 Wydaje się, że jest to "właściwy" sposób na zrobienie tego! –

+0

Działa to, jeśli wystarczy przekazać jedną z kilku stosunkowo popularnych atrybutów wyzwalaczowi. Podejście Vincenta do używania kontekstów pozwala jednak na przekazywanie dowolnych parametrów. –

+4

Dzięki, bardzo pomogłem, kiedy utknąłem! Chciałbym tylko wspomnieć, że użycie słowa "USERNAME" w all-caps w pierwszej linii kodu jest nieco mylące. Wygląda na to, że należy go wziąć dosłownie, ale tak naprawdę jest to identyfikator użytkownika zalogowanego użytkownika aplikacji, który chcesz przesłać do wyzwalacza. Druga linia kodu ma jednak charakter dosłowny, zakładając, że chcesz, aby "nazwa użytkownika" była zmienną przechowującą identyfikator użytkownika zalogowanego użytkownika aplikacji. –

8

można wykorzystać 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 
Powiązane problemy