2012-05-18 14 views
7

में सभी निर्भरताओं का वृक्ष मुझे दस्तावेज़ीकरण के बिना पुरानी प्रोजेक्ट को बनाए रखना है, और वहां कई टेबल और फ़ंक्शंस और संग्रहीत प्रक्रियाओं वाला डेटाबेस है। मैं तालिकाओं और संग्रहित प्रक्रियाओं के बीच निर्भरता का एक पेड़ बनाना चाहता हूं, उदाहरण के लिए, यह प्रक्रिया इन प्रक्रियाओं को निष्पादित करती है और इन तालिकाओं का उपयोग करती है।SQL सर्वर डेटाबेस

  1. वहाँ किसी भी उपकरण है जो मेरी मदद कर सकते

  2. अगर वहाँ नहीं है, इस तरह के एल्गोरिदम के लिए प्रारंभ बिंदु क्या है? मेरा मतलब है कि मैं डेटाबेस से सभी प्रक्रियाओं का स्रोत कोड प्राप्त कर सकता हूं, और इसे 'exeC#', 'अपडेट #', '# में सम्मिलित करें' और इसी तरह के लिए पार्स करने के लिए। और इस मामले में, इस समस्या को हल करने का सबसे अच्छा तरीका क्या है (शायद regex, या कुछ विशेष एल्गोरिदम ...)?

उत्तर

4

अच्छी तरह से, वहाँ Redgate जैसे उपकरणों का भुगतान किया जाता है, लेकिन अगर आप चाहते हैं, तो आप हमेशा सही एक वस्तु पर क्लिक करें ans चुनें "दृश्य निर्भरता" कर सकते हैं।

+0

देखें निर्भरता बहुत अच्छा लगता है। और मुझे पता है कि मैं इसे sys.sql_dependencies से प्राप्त कर सकता हूं और मजेदार के लिए "अद्भुत" जीयूआई के साथ अपना स्वयं का टूल बना सकता हूं। बहुत धन्यवाद! – purum

+0

मदद करने में खुशी हुई।कृपया इसे समाप्त करते समय कोड पोस्ट करें :) – Diego

5

जिन्हें आप नीचे देख आप sys.dm_sql_referenced_entities का उपयोग किसी भी वस्तु

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

6

यहाँ, अधिकतम (स्तर) के सभी निर्भरता प्राप्त करने के लिए बाहरी उपकरण

;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, आपका कोड मेरे लिए बहुत उपयोगी था। मैंने परिपत्र निर्भरताओं को हटाने, तालिका संदर्भों को शामिल करने और ऑब्जेक्टपाथ द्वारा क्रमबद्ध करने के लिए इसे थोड़ा सा परिष्कृत किया।

;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

यह शानदार है। क्या यह जांच ट्रिगर्स की निर्भरताओं को भी जांचना संभव है? – MarredCheese

+0

कहां बदलना चाहिए। टाइप करें ('पी', 'वी', 'आईएफ', 'एफएन', 'टीएफ', 'यू') और (rso.type शून्य या rso.type है ('पी', 'वी', 'आईएफ', 'एफएन', 'टीएफ', 'यू')) जहां से। टाइप करें ('पी', 'वी', 'आईएफ', 'एफएन', ' टीएफ ',' यू ',' टीआर ') और (rso.type शून्य या rso.type है (' पी ',' वी ',' आईएफ ',' एफएन ',' टीएफ ',' यू ',' टीआर ')) – sqlslinger

0

किसी ने रेडगेट के भुगतान ऐड-ऑन का उल्लेख किया है। ApexSQL एक और कंपनी है जो SQL सर्वर के लिए ऐड-ऑन बनाती है। उनमें से कुछ पैसे खर्च करते हैं, लेकिन अन्य स्वतंत्र हैं और अभी भी बहुत उपयोगी हैं।

ApexSQL खोज निःशुल्क में से एक है। यह 2 मुख्य विशेषताएं इस प्रकार हैं:

  1. आप कुछ पाठ के लिए एक डेटाबेस के डेटा या संरचना खोज करने के लिए अनुमति देता है।
  2. एक या अधिक वस्तुओं (आप जो चाहते हैं) के लिए निर्भरताओं का एक ग्राफिकल पेड़ बना सकते हैं।

आप इसे स्थापित करने के बाद सिर्फ एक वस्तु या डेटाबेस राइट क्लिक करें और (यह करने के लिए तल के पास, एक आइकन के साथ अगले) पर क्लिक करें View dependenciesView Dependencies (शीर्ष के पास, इसके बगल में एक आइकन के बिना) को भ्रमित न करें, जो कि SQL सर्वर में बनाया गया है। मुझे पदानुक्रमित आरेख लेआउट सबसे उपयोगी माना जाता है।

लिंक:

संबंधित मुद्दे