Announcement

Collapse
No announcement yet.

Database Trigger Transaction Rollback

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Database Trigger Transaction Rollback

    Hallo alle zusammen.

    Ich habe versucht einen Datenbank Trigger auf das Ereignis "TRANSACTION ROLLBACK" zu erzeugen.
    Der sieht wie folgt aus.

    Code:
        CREATE OR ALTER TRIGGER LOG$TRANSACTION_ROLLBACK_0
        ACTIVE ON TRANSACTION ROLLBACK POSITION 0
        AS
          DECLARE VARIABLE MonUser VARCHAR(64);
          DECLARE VARIABLE MonRemoteAddress VARCHAR(253) CHARACTER SET ASCII;
          DECLARE VARIABLE MonRemotePid INTEGER;
          DECLARE VARIABLE MonRemoteProcess VARCHAR(253);
        BEGIN
          SELECT att.mon$user, att.mon$remote_address, att.mon$remote_pid, att.mon$remote_process
            FROM mon$transactions ta JOIN mon$attachments att ON (ta.mon$attachment_id=att.mon$attachment_id)
            WHERE (ta.mon$transaction_id=CURRENT_TRANSACTION)
            INTO :MonUser, :MonRemoteAddress, :MonRemotePid, :MonRemoteProcess;
    
          INSERT INTO log$transaction_log (transaction_number, transaction_type, mon$user, mon$remote_address, mon$remote_pid, mon$remote_process)
            VALUES (CURRENT_TRANSACTION, 'R', :MonUser, :MonRemoteAddress, :MonRemotePid, :MonRemoteProcess);
        END
    Kurzbeschreibung:
    Wenn eine Transaktion Rückabgewickelt wird, soll in einer Logtabelle ein Eintrag vorgenommen werden.

    Problem:
    Beim einem Rollback wird kein Eintrag in der Logtabelle vorgenommen.
    Ich vermute das liegt daran, dass der Aufruf des Triggers im Kontext der Transaktion ausgeführt wird, die
    gerade Rückabgewickelt werden soll. Dementsprechend wird auch der Eintrag in der Logtabelle wieder
    Rückgängig gemacht.
    Wenn ich den Trigger auf das Ereignis "TRANSACTION COMMIT" setze funktionierts, daher meine
    Vermutung.

    Hat jemand eine Idee wie ich das hinkriegen kann ?
    Google hat da leider auch nicht viel hergegeben.

    Was macht man eigentlich mit einem Trigger, beim dem alle Aktionen nach dem Verlassen
    wieder rückgängig gemacht werden (falls dem so ist) ?

    Im Einsatz ist übrigens Firebird 2.1.3.18185

    An alle schon mal vielen Dank für die Mühe
    Peter

  • #2
    Mit 2.1 gibt es eigentlich nur den Weg, das Log in eine External Table zu schreiben, da diese nicht unter Transaktionskontrolle stehen.

    Mit 2.5 wird das mit einem AUTONOMOUS TRANSACTION Block gemacht.

    Thomas
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment

    Working...
    X