2010-11-19 2 views
0

Verwirrt über Trigger: Ich habe zwei Arten von Datensätzen, "L" -Bibliothek und "N" normal. Wenn ein 'N' aktualisiert oder eingefügt wird, muss ich das entsprechende 'L' aktualisieren. Aktualisierungen von 'L'-Datensätzen sollten sich nicht selbst aktualisieren. Dieser Code lässt eine Aktualisierung nicht erfolgreich sein. Warum?Microsoft SQL 2005 Simple Trigger Gewusst wie: Codiert einen Trigger, der nichts aktualisiert?

ALTER trigger updateProductLibrary 
on Product 
after update as 
BEGIN 
    -- either deleted (old) or inserted (new) 
    declare @counter int, @insertedType char(1) 
    set @insertedType = 'Z' 

    select @insertedType = i.type 
    from inserted i 

    if(@insertedType = 'N') 
    begin 
     select @counter = count(*) 
     from product p join inserted i on 
     p.sku = i.sku and 
     p.type = 'L' -- for library 

     if(@counter > 0) -- update 
     BEGIN 
      update p set name = i.name 
      from product p join inserted i on 
       p.sku = i.sku and 
       p.type = 'L' 
     END 
     ELSE -- insert 
     BEGIN 
      insert into product (sku, name, type) 
      select i.sku, i.name, 'L' 
      from inserted i 
     END 
    END 
END 

Antwort

1

Ihr Grundfehler ist, dass Sie erscheinen diese Trigger zu erwarten für jede Zeile einmal aufgerufen werden. Dies ist NICHT der Fall - es wird einmal für jede Charge aufgerufen werden.

Also diese Aussage hier funktionieren wird, nicht oft:

select @insertedType = i.type 
from inserted i 

Was würde das wählen, wenn Sie haben 10 Einträge in Ihrer inserted pseudo-Tabelle ??

Sie müssen Ihren Trigger neu schreiben, um zu berücksichtigen, dass die inserted Tabelle mehrere Zeilen enthalten kann!

+0

Wow. Das habe ich komplett vermisst. Vielen Dank –

1

Ihr Trigger muss mehrere Zeilen pro Update unterstützen.

ALTER TRIGGER updateProductLibrary ON dbo.Product AFTER UPDATE 
AS 
BEGIN 
    UPDATE p 
    SET name = i.name 
    FROM inserted i 
     INNER JOIN dbo.Product p 
      ON p.sku = i.sku 
      AND p.type = 'L' 
    WHERE i.type = 'N' 

    INSERT INTO product (sku, name, type) 
    SELECT i.sku, i.name, 'L' 
    FROM inserted i 
    WHERE i.type = 'N' 
     AND i.sku NOT IN 
      (SELECT p.sku 
      FROM dbo.Product p 
      WHERE p.type = 'L') 
END