Say mamy 3 rekordy w tabeli: orig_tabwyzwalania tylko dla zmienionych wartości
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 1 | AA | Street1 | 11111 |
| 2 | BB | Street2 | 22222 |
| 3 | CC | Street3 | 33333 |
---------------------------------------------
Teraz dane są zmiany:
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 1 | AA | Street1 | 11111 |
| 2 | BB | Street2 | 44444 |
| 3 | CC | Dtreet7 | 33333 |
---------------------------------------------
Co klient chce to zapisy aktualizacji i tylko zaktualizowane kolumny (tak, wiem, że to nie ma sensu, ale używają starego systemu z lat 70. i chcą zrobić trochę logowania itp.). Więc tabela raportowania powinno być tak:
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 2 | | | 44444 |
| 3 | | Dtreet7 | |
---------------------------------------------
To, co starałem:
CREATE OR REPLACE TRIGGER vr_reporting_trigger
AFTER UPDATE ON orig_tab
FOR EACH ROW
BEGIN
IF inserting THEN
INSERT INTO rep_tab(pk, name, address, code)
SELECT :new.pk, :new.name, :new.address, :new,code FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM rep_tab WHERE pk = :new.pk);
UPDATE rep_tab t SET t.name = :new.name, t.address = :new.address, t.code = :new.code
WHERE t.pk = :new.pk;
ELSIF updating THEN
IF :new.pk <> :old.pk THEN
UPDATE rep_tab t
SET t.name = :new.name, t.address = :new.address, t.code =: new.code
WHERE t.pk = :old.pk ;
END IF;
MERGE INTO rep_tab d
USING DUAL ON (d.pk = :old.pk)
WHEN MATCHED THEN
UPDATE SET d.name = :new.name, d.address = :new.address, d.code =: new.code
WHEN NOT MATCHED THEN
INSERT (d.pk,d.name, d.address, d.code) VALUES (:new.pk,:new.name, new.address, new.code);
END IF;
END;
z tego rozwiązania, otrzymuję:
---------------------------------------------
| PK | Name | Address | Postal Code |
---------------------------------------------
| 2 | BB | Street2 | 44444 |
| 3 | CC | Dtreet7 | 33333 |
---------------------------------------------
wiem, że gdzieś w mikołajem wkładek w trakcie aktualizowania oświadczenia, ale nie mogę wymyślić, jak zmienić to zdanie zgodnie z moim wymaganiem. Jakieś sugestie?
Z góry dziękuję.
+1, ale 9i docs? Oto wersja [11g] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#sthref771) –
To wydaje się wywoływać, jeśli th yolumn jest częścią instrukcji UPDATE. Nie tylko, jeśli wartość się zmieni. –