代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

Microsoft SQL 2005简单触发器如何:编写不更新任何内容的触发器?

  •  0
  • Zachary Scott  · 技术社区  · 14 年前

    对触发器感到困惑:我有两种类型的记录,“L”库和“N”正常。当“N”被更新或插入时,我需要更新相应的“L”。“L”记录的更新不应更新自身。 此代码不允许更新成功。为什么?

    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
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   marc_s    14 年前

    基本错误是,您似乎希望每行调用一次此触发器。这是 不是 案例-每批都会调用一次。

    所以这句话不管用,很多次:

    select @insertedType = i.type
    from inserted i
    

    如果您的 inserted 伪表??

    你需要重写你的触发器来考虑 插入 表可以包含 多行 !

        2
  •  1
  •   Anthony Faull    14 年前

    每次更新时,触发器需要支持多行。

    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