Помогите с триггером для MSSQL 2000
От: iGrog Финляндия  
Дата: 09.09.10 09:45
Оценка:
Я не силен в БД, и в триггерах особенно.
Надо сделать так, что бы триггер отрабатывал и на многострочный UPDATE (UPDATE, который затрагивает сразу много строк).

Сейчас он выглядит так и работает только если обновлять строку по одной:


DECLARE @newid INT
    DECLARE @brutto money
    DECLARE @discount money
    DECLARE @ean NVARCHAR(13)
    SELECT @newid=id FROM inserted
    SELECT @ean = [ean] FROM inserted
    SELECT @brutto = [brutto] FROM inserted
    SELECT @discount = [discount_percent] FROM inserted

IF UPDATE(discount_percent)
    BEGIN
        UPDATE FirstTable
        SET discount = brutto - (brutto*@discount/100)
        WHERE id = @newid
        
        IF ((SELECT COUNT(*) FROM SecondTable
            WHERE Product_ID = @ean) > 0)
        BEGIN
            UPDATE SecondTable
            SET Discount=@discount
            WHERE Product_ID = @ean
        END
        ELSE
        BEGIN
            IF (@discount > 0)
            BEGIN
                INSERT INTO SecondTable
                (Product_ID, Quantity, Discount) VALUES (@ean, 1, @discount)
            END
        END
    END


Структура старая и мне её никак не изменить. Код тоже достался в наследство
Смысл действа такой, что если поменялась скидка — пересчитать окончательную сумму со скидкой в одной таблице,
и обновить/добавить запись относительно скидки на этот товар в другой таблице.

Если первый UPDATE я еще понимаю как сделать:

        UPDATE FirstTable
        SET discount = brutto - (brutto*@discount/100)
        WHERE id IN (SELECT id FROM inserted)


то как мне сделать проверку на существование соответствующих записей во второй таблице и обновлении её (или добавлении туда отсутствующих записей)?
Re: Помогите с триггером для MSSQL 2000
От: Lloyd Россия  
Дата: 09.09.10 10:02
Оценка: 6 (1)
Здравствуйте, iGrog, Вы писали:

G>то как мне сделать проверку на существование соответствующих записей во второй таблице и обновлении её (или добавлении туда отсутствующих записей)?


Как-то так:
IF UPDATE(discount_percent)
BEGIN
    UPDATE FirstTable
    SET discount = brutto - (brutto * i.discount_percent / 100)
    FROM FirstTable
    JOIN inserted i ON i.id = FirstTable.id
    
    UPDATE SecondTable
    SET Discount = i.discount_percent
    FROM SecondTable
    JOIN inserted i ON i.ean = SecondTable.Product_ID

    INSERT INTO SecondTable (Product_ID, Quantity, Discount)
    SELECT i.ean, 1, i.discount_percent
    FROM inserted i 
    LEFT JOIN SecondTable ON SecondTable.Product_ID = i.ean
    WHERE SecondTable.Product_ID IS NULL
END
Re[2]: Помогите с триггером для MSSQL 2000
От: iGrog Финляндия  
Дата: 09.09.10 10:12
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Как-то так:


Спасибо. Все гениальное — просто!
Re[3]: Помогите с триггером для MSSQL 2000
От: Lloyd Россия  
Дата: 09.09.10 10:17
Оценка:
Здравствуйте, iGrog, Вы писали:

L>>Как-то так:


G>Спасибо. Все гениальное — просто!


Вы сначала проверьте. Я "на бумажке" писал, наверняка где-то ошибся.
Re: Помогите с триггером для MSSQL 2000
От: SLGLADKOV Россия  
Дата: 09.09.10 11:22
Оценка:
Здравствуйте, iGrog, Вы писали:

G>Я не силен в БД, и в триггерах особенно.

G>Надо сделать так, что бы триггер отрабатывал и на многострочный UPDATE (UPDATE, который затрагивает сразу много строк).

Посмотрите на следующий код может он поможет решить проблему.
DECLARE @newid INT
DECLARE @brutto money
DECLARE @discount money
DECLARE @ean NVARCHAR(13)
IF UPDATE(discount_percent)
BEGIN
DECLARE inserted_Cursor CURSOR LOCAL READ_ONLY FORWARD_ONLY
FOR SELECT id,[ean],[brutto],discount_percent]
FROM inserted
ORDER BY id
OPEN inserted_Cursor
FETCH NEXT FROM inserted_Cursor INTO @newid,@ean,@brutto,@discount
WHILE (@@FETCH_STATUS = 0) AND (@RetCode=0)
BEGIN
UPDATE FirstTable
SET discount = brutto — (brutto*@discount/100)
WHERE id = @newid
IF ((SELECT COUNT(*) FROM SecondTable
WHERE Product_ID = @ean) > 0)
BEGIN
UPDATE SecondTable
SET Discount=@discount
WHERE Product_ID = @ean
END
ELSE
BEGIN
IF (@discount > 0)
BEGIN
INSERT INTO SecondTable
(Product_ID, Quantity, Discount) VALUES (@ean, 1, @discount)
END
END
FETCH NEXT FROM inserted_Cursor INTO @newid,@ean,@brutto,@discount
END
END
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.