2010-11-19 3 views
0

トリガーについての混乱:「L」ライブラリーと「N」ノーマルの2種類のレコードがあります。 'N'が更新または挿入されると、対応する 'L'を更新する必要があります。 'L'レコードの更新は更新しないでください。 このコードは更新を成功させるものではありません。どうして?Microsoft SQL 2005のシンプルなトリガー方法:何も更新しないトリガーをコード化しましたか?

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 

答えて

1

あなたの基本的なエラーは、このトリガーは、各行に1回呼び出されることを期待するように見えるということです。これはNOTケースです。これは、各バッチに対して1回呼び出されます。

は、だからここにこの文は、何度も仕事に行くされていません。

select @insertedType = i.type 
from inserted i 

何であろうと選択し、あなたのinserted擬似テーブル内の10個のエントリを持っている場合は?

insertedテーブルに複数の行が含まれることを考慮に入れて、トリガーを書き直す必要があります

+0

ワウ。私は完全にそれを逃した。ありがとう –

1

トリガーは更新ごとに複数の行をサポートする必要があります。

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 
関連する問題