Цель состоит в том, чтобы отправить дополнительную информацию в триггеры как текущий идентификатор пользователя из веб-приложения. Так как пул соединения используется, и тот же идентификатор пользователя используется для всех соединений, как я передаю исходный идентификатор интернет-пользователя для инициирования? Это я должен реализовать, не касаясь кода приложения. Это - java-приложение.
John
Вы можете использовать пакет для отслеживания веб-пользователя:
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;
На веб-странице вызовите web_user_pkg.set_username с идентификатором текущего пользователя перед выполнением любого DML или другого вызова пакета.
] В триггере используйте web_user_pkg.username, чтобы получить имя веб-пользователя.
Вы можете использовать переменную сеанса client_identifier для передачи пользователя приложения триггеру.
Установите ее после подключения к базе данных следующим образом:
CALL dbms_session.set_identifier('<<username>>');
и получите ее внутри триггера:
SELECT sys_context('USERENV','CLIENT_IDENTIFIER') INTO username FROM DUAL;
Дополнительную информацию можно найти в документах Oracle
вы можете использовать Oracle Контексты :
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