首页 文章

MSSQL触发器:无法绑定多部分标识符“i.charged_amount”

提问于
浏览
2

好吧,我试图写一个触发器,客户试图购买东西,但如果他通过他的信用卡限制,交易必须取消 .

我的表是:
客户(姓名,ssn, code ),
帐户(customer_code, acc_number ,余额,费率),
信用卡(已发行,已过期,限额,余额, cc_number ),
交易(日期,CC_NUMBER,charged_amount,** ** conf_numb呃,shop_code)

我写的是

create trigger check_balance on transactions
for insert
as
Declare @balance int,
        @limit int
SELECT @balance = balance, @limit = limit
FROM creditcard INNER JOIN inserted i ON creditcard.cc_number = i.cc_number

IF (@balance + i.charged_amount > @limit)
BEGIN

    ROLLBACK TRANSACTION
END

但我得到了一个

消息4104,级别16,状态1,过程check_balance,第10行无法绑定多部分标识符“i.charged_amount” . 其中第10行是IF(@balance i.charged_amount> @limit)我知道masg意味着我不能使用i . *,因为它的范围只在select..from中 . 我尝试使用引用新行作为我,但我在引用附近有一个语法错误 . 我正在使用MSSQL server 2005我对sql中的触发器不太熟悉,所以能帮帮我吗?

3 回答

  • -4

    试试这个:

    create trigger check_balance on transactions
    
    for insert
    as
    
    IF EXISTS (SELECT 1 
               FROM creditcard 
                   INNER JOIN inserted i ON creditcard.cc_number = i.cc_number 
               GROUP BY c.cc_number
               HAVING MIN(creditcard.balance)+SUM(i.charged_amount)>MIN(creditcard.limit)
              )
    BEGIN
        raiserror ('bad limit found',16,1)
        ROLLBACK TRANSACTION
        return
    END
    
  • 3

    您对标量变量的赋值不适用于多行插入 . inserted 是一个可以包含任意数量行的表 .

    insert 甚至可能包含同一个信用卡的多个不同行,这些行单独可以,但总体上会超过帐户限制 .

    逻辑需要像......

    IF EXISTS
    (
    SELECT c.cc_number
    FROM creditcard c
    INNER JOIN inserted i ON c.cc_number = i.cc_number
    GROUP BY c.cc_number, c.limit, c.balance
    HAVING c.balance + SUM(i.charged_amount) > c.limit
    )
    
    ROLLBACK...
    
  • 5

    我认为问题是你正在尝试使用别名i,当它只在你将其别名的查询的范围内时 . 请将IF语句中的引用更改为插入而不是i .

相关问题