Announcement

Collapse
No announcement yet.

IF Update(x) - Checken ob sich nur ein Feld verändert hat

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

  • IF Update(x) - Checken ob sich nur ein Feld verändert hat

    Hallo zusammen

    Ich habe eine Tabelle mit einigen Feldern. Nun würde ich gerne innerhalb eines Triggers prüfen ob sich nur Feld A verändert hat oder ob sich andere auch verändert haben. Wenn sich nur Feld A verändert (das ist fix, das verändert sich bei jedem Update) will ich was anderes machen als wenn sich Feld A und Feld D verändern.

    Meine Frage: muss ich nun ein If Update(x) Or Update(y) usw für jedes Feld machen oder kann ich das irgendwie ander lösen?

    LG
    Michael

  • #2
    Hallo zusammen

    bitte schreibt mir auch wenn es nicht geht bzw. ihr keine Idee habt!

    Lg
    Michael

    Comment


    • #3
      Ich bin eher ein Freund des Arbeitens mit Feldnamen. Den Vergleich im Trigger würde ich daher mit den Tabellen 'inserted' und 'updated' machen, etwa so:

      if (select feld1 from inserted) <> (select feld1 from deleted) ....

      Hinweis: aufpassen, wenn mehr als ein Reord auf einmal geändert wird, weil ja ein After-Trigger immer nur am Ende der gesamten Transaktion aufgerufen wird und man dann alle betroffenen Records in inserted/deleted findet. Da müsste man dann wahrscheinlich einen Cursor verwenden.

      bye,
      Helmut

      Comment


      • #4
        Servus Landsmann

        Danke das du mir geantwortet hast. Ich habe jedoch Rückfragen:
        1. Verstehe ich das richtig: inserted = neue werte; deleted = alte werte?
        2. In diesem Fall muss ich jedoch auch alle 20 Felder miteinander vergleichen. Meine Frage sollte mehr darauf abzielen ob es einfach möglich ist zu prüfen ob sich nur das Feld A oder ZUSÄTZLICH irgendein anderes Feld. Wobei ich bei zusätzlich nicht alle anderen 9 Felder abfragen will. Ich suche also so eine Function wie ChangedElse oder sowas

        Danke und LG

        Comment


        • #5
          Punkt 1: ja, richtig verstanden, in inserted findet man die Records nach dem Speichern und in deleted die vor dem Speichern. Bei einem Insert ist deleted natürlich leer und bei einem delete bleibt inserted leer. Und wenn du wie gesagt zb sowas wie "UPDATE myTable set Field1 = Field1 + 1" machst und es wären 20 Records in myTable, dann würde der Trigger am Ende genau 1 x aufgerufen (und nicht 20 mal zu je einem Datensatz) und du würdest 20 Records in inserted und ebensoviel in deleted entdecken. Aber das weisst du ja wahrscheinlich schon :-)

          Wegen der anderen Sache - vielleicht hilft dir da COLUMNS_UPDATED() weiter. Mit ein bisschen herumprobieren sollte es nicht so schwer sein, dass du das Richtige findest.
          Da das aber von der Feldreihenfolge in der Tabelle und nicht vom Feldnamen abhängt, geht das höchstwahrscheinlich dann schief, wenn man später mal ein Feld dazwischen einfügt oder verschiebt und auf diese Abfrage vergisst. Und so einen Fehler zu finden ist doppelt schwer, ich würde dir daher davon abraten, man erspart sich meiner Meinung nach nicht viel und riskiert dabei aber eine Menge.

          bye,
          Helmut

          Comment

          Working...
          X