Announcement

Collapse
No announcement yet.

Trigger nur bei tatsächlicher Datenänderung

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

  • Trigger nur bei tatsächlicher Datenänderung

    Hallo!

    Mir ist aufgefallen, dass Trigger im MS SQL Server auch dann aktiviert werden, wenn es gar keine tatsächliche Datenänderung gibt.
    Also nimmt man z.B. diesen Befehl:

    UPDATE Tabelle
    SET Spalte1 = 'abc'
    WHERE (0 = 1)

    Dieser ändert nichts, feuert aber trotzdem den UPDATE-Trigger an der Tabelle. Dieser Trigger macht eventuell weitere updates, die abhängig sind von Inserted und Deleted, da diese leer sind, wird aber wieder nichts geändert, trotzdem werden die Trigger an den abhängigen Tabellen aktiviert und so triggert es sich durch die ganze Datenbank, obwohl gar nichts verändert wurde.

    Bevor ich jetzt anfange und bei jedem der 200 Trigger, die wir haben, am Anfang zu überprüfen, ob INSERTED und DELETED mindestens einen Eintrag enhalten, wollte ich mal fragen, ob es dafür eventuell eine globale Einstellung im MS SQL Server gibt. Also praktisch sowas wie "Trigger werden nur ausgelöst, wenn sich Daten ändern".

    Danke.

  • #2
    Welche Version?
    Vielleicht entspricht das Deiner:
    http://support.microsoft.com/kb/124015
    Gruß, defo

    Comment


    • #3
      Meine SQL Server Version ist 2008R2, aber das Programm muss sowieso auf diversen Versionen laufen. Scheint so als wäre es ein bekanntes Problem und man muss wohl wirklich manuell in jedem Trigger prüfen, ob sich wirklich etwas geändert hat.

      Comment


      • #4
        Originally posted by Rya View Post
        Scheint so als wäre es ein bekanntes Problem und man muss wohl wirklich manuell in jedem Trigger prüfen, ob sich wirklich etwas geändert hat.
        Ich arbeite schon länger nicht produktiv mit SQL Server, aber das hat mich etwas gewundert.
        Hier müsste es aber einige Leute geben, die da Praxis Erfahrung haben und vlt den berühmten "best practice" Tip kennen.
        Vielleicht hilft ein Trigger Rumpf Template mit @@rowcount schon weiter.
        Gruß, defo

        Comment


        • #5
          Ich hab da kein BestPractice zur Hand aber das Verhalten finde ich völlig korrekt. Trigger werden je Statement gefeuert und nicht je Änderung. Das schließt dann eben auch die 0 Änderung ein. Den Wert das Verhalten ändern zu können geht gefühlt gegen null. Das global ändern zu können halte ich für einen Knieschuss auf Ansage. Wenn willst du das je Trigger/Triggergruppe einstellen und auf keinen Fall global. Ok dir würde es jetzt gerade scheinbar helfen. Ich denke aber nur weil du nur eine bestimmt Sorte von Triggern im Kopf hast. Was ist zum Beispiel mit den bereits vorhanden Triggern auf Systemtabellen? Möglicherweise verlassen sich die auf dieses verhalten. Zumindest FOR und INSTEAD-OF Trigger sollten immer gefeuert werden wenn ein entsprechende Statement gefeuert wird egal wieviele Zeilen der Tabelle betroffen sind(0-N). Keine Ahnung ob After Trigger auch feuern da wäre ich zumindest für Diskussionen offen (obwohl eher synfrei da wir keine Möglichkeit haben das Verhalten dann auch zu ändern)

          Comment

          Working...
          X