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

发布于 2024-08-13 17:27:09 字数 141 浏览 3 评论 0原文

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

约翰

The purpose is to send extra information to triggers like current user id from a web application. Since a connection pool is used, and same user id is used for all connections how do I pass the original web user id to trigger? This I need to implement without touching application code. It is a java based application.

John

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

何其悲哀 2024-08-20 17:27:09

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

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

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

并在触发器内检索它:

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

更多信息可以在 Oracle 文档

You can use the client_identifier session variable to pass an application user to a trigger.

Set it after connecting to the database like this:

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

and retrieve it inside the trigger:

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

More info can be found in the Oracle docs

绅刃 2024-08-20 17:27:09

您可以使用 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

you could use 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
没有伤那来痛 2024-08-20 17:27:09

您可以使用包来跟踪 Web 用户:

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;

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

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

You can use a package to keep track of the web user:

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;

In the web page call web_user_pkg.set_username with the current user's ID before performing any DML or other package calls.

In the trigger use web_user_pkg.username to get the web user name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文