【问题标题】:Use a Trigger After Insert for updating a table?插入后使用触发器更新表?
【发布时间】:2019-11-28 08:02:39
【问题描述】:

我在 SQL 服务器上使用触发器来更新表股票,当卖出插入另一个表时,但触发器没有对表做任何事情,我怀疑我一定有一个我无法破译的错误。当我执行测试插入时,它显示第一个表没有变化。

这些表格是:

 Sku VARCHAR (50) PRIMARY KEY, 
 Stock NUMERIC (38)
);

CREATE TABLE dbo.Salida_Producto (
 Numero_Salida INT PRIMARY KEY,
 Sku VARCHAR (50),
 Cantidad_Salida INT,
 FOREIGN KEY(Sku) REFERENCES Stock(Sku)
);
--Test Tabla Stock. Test Values.
INSERT INTO dbo.Stock VALUES ('El Mitchies',100);
INSERT INTO dbo.Stock VALUES ('La Karencilla',200);
INSERT INTO dbo.Stock VALUES ('Perro',300);```


The Trigger:

CREATE TRIGGER [dbo].[tr_for_insert]
   ON  [dbo].[Salida_Producto]
   AFTER INSERT
AS 
BEGIN
DECLARE 
@Item varchar,
@Cuantos numeric
    SELECT @Item = INSERTED.Sku,
            @Cuantos = INSERTED.Cantidad_Salida
            FROM INSERTED
    UPDATE Stock
        SET Stock = Stock - @Cuantos
        WHERE Sku = @Item

END;
GO

测试插入

INSERT INTO dbo.Salida_Producto VALUES (1, 'El Mitchies',3);
INSERT INTO dbo.Salida_Producto VALUES (2, 'La Karencilla',6);
INSERT INTO dbo.Salida_Producto VALUES (3,'Perro',130); ```

我的问题是消息框说:

(0 行受影响)

(受影响的 1 行)

【问题讨论】:

  • 你犯了很多人犯的经典错误,假设Inserted 将只包含一条记录——而实际上它可以包含很多条记录。您需要根据与数据库相关的所有内容使用基于集合的逻辑,并编写一个包含多行的更新。
  • 感谢指正,下次会记住的。

标签: sql sql-server database triggers eventtrigger


【解决方案1】:

您认为您的触发器采用逐行方法。这不是好的做法。你必须学会​​用“按组”的方式思考。

因此,实现目标的更好方法应该是:

Update S
      Set S.Stock = S.Stock - I.Cantidad_Salida
   From Stock S
   Inner Join inserted I
   On S.Sku = I.Sku

【讨论】:

  • 谢谢,我会试试答案,如果我能改变它,请告诉你,谢谢你的回答我会保持“按组”的方法。
  • @ChristianVillarroel Accepting an answer
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多