Às vezes, nossos desenvolvedores escrevem uma consulta que usa cursores, mas não os fecha explicitamente. Estou tentando gerar uma lista de objetos ativos no meu banco de dados de produção que usam cursores, mas não os fecham/desalocam explicitamente. Para fazer isso, escrevi uma instrução simples que faz o trabalho, mas é extremamente lenta:
select distinct name,
definition
from SYS.SQL_MODULES
inner join SYS.OBJECTS O
on SQL_MODULES.OBJECT_ID = O.OBJECT_ID
where SQL_MODULES.DEFINITION like '%open%'
and SQL_MODULES.DEFINITION like '%declare % cursor%'
and ( SQL_MODULES.DEFINITION not like '%close%'
or SQL_MODULES.DEFINITION not like '%deallocate%' )
Atualmente, isso leva algo como 3 minutos para ser executado. Existe uma maneira melhor de obter as informações que estou procurando?
Em vez de pesquisar todo o texto do procedimento armazenado por esses curingas, provavelmente seria melhor procurar por cursores abertos e seu texto associado. Isso provavelmente tornaria mais fácil localizar nomes de cursores, procs armazenados, etc. escritos por desenvolvedores esquecidos.
Para testar, execute isso em uma janela:
Então, em outra janela, execute isto:
Você deve ver o cursor aberto e deixado pendurado pela outra sessão aqui, junto com quaisquer outros cursores abertos.
Se você precisar monitorar isso (e não tiver uma ferramenta de monitoramento), poderá usar a coluna dormant_duration e pesquisar esse DMV com um trabalho de agente que disparará um alerta ou e-mail quando um cursor aberto estiver inativo por um determinado quantidade de tempo. Isso em milissegundos.
Espero que isto ajude!