Stefan: MSSQL Trigger für Update/insert => TS + Checksum?

Hallo zusammen

ich bin ein Neuling im Bereich MSSQL und möchte gerne meine vorhandene Warenwirtschaft etwas verbessern, bzw mit einem Script auslesen/weiterbearbeiten.

Nun würde ich gerne feststellen, wann und ob etwas in der Tabelle ARTIKEL geändert wurde, um nicht bei jedem Abruf alle 80000 Artikel prüfen zu müssen, sondern nur die zuletzt geänderten.

Da ich keinen Zugriff auf den Quellcode habe, muss ich über die Datenbank arbeiten.

Jetzt habe ich gesehen dass es Trigger gibt...

Kann ich einen Trigger so anlegen, dass er bei jedem Update/Insert in der Tabelle Artikel beim entsprechenden Eintrag einen Timestamp und eine Checksum des Datensatzes in die Tabelle Artikel schreibt?

Ich würde die Tabelle Artikel also einfach um eine Spalte TS und Checksum erweitern wollen und dort dann bei jedem Update/Insert die entsprechenden Werte eintragen wollen...

Geht das so?
Wenn ja, wie geht das am besten?

DANKE im Voraus!!!

  1. Tach!

    Kann ich einen Trigger so anlegen, dass er bei jedem Update/Insert in der Tabelle Artikel beim entsprechenden Eintrag einen Timestamp und eine Checksum des Datensatzes in die Tabelle Artikel schreibt?

    Ja, ich denke schon.

    Wenn ja, wie geht das am besten?

    Du nimmst dir die Dokumentation deines Systems und liest dich in das Thema Trigger ein. Und wenn du beim Implementieren oder anderweitig ein Verständnisproblem hast, fragst du nochmal konkret nach.

    dedlfix.

    1. Hallo,

      so die erste Version habe ich, nur updatet der mir so natürlich bei jedem Update/Insert alle Einträge.
      Der Trigger sollte aber nur den betreffenden Eintrag ändern...
      geht das irgendwie?
      fallen Euch sonst noch Fehler auf?

      DANKE im Voraus

        
      USE [eazybusiness]  
      GO  
        
      SET ANSI_NULLS ON  
      GO  
      SET QUOTED_IDENTIFIER ON  
      GO  
        
        
      ALTER TRIGGER [dbo].[updateTS]  
         ON  [dbo].[bm_sonderpreis]  
         AFTER INSERT,UPDATE  
      AS  
      BEGIN  
        
      	-- SET NOCOUNT ON added to prevent extra result sets from  
      	-- interfering with SELECT statements.  
      	SET NOCOUNT ON;  
        
          -- Insert statements for trigger here  
      UPDATE bm_sonderpreis SET lastupdate  = GETDATE()  
        
      END  
      
      

      Tach!

      Kann ich einen Trigger so anlegen, dass er bei jedem Update/Insert in der Tabelle Artikel beim entsprechenden Eintrag einen Timestamp und eine Checksum des Datensatzes in die Tabelle Artikel schreibt?

      Ja, ich denke schon.

      Wenn ja, wie geht das am besten?

      Du nimmst dir die Dokumentation deines Systems und liest dich in das Thema Trigger ein. Und wenn du beim Implementieren oder anderweitig ein Verständnisproblem hast, fragst du nochmal konkret nach.

      dedlfix.

      1. Tach!

        Bitte nicht im TOFU-Stil zitieren. Danke.

        so die erste Version habe ich, nur updatet der mir so natürlich bei jedem Update/Insert alle Einträge.

        Ja, klar.

        BEGIN
        UPDATE bm_sonderpreis SET lastupdate  = GETDATE()
        END

        Wenn du ein Statement als auszuführen angibst, dann wirkt das im Wesentlichen auch so, wie wenn es außerhalb eines Triggers stünde.

        Der Trigger sollte aber nur den betreffenden Eintrag ändern...
        geht das irgendwie?

        Natürlich. Du musst nur die zu verändernden Felder angeben. Ich kenne die Syntax nicht, aber soweit ich das gesehen habe, bezieht man sich auf die geänderte Menge mit den speziellen Tabellennamen INSERTED oder UPDATED.

        dedlfix.

      2. Hallo,

        du könntest auch einfach nur eine "Timestamp" Spalte anfügen, diese wird dann automatisch bei Updates und Inserts gepflegt. Will heissen, die Datenbank Engine schreibt selbst einen neuen binären Wert hinein. Der Wert wird auch jedes mal automatisch erhöht, so dass man damit sortieren und darauf filtern kann um alle geänderten Datensätze seit einem gewissen früheren Stand zu bekommen. Der Name "Timestamp" für den Datentyp ist vielleicht etwas unglücklich gewählt.

        Warum dein Trigger nicht so richtig will liegt daran, dass du nicht mit den "pseudo"-Tabellen [inserted] und [deleted] arbeitest. Im Falle eines Inserts beinhaltet "inserted" den neuen Datensatz in der selben Struktur wie die geänderte Tabelle, bei einem Update hat "deleted" die alte Version des Datensatzes und "inserted" die neue Version.

        Das Update im Trigger müsste dann quasi lauten

        UPDATE t
        SET lastupdates = GetDate()
        FROM bm_sonderpreis t
        INNER JOIN [inserted] i ON .Id = t.Id

        Ich gehe mal davon aus, dass bm_sonderpreis eine eindeutige Primärschlüsselspalte namens "Id" hat. Ansonsten müsstest du entsprechend auf den Primärschlüssel joinen, den du hast.

        Cheers, Frank

  2. hi,

    Kann ich einen Trigger so anlegen, dass er bei jedem Update/Insert in der Tabelle Artikel beim entsprechenden Eintrag einen Timestamp und eine Checksum des Datensatzes in die Tabelle Artikel schreibt?

    Das kannst Du auch ohne Trigger machen.

    Ich würde die Tabelle Artikel also einfach um eine Spalte TS und Checksum erweitern wollen und dort dann bei jedem Update/Insert die entsprechenden Werte eintragen wollen...

    Das ist nicht im Sinne eines Triggers. Mit einem Trigger kriegst Du über die _Engine_ Informationen über die Ausführung bestimmter Statements auf eine bereits vorhandene Tabelle, z.B. Insert/Update Table Article, ohne dass an den Statements oder an der Tabelle was geändert werden muss.

    Nutze die Engine und schreibe Trigger-Resultate in eine etxtra Tabelle.

    Hotti

    1. Moin hotti,

      Kann ich einen Trigger so anlegen, dass er bei jedem Update/Insert in der Tabelle Artikel beim entsprechenden Eintrag einen Timestamp und eine Checksum des Datensatzes in die Tabelle Artikel schreibt?

      Das kannst Du auch ohne Trigger machen.

      Wie soll das gehen? Bedenke: die Applikation, die die Daten erzeugt, darf nicht verändert werden.

      Ich würde die Tabelle Artikel also einfach um eine Spalte TS und Checksum erweitern wollen und dort dann bei jedem Update/Insert die entsprechenden Werte eintragen wollen...

      Das ist nicht im Sinne eines Triggers.

      Unsinn. Trigger sind unter anderem genau dafür da.

      Mit einem Trigger kriegst Du über die _Engine_ Informationen über die Ausführung bestimmter Statements auf eine bereits vorhandene Tabelle, z.B. Insert/Update Table Article, ohne dass an den Statements oder an der Tabelle was geändert werden muss.

      Trigger im Kontext von Datenbanken sind Event-basierte Aktionen. Nicht mehr und nicht weniger. Sie werden gerne benutzt, um automagische™ Felder zu pflegen oder wie im Falle des OP, wenn man nicht an der Applikation selber schreiben kann. Auch Replikation habe ich schonmal mit Triggern umgesetzt gesehen.

      Nutze die Engine und schreibe Trigger-Resultate in eine etxtra Tabelle.

      Ich sehe aufgrund der geschilderten Fakten keinen Grund, die beiden Felder auszulagern.

      LG,
       CK