terça-feira, 2 de junho de 2009

Dependência de Objetos no SQL Server 2008

Finalmente voltei... depois de um longo período sem publicar nada no blog devido a problemas particulares, estou voltando com força total!

Vou escrever hoje sobre uma novidade na dependência de objetos no SQL Server 2008. Até o SQL Server 2005 toda a dependência de objetos era armazenada utilizando os IDs dos objetos, gerando informações incompletas ao se consultar o metadata com sp_depends ou sql_dependencies. Para entender porque veja o script abaixo:

use tempdb
go
create table Ref1 (col1 int)
create table Ref2 (col1 int)
go
create proc spu
as
select * from dbo.Ref1
select * from dbo.Ref2
select * from dbo.Ref3
go

A Stored Procedure SPU acessa três tabelas, porém uma delas (Ref3) não existe no banco de dados, “Deferred Name Resolution” (Resolução de Nomes Tardia). Tanto sp_depends quanto sql_dependencies retornam apenas Ref1 e Ref2 como objetos referenciados pela Stored Procedure SPU, observe no script abaixo:

exec sp_depends 'dbo.spu'

select OBJECT_NAME([object_id]) ObjAnalisado,
OBJECT_NAME(referenced_major_id) ObjReferenciado
from sys.sql_dependencies
where [object_id] = object_id('dbo.spu')

O SQL Server 2008 trouxe novidades, uma View (sql_expression_dependencies) e duas funções (dm_sql_referenced_entities e dm_sql_referencing_entities), que retornam a dependência dos objetos através do nome, resolvendo o problema descrito acima. Veja no script abaixo:

select OBJECT_NAME(referencing_id) ObjAnalisado, referenced_entity_name, referenced_id
from sys.sql_expression_dependencies
where referencing_id = object_id('dbo.spu')

select * from sys.dm_sql_referenced_entities('dbo.spu','OBJECT')

select * from sys.dm_sql_referencing_entities('dbo.spu','OBJECT')

Até o próximo post,
Landry.