Encontrar dependências de procedures, último checkdb e muito mais!

Tempo de leitura estimado: 3 minutos

Se tem um trabalho que sempre me deixou maluco é quando temos que analisar uma procedure que referencia outra procedure em outro banco, que referencia uma view, e essa view referencia uma função, que chama outra view que acessa uma tabela no banco original da procedure! AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH! Tá doido, quem aguenta isso?

Mas, se você quer trabalhar com SQL, principalmente se for consultoria (igual eu), não tem como fugir, mais cedo ou mais tarde você vai pegar um caso desses. Aceite, rs!

A boa notícia é que o sql server tem uma DMV bem legal que armazena todas as referências do código de views, procedures e functions. E, advinha? Eu já tinha um script onde você passa o nome do objeto e ele usa essa DMV para retornar todas as dependências, e as dependências das dependências e por aí vai! É todo seu (nosso):  sqlserver-lib/Modulos/DependencyChain.sql at main · rrg92/sqlserver-lib.

Aqui um exemplo real do resultado em que precisei usar recente na Power Tuning:

Eu passo ali no filtro o nome do objeto e ele retorna várias informações bem legais:

  • referenced_id é o id do objeto dependente e ReferencedObject é o nome do objeto. Por exemplo, na primeira linha o nome do objeto referenciando na view que passei começa com fncPower, que é uma função (descrito pela coluna type_desc, que é uma SQL_SCALAR_FUNCTION
  • RefLevel indica a hierarquia da dependência. As duas primeiras linhas tem o valor 1 porque foram encontrados diretamente no código do objeto que estou procurando. As demais linhas com o valor RefLevel = 2 foram encontradas em algum dos objetos do nível 1. Isso nos permite mapear totalmente as dependências
  • E pra fechar, a coluna RefChain mostra uma espécie de caminho, partindo do objeto que você colocou até o objeto da linha respectiva, pra que você bata o olho e entenda a dependência. Por exemplo, na penúltima linha vemos que a view que estou procurando referencia outra view, que por sua vez referencia essa tabela dbo.Power*.

O script é muito legal né?! Mas eu já vi alguns problemas, que devo melhorar no futuro (ou quem sabe alguém da comunidade não submete um PR com melhorias):

  • Temos algumas linhas com NULL no id e tipo porque o objeto referenciado está em outro banco, e não pude obter o resto das informações dele
  • Se umas das dependências referencia o objeto que estou procurando, isso provavelmente vai criar um loop infinito na minha query recursiva e vai dar pau. Eu já tenho algumas ideias de como contornar nisso, então, fica para uma melhoria futura também.

Além desse script, eu adicionei outros novos que você pode curtir também:

Fica ligado, que ainda estamos em apenas 100 scripts, e tem mais 400, ainda tem muita coisa pra publicar!

 

 

 

 

 

 

Compartilhe este post!

Leave a reply

Your email address will not be published.