SQL Server: триггер после вставки, где вставка влияет на две таблицы - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть 3 таблицы:

  • CARD (число, Credit_Line, Balance)
  • USED (cardn, transn)
  • TRANSACTION (число, сумма)

Я хочу создать триггер, который проверяет, что

TRANSACTION.Amount+CARD.Balance is not greater than CARD.Credit_Line 

каждый раз, когда я вставляю новую транзакцию.

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

Вот мой код:

CREATE TRIGGER check_b
ON TRANSACTION
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @balance MONEY,
            @credit_line MONEY,
            @amount MONEY

    SELECT @balance = Balance, @credit_line = Credit_Line, @amount = amount
    FROM TRANSACTION, USED, CARD
    WHERE TRANSACTION.number = USED.transn 
      AND USED.cardn = CARD.number 

    IF (@balance + @amount > @credit_line)
    BEGIN
        ROLLBACK TRANSACTION
    END
END

Я ожидаю ошибку от SQL Server, когдаЯ вставляю новый Transaction, но по какой-то причине триггер не выполняет эту работу.

ОБНОВЛЕНИЕ!

Вот мой новый код:

CREATE TRIGGER check_b
ON TRANSACTION
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @amount MONEY

    SELECT @amount = amount
    FROM TRANSACTION, USED, CARD
    WHERE TRANSACTION.number = USED.transn 
      AND USED.cardn = CARD.number 

    IF (SELECT Balance FROM Card) + @amount > (SELECT Credit_Line FROM CARD)
    BEGIN
        ROLLBACK TRANSACTION
    END
END

Я получаю ошибку:

Сообщение 512, Уровень 16, Состояние 1, Процедура check_b, Строка 11
Подзапрос возвратил более 1 значения.Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

1 Ответ

0 голосов
/ 24 декабря 2018

Итак, я выполнил ту же настройку на своем конце и смог воспроизвести вашу проблему.Проблема возникает при каждом срабатывании триггера, она сравнивает только «вставленную в данный момент» транзакцию. Количество с кредитной линией по номеру карты.если вы посмотрите на мои настройки, я смог успешно вставить транзакцию 51, несмотря на то, что сумма транзакции 50 и 51 + сальдо = 1350, что составляет> 1000 (я думаю, вы ожидаете, что в вашем случае 51 откатится), когдая вставил транзакцию 60, триггеры правильно откатили ее, потому что сумма (1000) + баланс (500) этой единственной транзакции была больше 1000 кредитной линии

PS: код требует лучшего соглашения об именах объектов, транзакцийи ошибки должны быть обработаны лучше.см my_setup

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