Announcement

Collapse
No announcement yet.

update Trigger

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

  • update Trigger

    Hallo,

    ich lerne gerade mit Triggern umzugehen:

    habe folgenden Teil eines Update-Triggers


    ...

    CREATE Trigger trg_test_kunden_update on test_kunden for update
    AS

    DECLARE @partner as INT;
    DECLARE @partner_tmp as INT;
    DECLARE @kunde as INT;
    DECLARE @id as INT;

    -- den gerade aktualisierten Datensatz auslesen
    SELECT @partner=kdnrpartner, @kunde=kdnr, @id=id from test_kunden where id=@@IDENTITY;

    .....
    .....


    Mit "@@IDENTITY" wollte ich die ID des Datensatzes, dessen Aktualisierung zum Auslösen des Triggers führte, auslesen. Dann habe ich gelesen, dass @@IDENTITY nur die ID des zuletzt eingeführten Datensatzes ermittelt.
    WIe kann ich die ID des aktualisierten ermitteln ?

    Florian

  • #2
    Hallo,

    beim MS SQL Server ist ein "normaler" Trigger ein AFTER-Trigger, der erst dann ausgelöst wird, wenn die aufgerufene SQL-Anweisung (UPDATE, INSERT oder DELETE) für eine Tabelle fehlerfrei ausgeführt wurde. Beim Microsoft SQL Server sind im Trigger zwei Hilfstabellen sichtbar. Die Tabelle Inserted enthält eine Kopie der neu hinzugekommenen beziehungsweise geänderten Datensätze, während die Tabelle Deleted eine Kopie der gelöschten Datensätze enthält. Wird jedoch ein Datensatz geändert, sind beide virtuellen Tabellen gefüllt. Die Tabelle Deleted enthält dabei die alten, vor dem UPDATE-Aufruf gültigen Werte, während die Tabelle Inserted die von der UPDATE-Anweisung neu zugewiesenen Werte bereithält. Somit kann der Trigger über einen JOIN direkt auf die Daten der einzelnen Spalten der betroffenen Tabelle zugreifen. Der Trigger wird unabhängig von der Anzahl der betroffenen Datensätze immer nur einmal am Ende gefeuert. Dadurch muss man damit rechnen, dass in der Tabelle Inserted beziehungsweise Deleted mehrere Datensätze vorgefunden werden.

    In einem Beispiel könnte die Aktualisierung so aussehen:

    Code:
    USE tempdb
    GO
    
     
    CREATE TABLE UpdateTriggerDemo
    (
      rec_id  INT         NOT NULL IDENTITY PRIMARY KEY,
      wert    NVARCHAR(9) NOT NULL,
      datum   DATETIME    NULL 
    )
    GO
    INSERT INTO dbo.UpdateTriggerDemo (wert) VALUES ('Test1');
    INSERT INTO dbo.UpdateTriggerDemo (wert) VALUES ('Test2');
    INSERT INTO dbo.UpdateTriggerDemo (wert,datum) VALUES ('Test3',CURRENT_TIMESTAMP);
    GO
    
    CREATE TRIGGER trUpdateTriggerDemp_UPD 
      ON dbo.UpdateTriggerDemo
      FOR UPDATE
    AS
      UPDATE dbo.UpdateTriggerDemo SET 
        datum = GETDATE()
      FROM 
        dbo.UpdateTriggerDemo S
          JOIN Inserted I ON I.rec_id = S.rec_id;
      PRINT 'Trigger hat gefeuert!';
    GO

    Comment

    Working...
    X