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:
- Auf welches Objekt (geht das auch für Funktionen, Views, Packages etc.?) wurde die Änderung gemacht ? Name des Objektes ?
- 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:
- 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)
- 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