Как связать другую таблицу с моим триггером? - PullRequest
0 голосов
/ 21 февраля 2020

Я новичок в SQL, но я пытаюсь создать триггер, который проверяет, что цены соответствующим образом изменены. Однако один из нужных мне столбцов взят из другой таблицы, и я не совсем уверен, как объявить эту переменную. Это моя текущая попытка.

Таблица ACCESSORY является дочерней по отношению к таблице PRODUCT, связанной с ProductCode, и имеет только 1 другой столбец с именем Class, который обозначает классификацию. Триггер, который я создал, в настоящее время предназначен для таблицы PRODUCT, так как именно там записаны все цены.

CREATE TRIGGER PriceCheck1
ON PRODUCT
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @ProductCode AS Char(6),
            @ProductName AS VarChar(50),
            @StockLevel  AS Int,
            @OldPrice    AS Deciaml(10,2), @NewPrice AS Deciaml(10,2),
            @ProductType AS VarChar(9)
            --@Class       AS VarChar(20)

    SELECT  
        @ProductCode = ProductCode, @ProductName = ProductName,
        @StockLevel = ProductStockLevel, @NewPrice = ProductPrice,
        @ProductType = ProductType --@Class = Class
    FROM    
        inserted;
    --FROM    #TempTable

    SELECT  
        @ProductCode = ProductCode, @ProductName = ProductName,
        @StockLevel = ProductStockLevel, @OldPrice = ProductPrice,
        @ProductType = ProductType
    FROM    
        deleted;

    IF UPDATE(ProductPrice)
    BEGIN
        IF (@ProductType = 'Food Item' AND @NewPrice > 200)
        BEGIN
            RAISERROR('The price of food item cannot exceed $200.', 16, 1)
            ROLLBACK TRANSACTION
        END
        ELSE IF (@ProductType = 'Accessory' AND @NewPrice < 50)--AND @Class = 'Bed and Bedding'
        BEGIN
            RAISERROR('The price of any accessory with a classification that includes the word bed cannot be less than $50.', 16, 1)
            ROLLBACK TRANSACTION
        END
        ELSE
            PRINT 'Price of Product Code ' + @ProductCode + ' has been changed from $' + Cast(@OldPrice AS nVarChar(10)) + ' to $' + Cast(@NewPrice AS nVarChar(10)) + '.'
    END
END

Триггер работает нормально, но теперь, когда я попытался вывести таблицу accessory, триггер даже не срабатывает при обновлении таблицы. Также есть способ, где я могу распечатать цены с двумя десятичными знаками? В настоящее время они отбрасывают ошибку, что он не может преобразовать ее в десятичную из NVarChar, даже когда я использовал приведение.

1 Ответ

2 голосов
/ 21 февраля 2020

Хорошо, вот подход на основе набора , который учитывает, что при обновлении более 1 строки одновременно срабатывает триггер только один раз:

CREATE TRIGGER PriceCheck1
ON PRODUCT
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    -- check if we have any rows that the "ProductPrice" was updated 
    -- for a "Food Item" and a new price of over $200
    IF EXISTS (SELECT * 
               FROM Inserted i
               INNER JOIN Deleted d ON i.PrimaryKeyColumn = d.PrimaryKeyColumn
               WHERE
                   i.ProductPrice <> d.ProductPrice   -- ProductPrice was updated
                   AND i.ProductType = "Food Item"    -- for a "Food Item"
                   AND i.ProductPrice > 200           -- new price over $200
    BEGIN
        RAISERROR('The price of food item cannot exceed $200.', 16, 1)
        ROLLBACK TRANSACTION
    END;

    -- check if we have any rows that the "ProductPrice" was updated 
    -- for a "Accessory" and a new price of under $50
    IF EXISTS (SELECT * 
               FROM Inserted i
               INNER JOIN Deleted d ON i.PrimaryKeyColumn = d.PrimaryKeyColumn
               WHERE
                   i.ProductPrice <> d.ProductPrice   -- ProductPrice was updated
                   AND i.ProductType = "Accessory"    -- for a "Food Item"
                   AND i.ProductPrice < 50            -- new price under $50
    BEGIN
        RAISERROR('The price of any accessory with a classification that includes the word bed cannot be less than $50.', 16, 1)
        ROLLBACK TRANSACTION
    END;
END

Вам необходимо объедините псевдотаблицы Inserted и Deleted в столбце первичного ключа (я не знаю, что это такое - вы не указали это в своем вопросе - поэтому, пожалуйста, замените PrimaryKeyColumn на фактическое имя столбца первичного ключа) ).

Кроме того, я пропустил оператор PRINT, так как в триггере вы не можете иметь никакого взаимодействия с пользовательским интерфейсом - это PRINT входит в цифровую нирвану, не будучи никому полезным.

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