Skip to Main Content

 

Auswahl  

Oracle APEX Variablen im Oracle Trigger auslesen 

Oracle
APEX:PL/SQL
APEX 18.1
05.05.20 (MP)
05.07.23(MP)
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)