Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:插入后触发,其中插入影响两个表_Sql_Sql Server_Triggers_Insert - Fatal编程技术网

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

SQL Server:插入后触发,其中插入影响两个表,sql,sql-server,triggers,insert,Sql,Sql Server,Triggers,Insert,我有三张桌子: 卡(号码、信用额度、余额) 二手车(卡登、特朗斯) 交易记录(编号、金额) 我想做一个触发器来检查 TRANSACTION.Amount+CARD.Balance is not greater than CARD.Credit_Line 每次插入新事务时 我已经尝试执行以下操作,并且可以从SQL Server接受触发器,但在插入新事务时,它似乎不起作用 这是我的密码: CREATE TRIGGER check_b ON TRANSACTION AFTER INSERT A

我有三张桌子:

  • 卡(号码、信用额度、余额)
  • 二手车(卡登、特朗斯)
  • 交易记录(编号、金额)
我想做一个触发器来检查

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会出错,但由于某些原因,触发器无法执行此任务

更新

这是我的新代码:

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
我得到的错误是:

Msg 512,16级,状态1,程序检查,第11行
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时


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

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

——在ANSI-92 SQL标准中(25多年前),旧式的逗号分隔表格列表样式被正确的ANSI
JOIN
语法所取代,不鼓励使用