I have to maintain an old project without documentation, and there is a database with a lot of tables and functions and stored procedures. I want to build a tree of dependencies between tables and stored procedures, for example, this procedure execs these procedures and uses these tables.
Is there any tool that can help me
If there is not, what is the start point for such algorithms? I mean that I can get source code of all procedures from database, and than parse it for all 'exec #', 'update #', 'insert into #' and so on. And in this case, what is the best way to solve this problem (regex maybe, or some special algorithms...)?
Higarian, your code was very useful to me. I refined it a bit to remove circular dependencies, include table references, and to sort by the ObjectPath.
;with ObjectHierarchy ( Base_Object_Id , Base_Cchema_Id , Base_Object_Name , Base_Object_Type, object_id , Schema_Id , Name , Type_Desc , Level , Obj_Path)
as
( select so.object_id as Base_Object_Id
, so.schema_id as Base_Cchema_Id
, so.name as Base_Object_Name
, so.type_desc as Base_Object_Type
, so.object_id as object_id
, so.schema_id as Schema_Id
, so.name
, so.type_desc
, 0 as Level
, convert ( nvarchar ( 1000 ) , N'/' + so.name ) as Obj_Path
from sys.objects so
left join sys.sql_expression_dependencies ed on ed.referenced_id = so.object_id
left join sys.objects rso on rso.object_id = ed.referencing_id
where rso.type is null
and so.type in ( 'P', 'V', 'IF', 'FN', 'TF' )
union all
select cp.Base_Object_Id as Base_Object_Id
, cp.Base_Cchema_Id
, cp.Base_Object_Name
, cp.Base_Object_Type
, so.object_id as object_id
, so.schema_id as ID_Schema
, so.name
, so.type_desc
, Level + 1 as Level
, convert ( nvarchar ( 1000 ) , cp.Obj_Path + N'/' + so.name ) as Obj_Path
from sys.objects so
inner join sys.sql_expression_dependencies ed on ed.referenced_id = so.object_id
inner join sys.objects rso on rso.object_id = ed.referencing_id
inner join ObjectHierarchy as cp on rso.object_id = cp.object_id and rso.object_id <> so.object_id
where so.type in ( 'P', 'V', 'IF', 'FN', 'TF', 'U')
and ( rso.type is null or rso.type in ( 'P', 'V', 'IF', 'FN', 'TF', 'U' ) )
and cp.Obj_Path not like '%/' + so.name + '/%' ) -- prevent cycles n hierarcy
select Base_Object_Name
, Base_Object_Type
, REPLICATE ( ' ' , Level ) + Name as Indented_Name
, SCHEMA_NAME ( Schema_Id ) + '.' + Name as object_id
, Type_Desc as Object_Type
, Level
, Obj_Path
from ObjectHierarchy as p
order by Obj_Path
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With