【发布时间】:2018-12-24 09:37:39
【问题描述】:
我有 3 张桌子:
- CARD(号码、Credit_Line、余额)
- 已使用(卡顿、反式)
- 交易(数量、金额)
我想创建一个触发器来检查
TRANSACTION.Amount+CARD.Balance is not greater than CARD.Credit_Line
每次我插入一个新事务。
我已经尝试执行以下操作,并且触发器可以从 SQL Server 中接受,但是当我插入新事务时它似乎不起作用。
这是我的代码:
CREATE TRIGGER check_b
ON TRANSACTION
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @balance MONEY,
@credit_line MONEY,
@amount MONEY
SELECT @balance = Balance, @credit_line = Credit_Line, @amount = amount
FROM TRANSACTION, USED, CARD
WHERE TRANSACTION.number = USED.transn
AND USED.cardn = CARD.number
IF (@balance + @amount > @credit_line)
BEGIN
ROLLBACK TRANSACTION
END
END
当我插入一个新的Transaction 时,我预计 SQL Server 会出现错误,但由于某种原因,触发器无法完成这项工作。
更新!
这是我的新代码:
CREATE TRIGGER check_b
ON TRANSACTION
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @amount MONEY
SELECT @amount = amount
FROM TRANSACTION, USED, CARD
WHERE TRANSACTION.number = USED.transn
AND USED.cardn = CARD.number
IF (SELECT Balance FROM Card) + @amount > (SELECT Credit_Line FROM CARD)
BEGIN
ROLLBACK TRANSACTION
END
END
我得到的错误是:
消息 512,级别 16,状态 1,过程 check_b,第 11 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
【问题讨论】:
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 多年前),不鼓励使用它
标签: sql sql-server triggers insert