我有以下表格:
- 卡片(IDCard、IDPerson、Balance、Active)
- 人(IDPerson)
每次插入一张新卡时,我都需要检查该卡是否已经属于某个人。如果是这样,我需要将 active 更改为 false,并且新卡必须收到前一张卡的余额并且状态必须为 true。
select count(c.IDPerson)
from cards c, inserted i
where c.IDPerson = i.IDPerson;
if @@ROWCOUNT > 0
begin
print'this card already exists'
select c.IDPerson, c.Balance, c.Active
INTO #tmp
FROM Cards c, inserted i
where c.IDCard = i.IDCard
update Cards
set Active = 0
from #tmp
where #tmp.IDPerson = Cards.IDPerson;
end
当我在卡片表中插入一条新记录时,旧卡片确实变为假 (0),但是新卡片也保持事件状态等于假。 这是在插入卡片表后。
谁能告诉我如何解决这个问题?
最佳答案
虽然您的触发器在事务中运行,但我认为它仍然能够 self 更新。
当您更新 INSERTED.IDPERSON = CARD.IDPERSON 时 - 这包括您插入的记录;因此所有记录都更新为 Active = false。
相反,你应该这样做
update Cards
set Active = 0
from #tmp
where #tmp.IDPerson = Cards.IDPerson
AND Cards.IDCARD != #tmp.IDCARD --This is the new condition
我已经创建了一个副本,我相信你在这个 DBFiddle Link 中要问什么
用户 marc_s 说你应该在这里使用 JOIN 语法也是正确的。您的整个操作可以在一个更简洁的语句中完成
UPDATE c
SET c.Active = 0
FROM Cards c
INNER JOIN Inserted i
ON i.IDPERSON = c.IDPERSON
AND i.IDCARD != c.IDCARD
关于SQL Server 触发器事件卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53611465/