Consulta de Trigger

SQL Server

SQL

Banco de Dados

25/10/2017

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

Curtidas 0

Melhor post

Luiz Santos

Luiz Santos

25/10/2017

...
Não tem como tirar esse cursor dai?
Usar uma tabela temporária em vez do cursor.
GOSTEI 2

Mais Respostas

Luiz Santos

Luiz Santos

25/10/2017

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
GOSTEI 1
Eduardo Franklin

Eduardo Franklin

25/10/2017

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.
GOSTEI 0
Eduardo Franklin

Eduardo Franklin

25/10/2017

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.
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

25/10/2017

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.
GOSTEI 2
POSTAR