我有这个触发器,插入更新并在表中插入数据后,使用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