我有一个SQL数据库,其中包含一对多关系中的Sales(dbo.Ventas)和SalesDetails(dbo.VentasDetalle)表。 我需要通过外部Web服务处理新创建的和新更新的销售。因此,每次创建或更新销售记录时,我都创建了一个辅助表Aux和一个触发器,它将销售ID插入到aux表中,同时将is_processed值插入0。
C#函数使用is_processed值0迭代aux表中的记录,通过Web服务处理它们,并在完成时保存值1。 它确实有效,并且它应该是处理我的用例的推荐方法。但是我有一个问题就是把事情搞砸了。
每次创建销售记录时,我的INSERT触发器都会触发,但是UPDATE不仅在更新Sale表记录时触发,而且还在创建SalesDetails中的任何子记录时触发。所以对于16排销售,我必须处理1个CREATE和16个UPDATES for Sale表。这没有多大意义,因为销售表未被修改,只创建子记录。
我的触发器编写如下:
INSERT:
USE [Prisma]
GO
/****** Objeto: Trigger [dbo].[Ventas_INSERT] Fecha de la secuencia de comandos: 07/06/2017 11:34:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Ventas_INSERT]
ON [dbo].[Ventas]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Venta_Id varchar(255), @Tipo_Doc varchar(255)
SELECT @Venta_Id = INSERTED.Venta_Id, @Tipo_Doc=Tipo_Doc
FROM INSERTED
if(Upper(@Tipo_Doc) ='FA' or Upper(@Tipo_Doc) ='BO' or Upper(@Tipo_Doc) ='NC' or Upper(@Tipo_Doc) ='ND')
begin
INSERT INTO aux(Venta_Id,source,is_process,action)
VALUES(@Venta_Id,'VENTAS',0, 'Inserted')
end
END
更新:
USE [Prisma]
GO
/****** Objeto: Trigger [dbo].[Ventas_UPDATE] Fecha de la secuencia de comandos: 07/06/2017 11:36:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Ventas_UPDATE]
ON [dbo].[Ventas]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Venta_Id varchar(255), @Tipo_Doc varchar(255)
SELECT @Venta_Id = INSERTED.Venta_Id, @Tipo_Doc=Tipo_Doc
FROM INSERTED
if(Upper(@Tipo_Doc) ='FA' or Upper(@Tipo_Doc) ='BO' or Upper(@Tipo_Doc) ='NC' or Upper(@Tipo_Doc) ='ND')
begin
INSERT INTO aux(Venta_Id,source,is_process,action)
VALUES(@Venta_Id,'VENTAS',0, 'Update')
end
END
有没有办法阻止触发器在仅创建子记录时触发UPDATE或在触发器代码中将其过滤掉?