在SQL Server 2005中通过触发器处理子记录和父记录的问题

时间:2017-07-06 16:42:14

标签: sql-server sql-server-2005 triggers

我有一个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或在触发器代码中将其过滤掉?

0 个答案:

没有答案