如何创建一个触发器,让我从 table 中删除一行,然后更新 2 tables
How can I create a trigger that let me delete a row from a table and then update 2 tables
我想创建一个触发器,让我从 table 'DETALLES' 中删除一行,在删除该特定行后,我想修改另一个 table 称为 "BOLETAS"还有一个叫做"ARTICULOS",第一个table是这样的:
例如,我想从这个 table 中删除一行,然后第二个 table 调用 "ARTICULOS":
!
必须用 table "DETALLES" 列 "CANTIDAD" 和最后 table 中删除的行恢复的金额更新他的 "STOCK"称为 "BOLETAS":
必须更新列 "TOTAL" 减去从 table "DETALLES" 列 "IMPORTE" 中删除的数量。
所以基本上,必须有一个触发器让我从 table "DETALLES" 中删除一行并更新另外 2 tables.
例如,我决定从 "DETALLES" 中删除第二行,因此 'ART002' 的 table "ARTICULOS" 列 "STOCK" 必须加 1,因为列的 "CANTIDAD" 和 table "BOLETAS" 必须小于“60”。
我试了几个小时但我不能,对不起我的英语不好:(
这些是我用来创建 table 的代码。
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)
我试过你的表格和示例数据。从我所做的测试来看,它只适用于删除 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
我想创建一个触发器,让我从 table 'DETALLES' 中删除一行,在删除该特定行后,我想修改另一个 table 称为 "BOLETAS"还有一个叫做"ARTICULOS",第一个table是这样的:
例如,我想从这个 table 中删除一行,然后第二个 table 调用 "ARTICULOS":
!
必须用 table "DETALLES" 列 "CANTIDAD" 和最后 table 中删除的行恢复的金额更新他的 "STOCK"称为 "BOLETAS":
必须更新列 "TOTAL" 减去从 table "DETALLES" 列 "IMPORTE" 中删除的数量。
所以基本上,必须有一个触发器让我从 table "DETALLES" 中删除一行并更新另外 2 tables.
例如,我决定从 "DETALLES" 中删除第二行,因此 'ART002' 的 table "ARTICULOS" 列 "STOCK" 必须加 1,因为列的 "CANTIDAD" 和 table "BOLETAS" 必须小于“60”。 我试了几个小时但我不能,对不起我的英语不好:( 这些是我用来创建 table 的代码。
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)
我试过你的表格和示例数据。从我所做的测试来看,它只适用于删除 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