Как отправить произвольные параметры в триггер Oracle?

Цель состоит в том, чтобы отправить дополнительную информацию в триггеры как текущий идентификатор пользователя из веб-приложения. Так как пул соединения используется, и тот же идентификатор пользователя используется для всех соединений, как я передаю исходный идентификатор интернет-пользователя для инициирования? Это я должен реализовать, не касаясь кода приложения. Это - java-приложение.

John

13
задан David Aldridge 10 December 2009 в 13:27
поделиться

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, чтобы получить имя веб-пользователя.

1
ответ дан 1 December 2019 в 21:24
поделиться

Вы можете использовать переменную сеанса client_identifier для передачи пользователя приложения триггеру.

Установите ее после подключения к базе данных следующим образом:

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

и получите ее внутри триггера:

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

Дополнительную информацию можно найти в документах Oracle

16
ответ дан 1 December 2019 в 21:24
поделиться

вы можете использовать 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
9
ответ дан 1 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: