[ORACLE 9i] Schematrigger bei Tabellenoperationen

Hallo zusammen,

ih würde gerne einen Schematrigger installieren, der in eine Tabelle dokumentiert, welcher Benutzer der Datenbank, auf meinem Schema Tabelle verändert. Momentan hab ich diesen Trigger in Verwendung:

DECLARE
v_auspraegung VARCHAR2(30):=‚Alter / Drop / Create Table‘;

BEGIN
INSERT INTO log VALUES (‚Trigger on SCHEMA‘,v_auspraegung||’ durch: '||user,sysdate);

EXCEPTION
WHEN others THEN
NULL;
END;

Diese Art funktiniert nun. Allerdings möchte nun etwas mehr wissen - sofern dies möglich ist.

Interessant wären natürlich 2 weitere Informationen:

  1. Auf welches Objekt (geht das auch für Funktionen, Views, Packages etc.?) wurde die Änderung gemacht ? Name des Objektes ?
  2. Welche Aktion wurde durchgeführt ? Drop/Alter Table/Create …

Hoffe die Frage ist verständlich.

Bereits Danke im Voraus,

Gruß
Andreas

Antwort gefunden
Leider hab´ ich versehentlich meine Antwort von eben schon gelöscht, also nochmal:

Wen es interessiert, es funktioniert so:

  1. eine Log-Tabelle anlegen z.B.:

CREATE TABLE schemalog
(log_veranlasst VARCHAR2(1000) NOT NULL,
log_text VARCHAR2(1000) NOT NULL,
log_erstellungszeitpunkt DATE DEFAULT sysdate NOT NULL,
log_user VARCHAR2(100) DEFAULT user NOT NULL)

  1. Danach kann man einen Trigger auf das Schema anlegen:

CREATE OR REPLACE TRIGGER schema_trg_test
BEFORE
CREATE OR ALTER OR DROP
ON SCHEMA
BEGIN
INSERT INTO schemalog
(log_veranlasst
,log_text
,log_erstellungszeitpunkt
,log_user)
VALUES
(‚Schematrigger‘
,ora_sysevent||’ ‚||ora_dict_obj_type||‘ auf Name: '||ora_dict_obj_name
,SYSDATE
,USER);
EXCEPTION
WHEN others THEN
NULL;
END;
/

Darüber hinaus gibt es für Trigger die auf eine Datenbank gehen noch den Befehl ora_dict_obj_owner um den Schemanamen herauszubekommen.

Hoffe es kann auch ein anderer gebrauchen und hilft.

Gruß
Andreas

EXCEPTION
WHEN others THEN
NULL;
END;

  • Nur mal ne kleine Anmerkung am Rande : Deine Exception–> When others then null;

–> Das ist extrem übel und sollte auf jeden Fall vermieden werden.

  • Ein WHEN OTHERS THEN NULL MUSS ein Raise enthalten, resp. Muss den Fehler zurückgeben, ansonsten du die Exeption niemals angezeigt bekommst

Danke für den Hinweis, _aber_ dies ist genauso gewollt. Es handelt sich ja um einen „heimlichen“ Schema-Trigger, von dem keiner (außer mir natürlich) nichts mitbekommen soll.

Wenn ein Fehler auftritt braucht der Trigger auch nichts zu tun - wobei ich auf einer Datenbank mal ein Insert innerhalb des Triggers hab´ um ihn auf Funktionalität zu testen. Da insertet der Trigger bei einem Fehler in eine andere Tabelle den ORA-Fehler.

Bei anderen Triggern würde ich selbstverständlich ein Exception-Handling machen - allerdings würde ich dann auch ein Package anlegen und dieses dann mit dem Trigger ansprechen. Zumal man m.E. sowieso (auf größeren Datenbanken) grundsätzlich auf Trigger - wenn möglich - verzichtet werden sollte, da sich nach ein paar Monaten sowieso keiner mehr dran erinnert.

Gruß
Andreas