quinta-feira, 1 de julho de 2010

Como pesquisar, de forma rápida, objetos referenciados no código fonte de outros objetos?

Boa tarde!
Hoje resolvi escrever um pequeno artigo sobre uma angústia que desenvolvedores e alguns DBAs iniciantes passam sempre que querem localizar um objeto dentro dos scripts criados dentro de um banco de dados SQL.

Como assim?
Vamos lá... dentro de um SGBD podemos criar alguns objetos programáveis que são criados através de scripts, ou códigos-fonte. No caso do SQL Server utilizamos o T-SQL (Transact SQL) para criar esses objetos. E o que ocorre: por diversas vezes nós, DBAs, precisamos identificar quais objetos fazem uso de uma determinada tabela ou internamente referenciam uma determinada função, dentre outros casos. Com isso, para tornar mais produtiva essa busca, podemos utilizar os recursos de busca (SELECT) da linguagem SQL.

Primeiramente faremos uma busca na visão de sistema syscomments. É através desta estrutura que conseguimos recuperar informações dentro das stored procedures, stored functions etc, através da coluna text.

declare @PalavraAPesquisar varchar(255)

set @PalavraAPesquisar ='Nome do objeto a procurar'

select distinct objects = object_name(C.id),
       CASE O.xtype WHEN  'P' THEN 'STORED PROCEDURE'
                    WHEN  'X' THEN 'SYSTEM PROCEDURE'
                    WHEN
  'V' THEN 'STORED VIEW'

                    WHEN  'TF' THEN 'SYSTEM FUNCTION'
                    WHEN  'FN' THEN 'STORED FUNCTION'
                    WHEN 'U' THEN 'TABLE'
                    ELSE O.xtypeENDas xtype
from syscomments C
    join sysobjects O on C.id = O.id

where text like '%' + @PalavraAPesquisar + '%'
order by objects

Em seguida, faremos uma pesquisa nas estruturas SysJobs e SysJobSteps. É através dessas estruturas que pesquisaremos se aquele determinado objeto é referenciado em algum Job.

declare @PalavraAPesquisar varchar(255)
 
set @PalavraAPesquisar ='Nome do objeto a procurar' 

select distinct name as objects, 'JOB' as xtype
from msdb.dbo.sysjobsteps S
      join msdb.dbo.sysjobs J on s.job_id = J.job_id
where command like '%' + @str + '%'
order by objects
 

Com esse simples script espero ter ajudado a melhorar seu tempo de busca a referência de objetos dentro da base.

Uma observação importante para vocês é que o código acima somente funcionará para os objetos que não estiverem criptografados. Caso contrário, não retornará o resultado.

Vale uma dica que seria juntar esses dois pequenos scripts em um só, criar uma stored procedure para isso, colocá-la num database universal, por exemplo o Master, e sempre poderá realizar a pesquisa a partir de qualquer database.

 

Até a próxima!!!