我有3张桌子:
我想创建一个触发器来检查
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。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。
答案 0 :(得分:1)
因此,我在结束时进行了相同的设置,并能够重现您的问题。 问题出在每次触发时,它只是将“当前插入的”交易金额与卡号信用额度进行比较。 如果您查看我的设置,尽管交易金额50和51 +余额= 1350的总和> 1000,我还是能够成功插入交易51(我认为您希望51在您的情况下会回滚),当我插入了交易60,触发器便将其正确回滚,因为该单笔交易的金额(1000)+余额(500)大于1000信用额度
PS:代码需要更好的对象命名约定,事务和错误需要更好地处理。 参见my_setup