Announcement

Collapse
No announcement yet.

Trigger in MSSQL

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

  • Trigger in MSSQL

    Hallo, ich hab mich schon ein bisschen durch die Boardsuche gehangelt, hab aber nicht wirklich das gefunden was ich brauch, bzw bin mit dem gefundenen nicht 100% klar gekommen.

    Ich habe folgendes Problem:
    Ich habe mehrere Tabellen und wenn in diesen Tabellen was geändert und/oder eingefügt wird, soll in einer extra Tabelle ein Datensatz angelegt werden, in dem beim Ändern z.B der Vorherige Datensatz(in einem varchar Feld) mit dem Benutzer und der Zeit eingetragen wird.

    Ich weiß, dass ich bei jeder Tabelle für das einfügen bzw Updaten nen Trigger brauche
    Ich habe es auch schon geschafft, wenn ich in einer der Tabellen was einfüge, dass ich in die extra Tabelle etwas reinschreibe, aber leider nicht das was ich eingefügt habe.

    Create Trigger Trigger01 ON Artikel
    after Insert
    as
    Insert into Test (Vorher, Nachher, Name, Datum)
    Values ('Test', 'Test', suser_sname(), Getdate())

    Das war mein Versuch um überhaupt etwas einzufügen.

    Wenn ich ja was einfüge, dann muss ich das ja irgendwie wissen bzw abfangen, damit ich es ja dann in die andere Tabelle schreiben kann bzw zuerst das alte rauskopieren kann und dann dann neu reinschreiben kann.
    Also Theoretisch ist mir das vorgehen klar, nur irgendwie kann ich es nicht umsetzten.

    Ich wäre um etwas hilfe dankbar

    Jonas

  • #2
    Hallo,

    das folgende Beispiel sollte weiterhelfen. Der Trigger kann zur Laufzeit auf die virtuellen Hilfstabellen Inserted und Deleted zurückgreifen. Das sind keine Variablen, sondern temporäre Datensätze, über die die Spaltenwerte abgerufen werden können. Der Inserted-Datensatz enthält die einzufügenden Werte, und der Deleted-Datensatz enthält die originalen Werte (also den alten Zustand des Datensatzes). Im Beispiel lasse ich alle UPDATE- und DELETE-Aufrufe für die Kunden-Tabelle in der KundenLog-Tabelle mitprotokollieren:

    Code:
    CREATE TABLE Kunden 
    (
      KdnNr    INT         NOT NULL IDENTITY PRIMARY KEY,
      Nachname VARCHAR(35) NOT NULL,
      Vorname  VARCHAR(15) NOT NULL,
      PLZ      CHAR(5)    NOT NULL,
      Ort      VARCHAR(50) NOT NULL
    )
    GO
    
    CREATE TABLE KundenLog 
    (
      RecID    INT         NOT NULL IDENTITY PRIMARY KEY,
      KdnNr    INT         NOT NULL,
      Mode    CHAR(1)      NOT NULL,
      EditUser VARCHAR(20)  NOT NULL,
      EditOn   DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
      Nachname VARCHAR(35)  NOT NULL,
      Vorname  VARCHAR(15)  NOT NULL,
      PLZ      CHAR(5)      NOT NULL,
      Ort      VARCHAR(50)  NOT NULL
    )
    GO
    
    CREATE TRIGGER trKundenUPDATE ON dbo.Kunden FOR UPDATE
    AS
      INSERT INTO dbo.KundenLog 
        (KdnNr,Mode,EditUser,Nachname,Vorname,PLZ,Ort) 
      SELECT KdnNr,'U',USER,Nachname,Vorname,PLZ,Ort FROM inserted
    GO
    
    CREATE TRIGGER trKundenDELETE ON Kunden FOR DELETE
    AS
      INSERT INTO KundenLog 
        (KdnNr,Mode,EditUser,Nachname,Vorname,PLZ,Ort) 
      SELECT KdnNr,'D',USER,Nachname,Vorname,PLZ,Ort FROM deleted
    GO
    Angenommen, in die Tabelle Kunden wird ein Testdatensatz eingetragen und danach über ein UPDATE-Anweisung geändert. Zu Schluss wird dieser Testdatensatz gelöscht:

    Code:
    UPDATE dbo.Kunden SET Ort = 'Neu' WHERE KdnNr = 1;
    DELETE FROM dbo.Kunden WHERE KdnNr = 1;
    In der Protokoll-Tabelle KundenLog sind beide Aktionen zu finden.

    Comment


    • #3
      Danke, dein Beitrag hat mir sehr geholfen.

      Ich hab jetzt noch bissi rumprobiert und z.Z sieht es so aus

      Create Trigger Trigger01 On Artikel
      for insert
      as
      Declare @tmp1 as varchar(15);
      Declare @tmp2 as varchar(15);
      Declare @tmp3 as varchar(70);
      Set @tmp1 = (Select cast(EKPreis as varchar(15)) from inserted)
      set @tmp2 = (Select cast(VKPreis as varchar(15)) from inserted)
      set @tmp3 = (Select Beschreibung from inserted)
      Insert into Test (ID,Beschreibung,Name,Datum)
      Select ArtikelID,(@tmp3 + ' | ' + @tmp1 + ' | ' + @tmp2),suser_sname(),GEtdate()
      from inserted
      go

      Ich werd sicher noch paar feinheiten einbauen, aber das grobe Prinzip funktioniert nun

      Danke

      Jonas

      Comment

      Working...
      X