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