Trigger: Tabelle erzeugen mit geänderten Inhalten

MysterioJN

SQL-Guru
Beiträge
158
Wenn ich die Tabelle: ArtikelStamm habe, und dort irgendwer irgendwas ändert, soll er mir in einer andern Tabelle die geänderten Daten anzeigen.

Beispiel: Wenn sich der Artikeltext, die Auflage, oder egal was im Datensatz ändert, benötige ich eine entsprechende Information in einer anderen (temporären?) Tabelle.

BEDINGUNG muss sein:
Nur Datensatzänderungen "Dokumentieren" wenn ein Artikel: ImVertrieb = true ist.
Wenn der Datensatz ImVertrieb = false hat, soll er das nicht beachten/Änderung dokumentiere
n.
 
Werbung:
Ich nutze dafür eine Log-Tabelle in die ich alle Informationen rein schreibe. Allerdings nicht jedesmal den kompletten Datensatz sondern pro (geändertem, neuem oder gelöschten) Attribut ein eigenen Datensatz in die Log-Tabelle. Beispiel:
Code:
CREATE TRIGGER   [dbo].[ArtikelStamm_insert_log]
   ON       [dbo].[ArtikelStamm]
   FOR INSERT, UPDATE, DELETE
AS

BEGIN
   SET NOCOUNT ON;

   IF     UPDATE(Artikeltext)
   BEGIN
     INSERT INTO ArtikelStamm_log(pk,fk_ArtikelStamm,benutzer,datum,spalte,aktion,neu,alt)
     SELECT   newid() AS pk,
         i.pk AS fk_ArtikelStamm,
         SYSTEM_USER AS benutzer,
         getdate() AS datum,
         'ArtikelStamm.Artikeltext' AS spalte,
         ( CASE WHEN i.pk IS NOT NULL AND d.pk IS NOT NULL THEN   'Update' WHEN i.pk IS NOT NULL AND d.pk IS NULL THEN 'Insert' END ) AS aktion,
         cast(i.Artikeltext AS VARCHAR(300)) AS neu,
         cast(d.Artikeltext AS VARCHAR(300)) AS alt
     FROM   INSERTED i
     FULL JOIN DELETED d ON i.pk = d.pk
     WHERE   i.Artikeltext IS NOT NULL
     AND     d.Artikeltext IS NULL
     OR     d.Artikeltext IS NOT NULL
     AND     i.Artikeltext IS NULL
     OR     i.Artikeltext != d.Artikeltext

--     [...]
   END
END
Für jede Spalte die geloggt werden soll gibt es so ein INSERT Statement. Du müsstest also für Spalten wie Auflage genauso einen Block bei [...] einfügen. Da ich den alten und den neuen Wert immer in eine Spalte schreibe musst du natürlich darauf achten das das Format immer stimmt, also ggf. Zahlen konvertieren oder wie im Beispiel den Text auf 300 Zeichen kürzen (bei mir werden maximal 300 Zeichen geloggt, läßt sich natürlich ändern).
 
Zurück
Oben