How to send arbitrary parameters to Oracle trigger?

前端 未结 3 1170
一个人的身影
一个人的身影 2020-12-14 10:51

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 connectio

相关标签:
3条回答
  • 2020-12-14 11:22

    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.

    0 讨论(0)
  • 2020-12-14 11:35

    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
    
    0 讨论(0)
  • 2020-12-14 11:41

    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

    0 讨论(0)
提交回复
热议问题