Создать триггер с оператором If - PullRequest
0 голосов
/ 03 августа 2020

Моя проблема заключается в следующем:

Создайте триггер с именем Products_UPDATE, который проверяет новое значение для столбца DiscountPercent таблицы Products. Этот триггер должен вызывать соответствующую ошибку, если процент скидки больше 100 или меньше 0.

Если новый процент скидки находится между 0 и 1, этот триггер должен изменить новый процент скидки, умножив его на 100 . Таким образом, процент скидки 0,2 станет 20.

Протестируйте этот триггер с помощью соответствующего оператора UPDATE.

CREATE TRIGGER Products_UPDATE
ON Products
AFTER INSERT, UPDATE
AS
BEGIN 
IF (SELECT Products.DiscountPercent FROM Products 
JOIN inserted ON Products.DiscountPercent = inserted.DiscountPercent) > 100 OR (SELECT Products.DiscountPercent FROM Products 
JOIN inserted ON Products.DiscountPercent = inserted.DiscountPercent) < 0
RAISERROR(N'Percent has to be between 0 and 100',16,1)
END
BEGIN
IF
(SELECT Products.DiscountPercent FROM Products 
JOIN inserted ON Products.DiscountPercent = inserted.DiscountPercent) > 0 AND (SELECT Products.DiscountPercent FROM Products 
JOIN inserted ON Products.DiscountPercent = inserted.DiscountPercent) < 1
UPDATE Products
SET DiscountPercent = DiscountPercent * 100
WHERE DiscountPercent = (SELECT Products.DiscountPercent FROM Products 
JOIN inserted ON Products.DiscountPercent = inserted.DiscountPercent)
END
GO
UPDATE Products
SET DiscountPercent = 103
WHERE ProductID = 1;

Таким образом, он не выдает ошибку, когда я обновите DiscountPercent больше 100.

1 Ответ

1 голос
/ 03 августа 2020

Я не совсем уверен, чего пытались достичь ваши объединения sh. Вы должны иметь возможность выполнить свою проверку и вставить полностью, используя псевдотаблицу Inserted. Повторная проверка обновления не требуется, так как raiserror не позволит продолжить работу остальной части триггера.

Вы можете использовать выражение case для вычисления скидки.

CREATE TRIGGER Products_UPDATE
ON Products
AFTER INSERT, UPDATE
AS
BEGIN 
  SET NOCOUNT ON;

  IF EXISTS (
    SELECT 1
    FROM Inserted I
    WHERE I.DiscountPercent > 100 OR I.DiscountPercent < 0
    ) BEGIN
    -- Should be using throw
    RAISERROR(N'Percent has to be between 0 and 100',16,1);
  END;

  UPDATE Products SET
    DiscountPercent = DiscountPercent * 100
  WHERE id IN (SELECT id FROM Inserted)
  AND DiscountPercent < 1;
END;
GO

Примечание: вам действительно стоит использовать throw, а не raiserror.

...