Consulta de Trigger
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
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
Curtidas 0
Melhor post
Luiz Santos
25/10/2017
...
Não tem como tirar esse cursor dai?
Usar uma tabela temporária em vez do cursor.
Não tem como tirar esse cursor dai?
Usar uma tabela temporária em vez do cursor.
GOSTEI 2
Mais Respostas
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
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
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
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
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.
Se voce quer saber se existe determinado valor, pode utilizar exists, outras formas de realizar o procedimento sem cursor.
GOSTEI 2