我的表是:
客户(名字,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中的触发器不太熟悉,所以能帮帮我吗?
答案 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。