pragma autonomous_transaction in einem trigger
Ich geschrieben habe einen trigger für eine Tabelle, die löscht die Daten aus der anderen Tabelle über eine Bedingung.
Der trigger hat pragma autonomous_transaction und auslösen funktioniert wie vorgesehen. Allerdings Frage ich mich, ob es sein kann, Probleme in die Zukunft, sagen, wenn Daten eingefügt werden, die von mehreren Benutzern/Quellen zur gleichen Zeit etc...Irgendwelche Vorschläge?
Quelle Tabelle t1:
--------------------------------------------
| user_id | auth_name1 | auth_name2 | data |
--------------------------------------------
| 1 | Name1 | Name2 | d1 |
| 2 | Name3 | Name4 | d2 |
| 3 | Name5 | Name1 | d3 |
--------------------------------------------
Ziel-Tabelle t2:
------------------------------------------------
| record_id | identifier | status | data1 |
------------------------------------------------
| 100 | Broken | 11 | Name1 |
| 101 | Reminder | 99 | Name1 |
| 102 | Broken | 99 | Name2 |
| 103 | Broken | 11 | Name4 |
------------------------------------------------
Trigger-code:
create or replace trigger "ca"."t$t1"
after update of auth_name1, auth_name2 on ca.t1
for each row
declare
pragma autonomous_transaction;
begin
if :new.auth_name1 is not null and :new.auth_name2 is not null then
delete from ca.t2 ml
where ml.identifier = 'Broken'
and data1 = regexp_substr(:new.auth_name1, '\S+$')||' '||regexp_substr(:new.auth_name1, '^\S+')
and status = 11;
commit;
end if;
end t$t1;
InformationsquelleAutor Jaanna | 2014-05-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe einer autonomen Transaktion für alles andere als Protokollierung, die Sie wollen, zu erhalten, wenn die übergeordnete Transaktion ein Rollback ist fast sicher ein Fehler. Dies ist nicht eine gute Verwendung von einer autonomen Transaktion.
Was passiert zum Beispiel, wenn ich ein update einer Zeile in
t1
aber meine Transaktion ein Rollback. Diet2
änderungen bereits vorgenommen wurden und begangen werden, so dass Sie nicht zurück Rollen. Das bedeutet in der Regel, dass diet2
Daten ist jetzt falsch. Der ganze Sinn von Transaktionen, um sicherzustellen, dass eine Reihe von änderungen atomar ist, und ist entweder ganz erfolgreich oder vollständig rückgängig gemacht. So dass der code teilweise erfolgreich, ist fast nie eine gute Idee.Ich bin hart gedrückt, um zu sehen, was mit einer autonomen Transaktion kauft Sie hier. Sie sehen oft Menschen, die fälschlicherweise mit autonomen Transaktionen zu falsch umgehen mutating trigger-Fehler. Aber der code, den Sie geschrieben würde nicht generieren ein mutating trigger-Fehler, es sei denn, es war ein row-level trigger auf
t2
wurde auch versucht, zu aktualisierent1
oder einem ähnlichen Mechanismus, dass war die Einführung einer mutierenden Tabelle. Wenn das der Fall ist, obwohl, mit einer autonomen Transaktion ist in der Regel noch schlimmer, denn die autonome Transaktion dann nicht sehen, die änderungen in die übergeordnete Transaktion, die fast sicher bewirkt, dass der code sich anders Verhalten, als man wünschen würde.InformationsquelleAutor Justin Cave