SQL Server 触发器事件卡

标签 sql sql-server database triggers

我有以下表格:

  • 卡片(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/

相关文章:

sql - 如何在Linux/Grails/Groovy环境中的Grails h2数据源中 “look at data”?

database - 如何为单位换算表建模?

mysql - SQL 查询从数据库中的 3 个表检索数据

使用格式化日期函数时 SQL 查询运行速度非常慢

sql - 如何按具有特定列值的行数进行排序

SQL 查询今天减去两个月的日期

sql - 从join myself中选择第一行

mysql触发器通过变量获取列值

sql - 动态 PIVOT,两表 JOIN 返回结果

sql-server - 无法从本地 SQL Server 部署数据库