Geo*_*rge 2 sql t-sql sql-server triggers
好吧,我试图写一个触发器,客户试图购买东西,但如果他通过他的信用卡限制,交易必须取消.
我的表是:
客户(名称,ssn,代码),
帐户(customer_code,acc_number,余额,费率),
信用卡(已发行,已过期,限额,余额,cc_number),
交易(日期,cc_number,charge_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
Run Code Online (Sandbox Code Playgroud)
但我得到了一个
消息4104,级别16,状态1,过程check_balance,行10无法绑定多部分标识符"i.charged_amount".其中第10行是IF(@balance + i.charged_amount> @limit)我知道masg意味着我不能使用i.*,因为它的范围只在select..from中.我尝试使用引用新行作为我,但我在引用附近有一个语法错误.我正在使用MSSQL server 2005我对sql中的触发器不太熟悉,所以能帮帮我吗?
您对标量变量的赋值不适用于多行插入.inserted
是一个可能包含任意行数的表.
一个insert
甚至可能包含同一信用卡单独都OK多个不同行,但集体将超过帐户上限.
逻辑需要像......
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...
Run Code Online (Sandbox Code Playgroud)