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

时间:2010-12-06 18:31:55

标签: sql sql-server tsql triggers

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

我的表是:
客户(名字,SSN的),
账户(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>   @限制)   我知道masg意味着我不能使用i。*,因为它的范围只在select..from中。   我尝试使用引用新行作为我,但我在引用附近有一个语法错误。我正在使用MSSQL server 2005   我对sql中的触发器不太熟悉,所以能帮帮我吗?

3 个答案:

答案 0 :(得分:5)

您对标量变量的赋值不适用于多行插入。 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...

答案 1 :(得分:3)

试试这个:

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

答案 2 :(得分:-4)

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