【问题标题】:SQL Server : trigger after insert, where insert affects two tablesSQL Server:插入后触发,其中插入影响两个表
【发布时间】:2018-12-24 09:37:39
【问题描述】:

我有 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 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

标签: sql sql-server triggers insert


【解决方案1】:

所以我在最后做了同样的设置并且能够重现你的问题。 问题在于每次触发火灾,它只是将“当前插入”的交易金额与卡号信用额度进行比较。 如果您查看我的设置,我能够成功插入交易 51,尽管交易 50 和 51 + 余额 = 1350 的总和 > 1000(我认为您希望在您的情况下回滚 51),当我插入了第 60 笔交易,触发器正确地回滚了它,因为单笔交易的金额 (1000) + 余额 (500) 大于 1000 的信用额度

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2016-12-22
    • 2013-11-09
    • 2015-07-07
    • 2015-01-15
    • 2023-03-11
    相关资源
    最近更新 更多