【问题标题】:How can I create a trigger that let me delete a row from a table and then update 2 tables如何创建一个触发器,让我从表中删除一行,然后更新 2 个表
【发布时间】:2017-11-03 00:08:01
【问题描述】:

我想创建一个触发器,让我从表“DETALLES”中删除一行,在删除该特定行后,我想修改另一个名为“BOLETAS”的表和另一个名为“ARTICULOS”的表,第一个表是这样的:

例如,我想从这个表中删除一行,然后是第二个名为“ARTICULOS”的表:

!

必须用由于从表“DETALLES”列“CANTIDAD”和最后名为“BOLETAS”的表中删除的行而恢复的数量来更新他的“STOCK”:

必须更新列“TOTAL”减去从表“DETALLES”列“IMPORTE”中删除的数量。

所以基本上,必须有一个触发器让我从“DETALLES”表中删除一行并更新另外 2 个表。

例如,我决定从“DETALLES”中删除第二行,因此“ART002”的表“ARTICULOS”列“STOCK”必须加 1,因为列“CANTIDAD”和表“BOLETAS”必须是少“60”。 我试了几个小时,但我不能,对不起我的英语不好:( 这些是我用来创建表格的代码。

CREATE TABLE ARTICULOS(
CODART VARCHAR(6) PRIMARY KEY,
NOMART VARCHAR(50),
STOCK INT,
PRECIO NUMERIC(8,2))

CREATE TABLE INGRESOS(
CODART VARCHAR(6) ,
FECHA DATE,
CANTIDAD INT,
PRECIO NUMERIC(8,2),
CONSTRAINT  FK1  FOREIGN  KEY  (CODART)  REFERENCES ARTICULOS
)

CREATE TABLE 
CLIENTES(
CODCLI VARCHAR(6)  PRIMARY KEY,
NOMCLI  VARCHAR(50),
RUCCLI  INT,
DIRECCION  VARCHAR(50)
DEFAULT 'DESCONOCIDA'
)

CREATE TABLE BOLETAS(
NROBOL VARCHAR(10) PRIMARY KEY NONCLUSTERED,
CODCLI VARCHAR(6),
FECHA DATE,
TOTAL NUMERIC(8,2),
CONSTRAINT 
FK2   FOREIGN   KEY   (CODCLI)   REFERENCES CLIENTES
)

CREATE TABLE DETALLES(
NROBOL VARCHAR(10) ,
CODART VARCHAR(6),
CANTIDAD INT,
IMPORTE NUMERIC(8,2),
PRIMARY KEY NONCLUSTERED (NROBOL,CODART),
CONSTRAINT  FK3  FOREIGN 
KEY  (NROBOL)  REFERENCES 
BOLETAS,
CONSTRAINT  FK4  FOREIGN  KEY  (CODART)  REFERENCES ARTICULOS)

【问题讨论】:

  • 触发器和程序代码是高度特定于供应商的 - 所以请添加标签以指定您是否使用mysqlpostgresqlsql-server、@ 987654332@ 或 db2 - 或完全不同的东西。

标签: sql triggers procedure sql-server-2016 create-table


【解决方案1】:

我玩弄了您的表格和示例数据。从我所做的测试来看,它只删除了 1 行或删除了多行。你应该做更多的测试来验证,但我相信这应该适用于你描述的数据和逻辑。

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[rowUpdater]
   ON [dbo].[DETALLES]
   AFTER DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE ARTICULOS
    SET STOCK = a.STOCK + d.STOCK
    FROM ARTICULOS a
         JOIN (SELECT d.CODART,SUM(d.CANTIDAD) 'STOCK'
                FROM deleted d
                GROUP BY d.CODART) AS d ON a.CODART = d.CODART

    UPDATE BOLETAS
    SET TOTAL = b.TOTAL - d.TOTAL
    FROM BOLETAS b
         JOIN (SELECT d.NROBOL,SUM(d.IMPORTE) 'TOTAL'
               FROM deleted d
               GROUP BY d.NROBOL) AS d ON b.NROBOL = d.NROBOL
END
GO

ALTER TABLE [dbo].[DETALLES] ENABLE TRIGGER [rowUpdater]
GO

【讨论】:

  • 谢谢 稍后我会测试它,现在我不能。我会告诉你这是否符合预期,再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2016-12-14
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多