2012-05-18 13 views
7

Devo mantenere un vecchio progetto senza documentazione, e c'è un database con molte tabelle e funzioni e stored procedure. Voglio costruire un albero di dipendenze tra tabelle e stored procedure, ad esempio, questa procedura esegue queste procedure e utilizza queste tabelle.Albero di tutte le dipendenze in un database di SQL Server

  1. C'è qualche strumento che mi può aiutare

  2. Se non c'è, qual è il punto di partenza per tali algoritmi? Intendo dire che posso ottenere il codice sorgente di tutte le procedure dal database e che analizzarlo per tutti i 'exeC#', 'update #', 'insert in #' e così via. E in questo caso, qual è il modo migliore per risolvere questo problema (regex forse, o alcuni algoritmi speciali ...)?

risposta

4

bene, ci sono strumenti come Redgate pagato, ma se si vuole, si può sempre fare clic destro un oggetto ans selezionare "Visualizza dipendenze".

+0

Visualizza dipendenze sembra grande. E so che posso ottenere questo google da sys.sql_dependencies e creare il mio strumento con la GUI "sorprendente", solo per divertimento. Grazie mille! – purum

+0

felice di aiutare.per favore pubblica il tuo codice quando lo finisci :) – Diego

5

È possibile utilizzare sys.dm_sql_referenced_entities come mostrato di seguito per ottenere tutte le dipendenze di qualsiasi oggetto

SELECT * FROM sys.dm_sql_referenced_entities('dbo.myStoredProcedure', 'OBJECT')

6

Qui, il massimo (livello) dovrebbe risolvere il tuo problema senza bisogno di strumenti esterni

;WITH cte ([ID] ,IDSchema,Nome,Tipo,level, SortCol) 
AS  (SELECT [so].[object_id] AS ID 
       ,so.[schema_id],so.[name],so.[type] 
       ,0 AS [Level]  
       ,CAST ([so].[object_id] AS VARBINARY (MAX)) AS SortCol 
      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 
      --in my database, if i insert tables on the search, it gets more tham 100 levels of recursivity, and that is bad 
     WHERE [rso].[type] IS NULL AND [so].[type] IN ('V','IF','FN','TF','P') 

     UNION ALL 
     SELECT [so].[object_id] AS ID 
      ,so.[schema_id],so.[name],so.[type] 
       ,Level + 1 
       ,CAST (SortCol + CAST ([so].[object_id] AS BINARY (4)) AS VARBINARY (MAX)) 
     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 cte AS cp ON rso.[object_id] = [cp].[ID] 
      WHERE [so].[type] IN ('V','IF','FN','TF','P') 
      AND ([rso].[type] IS NULL OR [rso].[type] IN ('V','IF','FN','TF','P')) 
      ) 

--CTE 
SELECT ID, IDSchema, 
    REPLICATE(' ',level)+nome AS Nome,'['+SCHEMA_NAME(IDSchema)+'].['+nome+']' AS Object,Tipo,Level,SortCol 
FROM  cte AS p 
ORDER BY sortcol 
4

Higarian, il tuo codice mi è stato molto utile. L'ho perfezionato un po 'per rimuovere le dipendenze circolari, includere i riferimenti alle tabelle e ordinare per 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 
+0

Questo è fantastico. È possibile avere questo controllo anche le dipendenze dei trigger? – MarredCheese

+0

Dovrebbe essere una questione di cambiare dove so.type in ('P', 'V', 'IF', 'FN', 'TF', 'U') e (rso.type è null o rso.type in ('P', 'V', 'IF', 'FN', 'TF', 'U')) a dove so.type in ('P', 'V', 'IF', 'FN', ' TF ',' U ',' TR ') e (rso.type è null o rso.type in (' P ',' V ',' IF ',' FN ',' TF ',' U ',' TR ')) – sqlslinger

0

Qualcuno ha menzionato i componenti aggiuntivi a pagamento di Redgate. ApexSQL è un'altra società che crea componenti aggiuntivi per SQL Server. Alcuni di costano denaro, ma altri sono gratuiti e comunque abbastanza utili.

Ricerca ApexSQL è uno di quelli gratuiti. Si tratta di 2 caratteristiche principali sono:

  1. permette di cercare i dati o la struttura di un database per un determinato testo.
  2. È possibile creare un albero grafico di dipendenze per uno o più oggetti (ciò che si desidera).

Dopo averlo installato, è sufficiente fare clic con il pulsante destro del mouse su un oggetto o database e fare clic su View dependencies (vicino alla parte inferiore, con un'icona accanto). Non confonderlo con View Dependencies (vicino alla parte superiore, senza un'icona accanto), che è quello incorporato in SQL Server. Trovo che il layout del diagramma gerarchico sia il più utile.

vicini:

Problemi correlati