Microsoft SQL 2005 Простой триггер Как кодировать триггер, который ничего не обновляет? - PullRequest
0 голосов
/ 19 ноября 2010

Запутался насчет триггеров: у меня есть два типа записей: библиотека '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 ]

1 голос
/ 19 ноября 2010

Ваш триггер должен поддерживать несколько строк на обновление.

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
1 голос
/ 19 ноября 2010

Ваша основная ошибка заключается в том, что вы ожидаете, что этот триггер будет вызываться один раз для каждой строки. Это НЕ случай - он будет вызываться один раз для каждой партии.

Так что это утверждение здесь не сработает, много раз:

select @insertedType = i.type
from inserted i

Что бы вы выбрали, если у вас есть 10 записей в вашей inserted псевдотаблице ??

Вам нужно переписать триггер, чтобы учесть, что таблица inserted может содержать несколько строк !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...