SQL Server:插入后触发,其中插入会影响两个表

时间:2018-12-24 09:37:39

标签: sql sql-server triggers insert

我有3张桌子:

  • CARD(数字,Credit_Line,余额)
  • 二手(卡登,跨性别)
  • 交易(数量,金额)

我想创建一个触发器来检查

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

当我插入新的Transaction时,我希望SQL Server出现错误,但是由于某种原因,触发器无法完成工作。

更新!

这是我的新代码:

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 :(得分:1)

因此,我在结束时进行了相同的设置,并能够重现您的问题。 问题出在每次触发时,它只是将“当前插入的”交易金额与卡号信用额度进行比较。 如果您查看我的设置,尽管交易金额50和51 +余额= 1350的总和> 1000,我还是能够成功插入交易51(我认为您希望51在您的情况下会回滚),当我插入了交易60,触发器便将其正确回滚,因为该单笔交易的金额(1000)+余额(500)大于1000信用额度

PS:代码需要更好的对象命名约定,事务和错误需要更好地处理。 参见my_setup