Auswahl  

Oracle APEX Variablen im Oracle Trigger auslesen 

Oracle
APEX:PL/SQL
APEX 18.1:APEX 19.1:APEX 20.2:APEX 21.1
05.05.20 (MP)
12.01.21
Oracle Apex Trigger Variablen

Passende Schulungen zum Thema

Wenn man in seiner Oracle Datenbank Trigger zu Audit-Zwecken verwendet, ist man erstaunt, das als Apex Benutzer nicht der Anmeldebenutzer sondern ANONYMOUS oder APEX_PUBLIC_USER erscheint.

Das Problem kann man natürlich mit ein paar PL/SQL Objekten lösen.:-)
 
GRANT CREATE ANY CONTEXT TO scott;
DROP CONTEXT APEX_ENV;

Etwas unbekannt ist das Oracle Objekt Context, mit dem die Funktion sys_context erweitert werden kann.
Die Funktion sys_context besteht aus zwei Parametern:
Parameter 1: userenv
Parameter 2: ca 60 Stück u.a. OS_OSER, SESSION_USER, ...
Wir können die Funktionen nun erweitern, indem wir den ersten Parameter ändern auf apex_env
 
CREATE OR REPLACE CONTEXT apex_env
USING apex_env
/

Die Context Funktion benötigt zum Auffruf immer ein Package, das wir hiermit anlegen:
CREATE OR REPLACE PACKAGE apex_env
IS
 PROCEDURE set_context(
 p_variable IN VARCHAR2,
 p_value    IN VARCHAR2);
END;
/

CREATE OR REPLACE PACKAGE BODY apex_env IS
  PROCEDURE set_context(
    p_variable IN VARCHAR2,
    p_value    IN VARCHAR2) IS
  BEGIN
    dbms_session.set_context('apex_env',p_variable, p_value);
  END set_context;
END apex_env;
/
 
CREATE PUBLIC SYNONYM apex_env for apex_env;
GRANT EXECUTE ON my_login_package TO scott;

Führen wir einen Testcase durch und setzen den Context manuell:
BEGIN
apex_env.set_context('APP_USER','Marco');
apex_env.set_context('APP_PAGE_ID',123);
apex_env.set_context('APP_ID',100);
apex_env.set_context('APP_SESSION',123454678);
END;
/

Nun können wir den Context wieder auslesen:
 
SELECT
sys_context('apex_env','APP_USER') as APP_USER,
sys_context('apex_env','APP_PAGE_ID') as APP_PAGE_ID,
sys_context('apex_env','APP_ID') as APP_ID,
sys_context('apex_env','APP_SESSION') as APP_SESSION
FROM dual;

Jetzt erstellen wir uns eine Audit-Tabelle, in der stehen soll, welcher APEX Benutzer auf welcher Seite, in welcher APP mit welcher Session ID
die Änderung durchgeführt hat.
CREATE TABLE emp_audit (
empno        INT,
app_user     VARCHAR2(30),
app_page_id  INT,
app_id       INT,
app_session  INT);

und der passende Trigger dazu:
CREATE OR REPLACE TRIGGER EMP_TRG
BEFORE DELETE OR INSERT OR UPDATE ON EMP
FOR EACH ROW
BEGIN
  INSERT INTO emp_audit (empno,app_user,app_page_id,app_id,app_session)
  VALUES (nvl(:new.empno,:old.empno),
    sys_context('apex_env','APP_USER'),
    sys_context('apex_env','APP_PAGE_ID'),
    sys_context('apex_env','APP_ID'),
    sys_context('apex_env','APP_SESSION'));
END;
/

Jetzt brauchen wir nur noch den kleinen Testblock in unsere APEX-App einbauen:
Gehen Sie dazu auf: Edit Application Properties / Security und dort auf Database Session.
Im Bereich "Initialization PL/SQL Code" geben Sie dort ein:
BEGIN
apex_env.set_context('APP_USER',:APP_USER);
apex_env.set_context('APP_PAGE_ID',:APP_PAGE_ID);
apex_env.set_context('APP_ID',:APP_ID);
apex_env.set_context('APP_SESSION',:APP_SESSION);
END;
/

Weitere Tipps und Tricks erfahren Sie in einem unserer APEX oder PL/SQL Kurse (auch als Video-Streaming)