Re: Oracle - Trigger Problem



Saphir2k schrieb am 22.09.2005 in <1127392288.394913.126720@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>:

Hallo zusammen,

ich habe folgendes Problem bei dem ich dringend von euch hilfe
bräuchte.

Ich habe eine Tabelle (nennen wir sie TabOrg) in die Daten geschrieben
und angelegt werden. Ich benötige nun aber die Daten die in dieser DB
stehen möglichst sofort nach einem schreiben / ändern auch in einer
zweiten DB (nennen wir sie TabDup). Ziel ist es also das in beiden
Tabellen (TabOrg und TabDup) die gleichen Daten stehen.
Bitte fragt nicht nach warum und wieso, das ist leider alles (wie so
oft) Historisch bedingt und sehr umständlich zu erklären. Es geht mir
mehr um das Problem selbst.
Habe ich Dich richtig verstanden und Du willst in eine zweite DB schreiben? Dann kann ich Dir nicht weiterhelfen.
Solltest DU mit DB Dabelle meinen, dann vieleicht.


Uns vielen sofort die Trigger für diesen Einsatzweck ein. Ein INSERT
Trigger war auch kein Problem. INSERT TRIGGER an TabOrg mit folgendem
Inhalt:

---
CREATE OR REPLACE TRIGGER "TEST"."TABORG_IA_ROW"
AFTER INSERT ON "TEST"."TabOrg" FOR EACH ROW
begin
insert into "TabDup"
values(:new.FeldXY,:new.FeldXYZ,:new.ZahlXY);
end;
---
Jau, das sollte so gehen. Wichtig ist das AFTER, weil da schon alle Trigger, die die neuen Werte modifizieren können, abgearbeitet sind. Solltest Du mehrere AFTER INSERT ON TEST ... habe, müßtest Du sie zusammenfassen, weil Du sonst nicht weißt, ob bei einer EXCEPTION Deiner schon ausgeführt wurde oder nicht mehr ausgeführt wird.
(Das ganze ist m.E. recht tricky, ich habe hier ein ähnliches Problem)


Das funktioniert auch zum Test recht gut.Bis auf den umstand das
wirklich für jede Tabelle die kompletten Tabellenfelder eingetragen
werden müssen, scheint das praktikabel zu sein (oder hat jemand eine
bessere Lösung?).
Nur, daß Du die einzelnen Tabellenfelder aus dem Data- Dictionary auslesen könntest und diese Trigger damit automatisch durch ein Script schreiben lassen könntest. So mache ich das jedenfalls.

Als ich mich dann an das erstellen für den Update Trigger machen
wollte, hing ich komplett. Mir fehlt dort komplett der Ansatz für eine
Lösung. Wie kann ich praktisch das gleiche Update das auf die Original
Tabelle gemacht wurde auch auf eine andere Absetzen? Wie komme ich an
die Werte die in der WHERE Bedingung abgesetzt wurden?
Diese WHERE- Bedingung brauchst Du eigentlich nicht, du müßtest als WHERE den Primärschlüssel verwenden.

Zur Erklärung nochmal kurz:
Es wird ein UPDATE auf TabOrg gemacht: UPDATE TabOrg SET
FeldXY='test1', FELDXYZ='test2' WHERE ZahlXY = 񟍸'
---
CREATE OR REPLACE TRIGGER "TEST"."TABORG_IA_ROW"
AFTER UPDATE ON "TEST"."TabOrg" FOR EACH ROW
begin
UPDATE "TabDup"
SET
 FeldXY = :new.FeldXY,
 FeldXYZ = :new.FeldXYZ,
 ZahlXY = :new.ZahlXY
WHERE
 PrimärschlüsselTeil1 = :new.PrimärschlüsselTeil1 and
 PrimärschlüsselTeil2 = :new.PrimärschlüsselTeil2 ...
;
end;
---

Vorausgesetzt, Du hast zuverlässig hinbekommen, daß die Daten dupliziert werden, sollte das gehen.
Spannend ist es natürlich noch, wenn Du den Primärschlüssel änderst und dieser Bestandteil eines Foreign- Key- Constraints ist, der über einen Trigger erzwungen wird. Dann müßtest Du eben diese Konstruktion für TabDup auch nachbauen.


Wie kann ich in dem Trigger nun auslesen was in der WHERE Klausel
Angegeben wurde?
Meines Wissens gar nicht, aber wie gesagt, da Du ja for each row hast, sollte das keie Rolle spielen.

Es wäre wirklich sehr nett von euch wenn Ihr mir auf den richtigen Weg
helfen könntet.
Ob das der richtige Weg ist, kann ich Dir natürlich nicht sagen ;)

Ich bedanke mich schonmal herzlich im vorraus!
Thorsten
Andreas

--
wenn email, dann AndreasMosmann <bei> web <punkt> de
.



Relevant Pages