如何将任意参数发送到Oracle触发器?

13 java oracle plsql jdbc

目的是向Web应用程序中的当前用户ID等触发器发送额外信息.由于使用了连接池,并且所有连接都使用相同的用户ID,如何将原始Web用户ID传递给触发器?这需要在不触及应用程序代码的情况下实现.它是一个基于Java的应用程序.

约翰

FRo*_*owe 16

您可以使用client_identifier会话变量将应用程序用户传递给触发器.

在连接到数据库之后设置它,如下所示:

  CALL dbms_session.set_identifier('<<username>>');
Run Code Online (Sandbox Code Playgroud)

并在触发器内检索它:

  SELECT sys_context('USERENV','CLIENT_IDENTIFIER') INTO username FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

可以在Oracle文档中找到更多信息

  • 谢谢,当我被困住时帮了很多忙!只是想提一下,在第一个代码行中使用全部大写字母'USERNAME'有点令人困惑.看起来它意味着从字面上理解,但实际上,它是您想要发送到触发器的登录应用用户的用户ID的替身.第二个代码行虽然是文字的,但假设您希望"username"成为保存登录app用户ID的变量. (4认同)

Vin*_*rat 9

您可以使用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
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 1

您可以使用包来跟踪网络用户:

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;
Run Code Online (Sandbox Code Playgroud)

在执行任何 DML 或其他包调用之前,在网页中使用当前用户 ID 调用 web_user_pkg.set_username。

在触发器中使用 web_user_pkg.username 获取 Web 用户名。