2010-11-19 27 views
0

混淆触发器:我有两种类型的记录,'L'库和'N'正常。当更新或插入'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

您的基本错误是,你似乎想到这个触发一次针对每行调用。这是不是的情况 - 它将被称为每批次一次。

所以这里这个声明是行不通的,很多次:

select @insertedType = i.type 
from inserted i 

会是什么是选择,如果你有你的inserted伪表10项?

您需要重写触发器才能考虑到inserted表可以包含多行

+0

哇。我完全错过了。谢谢 – 2010-11-20 20:50:18

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