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.