Tenho um problema com o gatilho que produz a seguinte mensagem de erro
O gatilho retornou um conjunto de resultados e/ou estava sendo executado com SET NOCOUNT OF
O gatilho é estruturado assim:
CREATE TRIGGER TRIG_FOO ON FOO FOR INSERT, UPDATE, DELETE AS BEGIN
DECLARE @AFFECTED CURSOR
SET NOCOUNT ON
IF EXISTS (SELECT * FROM INSERTED)
SET @AFFECTED = CURSOR FOR SELECT ID FROM INSERTED
ELSE
SET @AFFECTED = CURSOR FOR SELECT ID FROM DELETED
OPEN @AFFECTED
FETCH NEXT FROM @AFFECTED INTO @BAZ
WHILE @@FETCH_STATUS = 0 BEGIN
--- trigger logic
FETCH NEXT FROM @AFFECTED INTO @BAZ
END
SET NOCOUNT OFF -- (*)
END
O gatilho não falha se eu remover a última linha ( SET NOCOUNT OFF
). Usamos esse tipo de gatilho em muitas tabelas por muitos anos e sempre funcionou corretamente (mesmo se um cursor for usado). Tentei encontrar a fonte do erro com:
- fechando e desalocando o cursor
- usando um cursor de avanço rápido
- saída de depuração e uma tabela de log separada
- SQL Server Profiler (rastrear instruções executadas, mensagens e erros)
- Eventos estendidos (eventos de log de instruções executadas)
Em nenhum lugar encontrei uma pista em qual parte do gatilho o outro conjunto de resultados é criado. Nenhum outro gatilho é definido para esta tabela.
Quero entender a causa da mensagem de erro - o que posso fazer? E é seguro remover a última linha do gatilho?
Sim. O final
SET NOCOUNT OFF
não serve para nada porque a configuração retorna para a configuração em vigor antes do gatilho disparar de qualquer maneira.Trecho relevante da documentação do CREATE TRIGGER :
Parece que você truncou a mensagem de erro. Parece #523:
Intencionalmente ou não, você parece ter o MARS habilitado e está, na verdade, gerando vários conjuntos de resultados ativos ao mesmo tempo. Às vezes, isso pode ser devido a um aplicativo não ler até o fim todos os resultados disponíveis do servidor.
Seu gatilho pode ser apenas
SET NOCOUNT OFF
brevemente no final (antes de ser revertido para a configuração anterior na saída do módulo), mas isso é o suficiente para produzir o erro. Sim, você pode removê-lo com segurança.