Consulta de Trigger
25/10/2017
0
Estou tentando fazer uma trigger que pega alguns dados da inserted depois de um update, realiza uma consulta através de um cursor, pois posso ter vários retornos, e finaliza se algum deles tiver determinado valor. Quando vou dar um update, a trigger fica rodando indefinidamente e o processo não completa, nem dá erro. O que estou fazendo de errado? Desde já, agradeço.
USE [CorporeRM_Teste]
GO
/****** Object: Trigger [dbo].[MTRF_PERMISSAO_UPD2] Script Date: 24/10/2017 11:36:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[MTRF_PERMISSAO_UPD2]
ON [dbo].[MITEMPEDIDOMATEXTRA]
AFTER UPDATE
AS
BEGIN
DECLARE @CODCOLIGADA INT, @IDPRJ INT, @IDTRF INT, @IDPEDIDOEXTRA INT, @IDITEMPEDIDOEXTRA INT
DECLARE MPEDEXTRA CURSOR
FAST_FORWARD
FOR SELECT CODCOLIGADA,IDPRJ,IDTRF,IDPEDIDOEXTRA,IDITEMPEDIDOEXTRA FROM INSERTED
OPEN MPEDEXTRA
FETCH NEXT FROM MPEDEXTRA INTO @CODCOLIGADA, @IDPRJ, @IDTRF, @IDPEDIDOEXTRA, @IDITEMPEDIDOEXTRA
WHILE @@FETCH_STATUS = 0
DECLARE @PEDIDOEXTRA VARCHAR = (SELECT MTRFCOMPL.PEDIDOEXTRA
FROM MITEMPEDIDOMATEXTRA
JOIN MTRF
ON MTRF.CODCOLIGADA = MITEMPEDIDOMATEXTRA.CODCOLIGADA
AND MTRF.IDPRJ = MITEMPEDIDOMATEXTRA.IDPRJ
AND MTRF.IDTRF = MITEMPEDIDOMATEXTRA.IDTRF
LEFT JOIN MTRFCOMPL
ON MTRFCOMPL.CODCOLIGADA = MTRF.CODCOLIGADA
AND MTRFCOMPL.IDPRJ = MTRF.IDPRJ
AND MTRFCOMPL.IDTRF = MTRF.IDTRF
WHERE MITEMPEDIDOMATEXTRA.CODCOLIGADA= @CODCOLIGADA
AND MITEMPEDIDOMATEXTRA.IDPRJ= @IDPRJ
AND MITEMPEDIDOMATEXTRA.IDTRF= @IDTRF
AND MITEMPEDIDOMATEXTRA.IDPEDIDOEXTRA= @IDPEDIDOEXTRA
AND MITEMPEDIDOMATEXTRA.IDITEMPEDIDOEXTRA= @IDITEMPEDIDOEXTRA)
IF @PEDIDOEXTRA = '2'
BEGIN
RAISERROR ('TAREFA SEM PERMISSAO DE LANCAMENTO NO PEDIDO EXTRA - FAVOR PROCURAR A SALA TÉCNICA ',11,127)
END
FETCH NEXT FROM MPEDEXTRA INTO @CODCOLIGADA, @IDPRJ, @IDTRF, @PEDIDOEXTRA, @IDPEDIDOEXTRA, @IDITEMPEDIDOEXTRA
CLOSE MPEDEXTRA
DEALLOCATE MPEDEXTRA
END
Eduardo Franklin
Post mais votado
25/10/2017
Não tem como tirar esse cursor dai?
Usar uma tabela temporária em vez do cursor.
Luiz Santos
Mais Posts
25/10/2017
Luiz Santos
Acho que achei seu problema.
Você está fazendo um update na tabela MITEMPEDIDOMATEXTRA, e depois consultando a propria.
O problema é que enquanto você não der o COMMIT ou ROLLBACK, essa tabela fica "presa".
No Select que está dentro do CURSOR você pode colocar WITH (NOLOCK) na frnete de cada tabela.
Assim ele não fica esperando vc terminar sua transação.
Grande abraço
25/10/2017
Eduardo Franklin
25/10/2017
Eduardo Franklin
26/10/2017
Fabiano Carvalho
Se voce quer saber se existe determinado valor, pode utilizar exists, outras formas de realizar o procedimento sem cursor.
Clique aqui para fazer login e interagir na Comunidade :)