Neste artigo irei mostrar um script que mostra todos os objetos e suas respectivas dependências em um database.
Este script é útil para algumas situações, por exemplo: você irá realizar uma manutenção em uma procedure, e para isto você precisa saber quais são os objetos ‘dependetes’ desta mesma procedure a fim de verificar se estes objetos dependentes poderão ser impactados. Outro exemplo: você irá adicionar um novo campo em um tabela X, com este script você pode verificar a quais procedures, views ou functions utilizam esta tabela, entre outros.
O scritpt retorna os seguintes campos:
– DBName: nome do database;
– Object_Schema: o schema do objeto pai;
– Object_Name: o nome do objeto pai;
– Child_Schema: o schema do objeto dependente (filho);
– Child_Name: o nome do objeto dependente (filho);
– Child_Type: o tipo do objeto, por exemplo: USER_TABLE, SQL_STORED_PROCEDURE, etc.
O script analisa as views sys.objects e sysdepends.
Script
Use <Database> SELECT DB_Name() As DBName ,Referencing.DBObject_Schema As Object_Schema ,Referencing.DBObject As [Object_Name] ,Referenced.Child_DBBObject_Schema As [Child_Schema] ,Referenced.Child_DBObject As [Child_Name] ,Referenced.Child_DBObject_Type As [Child_Type] FROM ( SELECT [Object_ID] As DBObject_Id ,Schema_Name([Schema_ID]) As DBObject_Schema ,Name As DBObject ,Type_Desc As DBObject_Type FROM sys.objects WHERE Type Not In('D','IT','PK','SQ','UQ','U','S','TR') ) Referencing LEFT OUTER JOIN ( SELECT Id As Parent_DBObject_Id ,DepId As Child_DBObject_Id ,Schema_Name([Schema_ID]) As Child_DBBObject_Schema ,Name As Child_DBObject ,Type_Desc As Child_DBObject_Type FROM sysdepends JOIN sys.objects ON [Object_ID] = DepId GROUP BY Id, DepId, [Schema_Id], Name, Type_Desc ) Referenced ON Referencing.DBObject_Id = Referenced.Parent_DBObject_Id
Se você quiser obter as dependências de um objeto especifico, a cláusula WHERE deve ficar desta maneira:
(...) ON Referencing.DBObject_Id = Referenced.Parent_DBObject_Id WHERE Referencing.DBObject = 'ObjectName'
Ou caso você queria obter os objetos pais de um objeto especifico (são referenciados), a cláusula WHERE deve ficar desta maneira:
(...) ON Referencing.DBObject_Id = Referenced.Parent_DBObject_Id WHERE Referenced.Child_DBObject = 'ObjectName'