Announcement

Collapse
No announcement yet.

After Delete-Trigger-Proble

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

  • After Delete-Trigger-Proble

    Hallo,
    ich arbeite noch nicht lange mit Oracle und habe eine Frage zu einem After Delete-Trigger. Vielleicht könnt ihr mir da ja weiterhelfen:

    Ich habe eine Tabelle, in der viele Werte zu verschiedenen Namen gespeichert sind. In einer zweiten Tabelle wird jeweils der minimale und der maximale Wert zu einem bestimmten Namen gespeichert. Wenn nun aus der ersten Tabelle eine Zeile gelöscht wird, möchte ich, dass die Werte in der zweiten Tabelle entpsrechend aktualisiert werden.
    Mein Problem ist, dass ich bei einem After Delete Trigger nicht auf die :OLD-Werte zugreifen kann und somit kein select max/min... ausführen kann.

    Irgendjemand eine Idee, wie ich das hinbekommen kann? Ist übrigens Oracle-Version 9i.

    Vielen Dank,
    Karl

  • #2
    Hallo Karl,

    wenn in einem Trigger Werte über :OLD bzw. :NEW manipuliert werden sollen, dann geht das nur in einem BEFORE-Trigger.
    Warum muß es zwingend ein AFTER-Trigger sein?

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,
      danke für die schnelle Antwort. Nein, es kann auch ruhig ein Before Delete-Trigger sein. Der sieht jetzt wie folgt aus:

      CREATE OR REPLACE TRIGGER offer_del_actualization
      BEFORE DELETE ON name_values
      FOR EACH ROW
      DECLARE
      min_val NUMBER;
      max_val NUMBER;
      id NUMBER;

      BEGIN
      id := :OLD.name_id;
      SELECT MIN(values) INTO min_val FROM name_values where id = name_id;
      SELECT MAX(values) INTO max_val FROM name_values where id = name_id;
      UPDATE name_brief SET min_value = min_val WHERE id=name_id;
      UPDATE name_brief SET max_value = max_val WHERE id=name_id;
      END;

      Allerdings funktioniert das Löschen nicht, ich bekomme dann folgenden Fehler:

      [Error Code: 4091, SQL State: 42000] ORA-04091: Tabelle NAME_VALUES wird gerade geändert, Trigger/Funktion sieht dies möglicherweise nicht
      ORA-06512: in "OFFER_DEL_ACTUALIZATION", Zeile 8
      ORA-04088: Fehler bei der Ausführung von Trigger "OFFER_DEL_ACTUALIZATION'

      Viele Grüße,
      Karl

      Comment


      • #4
        Hallo Karl,

        In ORACLE kannst du in einem FOR EACH ROW-Trigger nicht lesenderweise auf eine Tabelle zugreifen die gerade geändert wird, sprich den Trigger ausgelöst hat. Das ist nicht unbedingt einzusehen, ist aber so und muß mit entsprechend geänderter Logik oder kleinen Tricks umgangen werden.
        Ein solcher Trick ist z.B. die Verwendung einer Temporären Tabelle und statt dem FOR EACH ROW-Trigger eine Kombination aus FOR EACH ROW und AFTER-STATEMENT-Trigger.
        Für deinen Fall müßte der Trigger offer_del_actualization einfach nur die :OLD.name_id in eine entsprechende Temporäre Tabelle schreiben. In einem AFTER STATEMENT-Trigger benutzt du diese Temporäre Tabelle dann für dein Update.

        Ansonsten solltest du einiges zu dem Thema hier im Forum mit dem Stichwort ORA-04091 finden

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment

        Working...
        X