Consulta de Trigger

25/10/2017

0

Bom dia a todos,

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

Eduardo Franklin

Responder

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

Luiz Santos
Responder

Mais Posts

25/10/2017

Luiz Santos

Glasblaser

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
Responder

25/10/2017

Eduardo Franklin

Obrigado pela resposta. Infelizmente fiz como me recomendou mas continua em loop. Engraçado que mesmo no trace do sql não consigo pegar o que pode estar acontecendo, ele simplesmente não mostra nada após o update que tento dar, como se estivesse processando mas o que eu não sei ainda.
Responder

25/10/2017

Eduardo Franklin

Então, tive que colocar o cursor pq a trigger fica reclamando de vários retornos pra uma variável, típico caso de update em lote. Quando coloco o while, tenho o mesmo problema.
Responder

26/10/2017

Fabiano Carvalho

Não entendi muito bem a necessidade do cursor! Mas acredito, pela sua explicação, é desnecessário.

Se voce quer saber se existe determinado valor, pode utilizar exists, outras formas de realizar o procedimento sem cursor.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar