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多年前),旧式的逗号分隔表格列表样式被正确的ANSIJOIN
语法所取代,不鼓励使用