我有以下表格:
卡(身份证、个人卡、余额卡、活动卡)
个人(国内流离失所者)
每次插入新卡时,我都需要检查该卡是否已属于某个人。如果是这样的话,我需要将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

当我在cards表中插入新记录时,旧卡确实会变为false(0),但是新卡也保持active等于false。
这在卡片桌上的后面插入。
有人能告诉我怎么解决这个问题吗?

最佳答案

虽然您的触发器正在事务中运行,但我认为它仍然能够自我更新。
当您更新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 - SQL Server触发事件卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53611465/

10-10 03:32
查看更多