Announcement

Collapse
No announcement yet.

Alte Werte via update Trigger wiederherstellen

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

  • Alte Werte via update Trigger wiederherstellen

    Hi,

    wir haben eine alte Anwendung, auf die wir nur via Trigger Möglichkeiten zur Manipulation haben. Also stored proc's scheiden aus!

    Ich möchte im Falle eines falschen updates, den ursprünglichen Zustand wiederherstellen.
    Ein falscher update ist daran erkennbar, dass der Wert eines Feldes nicht verändert werden darf. Wird dieser verändert, müssen (bis auf den prim-key) alle Felder wieder mit dem alten Wert versehen werden.

    1) Ansatz: ein before update trigger
    Hier bin ich dran gescheitert, dass oralce nicht erlaubt die durch das update zu veränderte Zeile zu lesen, um an die alten Werte heranzukommen:
    select alteWerte from Tabelle where id = :new.id

    2) Ansatz: ein after update trigger
    Jetzt habe ich zwar die new und old Werte aber oracle erlaubt mein update nicht falls ld.WertFeld != :new.WertFeld.
    update Tabelle set :new.WertFeld = ld.WertFeld where id = :new.id (smiley ist hier OLD)

    Ansatz 1) würde funktionieren, wenn ich diese besagte Tabelle duplizieren würde und mit dem select in der Kopie die alten Daten holen würde.

    Gibt es eine elegante Möglichkeit ohne die Tabelle zu duplizieren?

    Danke für Eure Ideen!

    Ciao samba

  • #2
    Ich kann das Problem noch nicht ganz nachvollziehen, auch nicht wie man ein "falsches Update" erkennt. Eventuell hilft hier aber ein INSTEAD OF UPDATE Trigger weiter:
    Oracle Instead Of

    Viel Erfolg!

    Comment


    • #3
      Hallo,
      Originally posted by Samba View Post
      ...2) Ansatz: ein after update trigger
      Jetzt habe ich zwar die new und old Werte aber oracle erlaubt mein update nicht falls ld.WertFeld != :new.WertFeld.
      update Tabelle set :new.WertFeld = ld.WertFeld where id = :new.id (smiley ist hier OLD)

      Die :new- und :old-Werte hast du auch im Before-Update-Trigger und kannst dann dort auch noch Manipulationen durchführen, indem du einfach den Wert für :new veränderst:

      [highlight=sql]
      ...
      if (ld.WertFeld != :new.WertFeld) then
      begin
      :new.WertFeld = ld.WertFeld;
      end;
      [/highlight]

      Gruß Falk

      P.S.: Wenn man nicht möchte das der Code durch ungewollte Smilies verunstaltet wird, dann hilft der BB-Code [noparse]Dies sind keine Smilies: ;), :o[/noparse]
      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


      • #4
        Hallo Falk,

        durch die viele Arbeit bruzzel ich mir noch die Birne durch.
        VIELEN DANK!
        Die old Werte habe ich ja auch in dem before update trigger.
        Man, damit hast Du mir riesig geholfen. Schön das wir darüber geredet (geschrieben) haben ;-)

        Hi jum,
        das falsche update erkennen wir, wenn in einem bestimmten Feld (logischer Schlüssel) ein falscher Wert hineingeschrieben wird.
        Ein instead of trigger würde mir nur dann was nutzen, wenn das defekte update auf eine View und nicht auf eine Tabelle zielen würde.

        Euch Beiden vielen Dank + FROHE WEIHNACHTEN

        samba

        Comment

        Working...
        X