检查记录是否存在,如果是“更新”,如果不是“插入”使用游标sql server

时间:2016-07-13 20:06:34

标签: sql-server triggers

我有这个触发器,插入更新并在表中插入数据后,使用if作为插入或更新的参数,同时我在更新后有另一个触发器更改另一个寄存器。问题是第一次触发时更新它会触发更新触发器......所以我必须通过检查插入前是否有寄存器来保护第一个触发器但是我有一个光标插入数据所有这一切的中间,在我检查了一个寄存器的插入后发生了但是光标内的其他人没有插入表中光标列表中的一个寄存器...我找不到问题,请帮忙。 ..

这是我的触发器:

ALTER TRIGGER [dbo].[tr_inclusao_dupla]  ON  [dbo].[tb_patrimonio]
   AFTER INSERT
AS 
BEGIN

begin try
IF EXISTS (SELECT * FROM INSERTED) AND EXISTS (SELECT * FROM DELETED)
BEGIN
declare @id as int
declare @count as int
declare @qtd as int 
declare @emlote as bit
declare @nr_serie as varchar(100)
declare @nr_patrimonio as varchar(100)
declare @dm_identificado as bit
declare @nr_inventario as varchar(100)

set @nr_patrimonio = (select nr_patrimonio_efetivo from inserted)
set @nr_serie = (select nr_serie from inserted)
set @nr_inventario = (select nr_inventario from inserted)


/*single insert*/
    if (@nr_patrimonio is not null or @nr_serie is not null or @nr_inventario is not null)
        begin
            set @emlote =0
            declare registros cursor for
            select cd_patrimonio , nr_qtd_lote,nr_serie, nr_patrimonio_efetivo from inserted

            open registros
            fetch next from registros into @id, @qtd, @nr_serie, @nr_patrimonio
            while( @@fetch_status = 0)
            begin                                                           
                set @dm_identificado = 1

                update tb_patrimonio set dm_identificado = @dm_identificado, dm_em_lote = @emlote
                where cd_patrimonio = @id               
                end
            fetch next from registros into @id, @qtd,@nr_serie, @nr_patrimonio
            close registros
            deallocate registros

        end
    END
    ELSE
    BEGIN           
        /*multiple insert*/     
        begin 
            set @emlote =0
            set @dm_identificado = 0
            declare registros2 cursor for
            select cd_patrimonio , nr_qtd_lote,nr_serie, nr_patrimonio_efetivo from inserted
                open registros2
                fetch next from registros2 into @id, @qtd, @nr_serie, @nr_patrimonio
                while( @@fetch_status = 0)
                begin   
                    print @qtd                              
                    set @count = 1
                    update tb_patrimonio set dm_identificado = @dm_identificado, dm_em_lote = @emlote
                    where cd_patrimonio = @id 

                    while (@count <= (@qtd-1))
                    begin       
                                    INSERT INTO [dbo].[tb_patrimonio]
                                   ([dm_patrimonio]
                                   ,[dm_em_lote]
                                   ,[nr_qtd_lote]
                                   ,[cd_grupo_produto]
                                   ,[nm_patrimonio]
                                   ,[nr_patrimonio_efetivo]
                                   ,[nr_patrimonio_antigo]
                                   ,[nr_serie]
                                   ,[ds_descricao]
                                   ,[nr_lacre]
                                   ,[cd_barra]
                                   ,[dm_tipo_entrada]
                                   ,[nr_garantia]
                                   ,[cd_nota_fiscal]
                                   ,[ds_garantia]
                                   ,[img_patrimonio]
                                   ,[cd_situacao_patrimonio]
                                   ,[cd_orgao]
                                   ,[cd_local]
                                   ,[dm_situacao]
                                   ,[cd_usuario_inc]
                                   ,[cd_estado_patrimonio]
                                   ,[cd_tipo_posse]
                                   ,[cd_usuario_alt]
                                   ,[dt_alteracao]
                                   ,[cd_usuario]
                                   ,[dt_inclusao]
                                   ,[cd_estado_equipamento]
                                   ,[cd_fornecedor]
                                   ,[nr_termo]
                                   ,[img_termo]
                                   ,[dm_identificado]
                                   ,[dt_instalacao_equipamento]
                                   ,[nr_inventario])

                                    SELECT 
                                    [dm_patrimonio]
                                   ,@emlote
                                   ,[nr_qtd_lote]
                                   ,[cd_grupo_produto]
                                   ,[nm_patrimonio]
                                   ,[nr_patrimonio_efetivo]
                                   ,[nr_patrimonio_antigo]
                                   ,[nr_serie]
                                   ,[ds_descricao]
                                   ,[nr_lacre]
                                   ,[cd_barra]
                                   ,[dm_tipo_entrada]
                                   ,[nr_garantia]
                                   ,[cd_nota_fiscal]
                                   ,[ds_garantia]
                                   ,[img_patrimonio]
                                   ,[cd_situacao_patrimonio]
                                   ,[cd_orgao]
                                   ,[cd_local]
                                   ,[dm_situacao]
                                   ,[cd_usuario_inc]
                                   ,[cd_estado_patrimonio]
                                   ,[cd_tipo_posse]
                                   ,[cd_usuario_alt]
                                   ,[dt_alteracao]
                                   ,[cd_usuario]
                                   ,[dt_inclusao]
                                   ,[cd_estado_equipamento]
                                   ,[cd_fornecedor]
                                   ,[nr_termo]
                                   ,[img_termo]
                                   ,@dm_identificado
                                   ,[dt_instalacao_equipamento]
                                   ,[nr_inventario] 
                                   FROM inserted where cd_patrimonio = @id

                       set @count = @count + 1
                    end
                fetch next from registros2 into @id, @qtd,@nr_serie, @nr_patrimonio
                end
                close registros2
                deallocate registros2                         
        end
    END
end try
begin catch
    declare @errormessage nvarchar(4000)
    declare @errorseverity int
    declare @errorstate int

    select 
        @errormessage = ERROR_MESSAGE(),
        @errorseverity = ERROR_SEVERITY(),
        @errorstate = ERROR_STATE()

    raiserror (     
              @errormessage,
              @errorseverity,
              @errorstate                 
              )

end catch end

0 个答案:

没有答案