我一直试图找到解决一个非常简单问题的方法,但我不知道该怎么做。我有两个表Transactions
和Credit_Card
。
交易
transid (PK), ccid (FK: to credit_card > ccid), amount, timestamp
CREDIT_CARD
ccid (PK), Balance, creditlimit
我想创建一个触发器,所以在某人插入交易之前,它会检查交易金额+信用卡余额是否超过creditlimit
,如果是,则拒绝插入。
"的修改"以下代码解决了我的问题,非常感谢 Dan Guzman 的贡献!
CREATE TRIGGER TR_transactions
ON transactions FOR INSERT, UPDATE
AS
IF EXISTS(
SELECT 1
FROM (
SELECT t.ccid, SUM(t.amount) AS amount
FROM inserted AS t
GROUP BY t.ccid) AS t
JOIN Credit_Card AS cc ON
cc.ccid = t.ccid
WHERE cc.creditlimit <= (t.amount + cc.balance)
)
BEGIN
RAISERROR('Credit limit exceeded', 16, 1);
ROLLBACK;
END;
答案 0 :(得分:2)
如果我理解正确,您只需要检查新插入/更新的交易的信用额度。请记住,SQL Server触发器每个语句触发一次,语句可能会影响多行。虚拟inserted
将包含受影响行的图像。您可以使用此功能将信用检查限制为仅受相关交易影响的信用卡。
CREATE TRIGGER TR_transactions
ON transactions FOR INSERT, UPDATE
AS
IF EXISTS(
SELECT 1
FROM (
SELECT inserted.ccid, SUM(inserted.amount) AS amount
FROM inserted
GROUP BY inserted.ccid) AS t
JOIN Credit_Card AS cc ON
cc.ccid = t.ccid
WHERE cc.creditlimit <= (t.amount + cc.balance)
)
BEGIN
RAISERROR('Credit limit exceeded', 16, 1);
ROLLBACK;
END;
修改强>
我从插入的表中删除了t
别名,并使用inserted
限定了列,以便更好地指示数据的来源。在多表查询中使用表名或别名限定列名以避免歧义通常是一种很好的做法。
RAISERROR
语句中的整数16和1指定引发错误的严重性和状态。有关详细信息,请参阅SQL Server Books Online参考。严重级别11和更高级别会引发错误,11到16范围内的严重性表示用户可更正错误。
答案 1 :(得分:-1)
你可以试试这个。
ALTER触发器[dbo]。[TrigerOnInsertPonches] 在[dbo]。[CHECKINOUT] 插入后 如 开始 DECLARE @ccid int ,@金钱
你必须告诉sql触发器是插入的, 然后你可以声明使用变量。声明
select @ccid=o.ccid from inserted o;
我认为抓住身份证是正确的乳清。 然后你可以从这个值中选择过滤。
我希望这可以是有用的