Announcement

Collapse
No announcement yet.

Trigger bei Änderung des Werts eines Datenbankfeldes

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

  • Trigger bei Änderung des Werts eines Datenbankfeldes

    Hi All,

    gibt es denn eine Möglichkeit z. B. eine StoredProc automatisch
    auszulösen, sobald sich der Wert eines Datenbankfeldes von z. B.
    0 auf 1 ändert? Ich dachte da etwa an Trigger, hab aber bisher nur
    was von Insert, Update und Delete gelesen.

    Andi

  • #2
    hallo,
    wenn sich was ändert ist der update-Trigger dein Freund.
    Dabei kannst du ihn so anlegen dass er nur updates auf ein bestimmtes Feld überwacht.

    Das habe ich auch schon mal gefragt und dazu müsste es hier im Forum etwas geben. Einfach mal suchen

    --edit--
    Ach ja du kannst auch den Wert anschauen so dass du nicht nur Updates auf ein Feld prüfst sondern du kannst auch Feld1 von 0 auf 1 machen.
    Dann löst er nicht aus wenn Feld1 von 1 auf 0 geupdatet wurde.

    Comment


    • #3
      OK, Danke für den Tipp. Hier meine Lösung:

      Code:
      CREATE TRIGGER [dbo].[Meintrigger]
      ON [dbo].[MeineTabelle]
      FOR UPDATE 
      AS 
      
      DECLARE @ID int
      DECLARE @Feld1 bit
      
      BEGIN 
         IF UPDATE(Feld1) BEGIN
      
            SELECT @Feld1 = Feld1, @ID = ID FROM INSERTED
      
            IF @Feld1 = 1   -- wird nur ausgefuehrt, wenn sich Feld 1 auf den Wert 1 aendert		
               EXEC MeineStoredProc
            END
      
      END

      Comment


      • #4
        hallo,
        ja sollte passen allerdings wird er -vermute ich mal- auch geführt wenn du Feld1 von 1 auf 1 änderst

        Comment


        • #5
          Ja, da hast Du wahrscheinlich Recht. Ich habs zwar nicht getestet, den Trigger aber geändert:

          Code:
          CREATE TRIGGER [dbo].[MeinTrigger]
          ON [dbo].[MeineTabelle]
          FOR UPDATE 
          AS 
          
          DECLARE @Feld1_alt bit
          DECLARE @Feld1_neu bit
          DECLARE @ID int
          
          BEGIN 
          
             IF UPDATE(Feld1) BEGIN
          
                SELECT @Feld1_alt = Feld1 FROM DELETED
                SELECT @Feld1_neu = Feld1, @ID = ID FROM INSERTED
          		
                IF @Feld1_alt = 0 AND @Feld1_neu = 1
                   EXEC MeineStoredProc
          
             END
          END

          Comment


          • #6
            hallo,
            könnte so funktionieren. Musst du halt mal testen, wie es sich tatsächlich verhält.

            Als ich damals mal einen Trigger geschrieben habe, machte es noch einen Unterschied ob ich einen Datensatz über die Anwendung geändert habe oder per Update-Befehl direkt auf die Tabelle mehrere Datensätze durch "lockere" Where-Bedingung geändert wurden. Ich tippe mal drauf du hast hier das gleiche "Problem" dass dein Trigger dir nur einen Datensatz beachtet. aber evtl. ist das auch egal da deine SP keine Parameter übergeben bekommt.

            Comment


            • #7
              Ja, er könnte funktionieren ... wenn immer nur & ausschließlich ein Datensatz je Transaktion geändert wird.

              Ein Trigger wird einmalig am Ende einer Transaktion gefeuert. Entsprechend stehen in den virtuellen Tabellen 0-n Datensätze.
              Die vorherigen Select Abfragen

              SELECT @Feld1_alt = Feld1 FROM DELETED

              liefern Dir das Ergebnis eines Datensatzes aus den n vorhandenen; die des letzten abgearbeiteten. Und das ist wiederum eher Zufallwert und ich würde keine Wette darauf eingehen, das DELETED und INSERTED die gleiche "Reihenfolge" der Datensätze haben; ergo müssen Alt und Neu sich nicht auf den gleichen Datensatz beziehen.

              Wenn also diese Werte des jeweils einen Datensatzes aus INSERTED und DELETED der IF Bedingungen entsprechen, wird anschließend die SP ausgeführt.
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment

              Working...
              X