2010-12-06 98 views
2

好吧,我想寫一個觸發器,客戶試圖購買的東西,但如果他通過了他的信用卡限額,交易必須是取消。MSSQL觸發器:多部分標識符「i.charged_amount」無法綁定

我的表是:
客戶(姓名,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行是 如果(@balance + i.charged_amount> @limit) 我知道masg意味着我無法使用i。*,因此它的範圍僅在select..from中。 我嘗試使用引用新行作爲我,但我得到了引用附近的語法錯誤。我正在使用MSSQL服務器2005 我不太熟悉sql中的觸發器,所以你能幫我嗎?

回答

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 
+0

這仍然會允許通過同一張卡上的多次不同購買共同超過帳戶限額。 – 2010-12-06 18:45:49

+0

@馬丁,很好的捕捉,你今天在作業上會得到一個「A」! – 2010-12-06 19:03:48

+0

哈哈! +1對於修復。 – 2010-12-06 19:09:35

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... 
-4

我認爲問題是,你要使用別名我當它是隻在範圍爲你的別名它在查詢中。請將IF語句中的引用更改爲插入而不是i。

相關問題