Hallo,
Ich muss mit Oracle Trigger eine Änderungshistorie vornehmen. Eine Tabelle aus einer Oracle Datenbank spiegeln. in die gespiegelte Tabelle sollen 2 weitere felder rein USER_ID und ZEIT_STEMPEL. sobald in der orginal Tabelle irgendein eintrag geändert wird soll auf der gespiegelten Tabelle die User_ID (also wer hat den eintrag gemacht) und der zeitspempel (wann wurde der eintrag gemacht) in die gespiegelte tabelle eingetragen
Folgende beiden Beispiele machen eigentlich genau das, was Du willst, für den normalen Fall, dass jemand direkt die Tabelle bearbeitet (ohne Spiegelung):
http://www.techonthenet.com/oracle/triggers/before_insert.php
http://www.techonthenet.com/oracle/triggers/before_update.php
(Unter der Annahme, dass der Oracle-User der User ist, den Du da abspeichern willst - wenn Du einen anderen User meinst - z.B. den einer Webanwenung - dann hast Du Pech gehabt, das geht dann prinzipbedingt nicht, weil Oracle ja die Info gar nicht haben kann.)
Wenn Du die Tabelle spiegelst, wird es komplizierter - es hängt wohl davon ab, wie Du die Spiegelung durchführst. Ich bin mir nicht mehr ganz sicher, aber ich glaube mich erinnern zu können, dass Trigger auf MATERIALIZED VIEWs funktionieren - falls Du die Tabelle also über einen MV spiegelst, kannst Du bei Änderungen zumindest einen Trigger laufen lassen. Und MVs haben wenn ich mich nicht komplett täusche auch den Vorteil, dass die Tabellenstruktur nicht 1:1 übernommen werden muss.
Was allerdings ein riesiges Problem wird, ist im Trigger auf einen MV an die korrekten Informationen (User, Zeitpunkt) zu kommen: Im Trigger stehen als Info nämlich nur zur Verfügung:
- Wer führt den Trigger aus? (das wird dann vermutlich der User sein, in dessen Schema sich die Spiegelung befindet, aber sicher weiß ich das nicht, müsstest Du ausprobieren)
- Wann wird der Trigger ausgeführt? Das ist nicht notwendigerweise der Zeitpunkt, wann der Datensatz in die Originaltabelle eingefügt wurde - die Spiegelung kann sich nämlich gerne verzögern - hängt von den Einstellungen der Spiegelung ab.
Zusammengefasst: Die Info, welcher User wann einen Eintrag in eine Tabelle gemacht hat und wann das genau passiert ist, kannst Du prinzipbedingt beim NACHTRÄGLICHEN Spiegeln nicht mehr herausbekommen, wenn Du das nicht gleich beim ersten Eintragen direkt speicherst. Zudem könnte es sein, dass die Info "User", die Du aus der Datenbank bekommst, nicht ganz Deinen Erwartungen an die Info "User" entspricht, weil Oracle als "User" natürlich nur den kennt, der sich mit der DB verbindet.
Alles in allem kann man wohl sagen, dass Dein Vorhaben auf die von Dir vorgeschlagene Weise wohl nicht umsetzbar ist.
Viele Grüße,
Christian