【发布时间】:2020-12-12 19:31:40
【问题描述】:
我正在尝试做一个触发器,在插入另一个字段时更新一个字段。表格如下图所示。
所以,每当在“transacoes”表中插入交易(transacoes 表示交易)时,我都必须更新 contas 表中的“saldo”(葡萄牙语中的余额)。如果类别(表示类别)表中的“tipo_de_movimento”(表示交易类型)等于“收入”(realizada 表示已完成),我应该将该值加到“saldo”字段中,如果“tipo_de_movimento”='Despesa'(表示费用),我应该将该值减去“saldo”字段。
所以,我创建了这个触发器
ON [dbo].[TRANSACOES]
AFTER INSERT, UPDATE
AS
begin
update CONTAS set saldo = saldo + i.VALOR
from inserted i, TRANSACOES t, contas c, CATEGORIAS cat
where i.IDTRANSACAO= t.IDTRANSACAO
and i.ESTADO = 'Realizada'
and i.IDCONTA = c.IDCONTA
and i.IDCATEGORIA = cat.IDCATEGORIA
and cat.TIPO_DE_MOVIMENTO ='Receita'
update CONTAS set saldo = saldo - i.VALOR
from inserted i, TRANSACOES t, contas c, CATEGORIAS cat
where i.IDTRANSACAO= t.IDTRANSACAO
and i.ESTADO = 'Realizada'
and i.IDCONTA = c.IDCONTA
and i.IDCATEGORIA = cat.IDCATEGORIA
and cat.TIPO_DE_MOVIMENTO ='Despesa'
end
但我遇到的问题是,每当我在 transacoes 中插入一个值时,我的 saldo 字段是它应该是的两倍。
所以,如果我插入这个:
INSERT INTO TRANSACOES VALUES(4,8,2,1000,'20201210','Teste Right','Transfer','Recibo','Realizada')
添加到saldo字段的值应该是1000,但是它添加了2000,所以它添加了两次值(?)
那么,谁能告诉我这里发生了什么?
我有点不知道为什么会发生这种情况,我是触发器的新手,所以如果我没有提供足够的细节,我很抱歉。
非常感谢!
【问题讨论】:
-
Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI
JOIN语法-92 SQL 标准(25 多年前),不鼓励使用它 -
是否有可能在插入事务行之后,作为流程的一部分,您正在更新同一行上的某些内容?
-
与其为此编写触发器,不如考虑在视图中放置逻辑来计算余额。如果必要,您还可以将其设为索引视图,以便 SQL Server 自动重新计算和存储余额。手动维护此余额信息只会增加余额与原始数据不一致的可能性(正如您所发现的那样)
标签: sql-server triggers