2012-12-07 19 views
8

एसक्यूएल सर्वर संस्करण - 2008 R2हो रही एसक्यूएल सर्वर क्रॉस डेटाबेस निर्भरता

मैं रखरखाव पर लेने का एक उद्देश्य के साथ एक डीएमएस समाधान का मूल्यांकन, पर काम कर रहा हूँ। मूल समाधान में एक केंद्रीय डेटाबेस है, जिसमें निर्माता से संबंधित डेटा है। इसमें प्रत्येक डीलर के लिए एक डेटाबेस भी है, जिसका अर्थ है कि बहुत सारे क्रॉस डेटाबेस निर्भरताएं हैं।

समस्याओं:

  • कोई DB प्रलेखन
  • कोई कोड टिप्पणी
  • ढेर बहुत
  • कोई मानक वस्तु नामकरण सम्मेलनों
  • केंद्रीय डीबी 460+ टेबल और 900 + sprocs है अन्य के अलावा वस्तुओं
  • प्रत्येक डीलर डीबी 370+ टेबल और 2350+ sprocs है, additio में अन्य वस्तुओं

पहले कदम के रूप के लिए n, मैं डीबी, जिसके लिए वह पार डेटाबेस निर्भरता भी शामिल वस्तु निर्भरता, समझने के लिए महत्वपूर्ण है की एक पूरी सफाई की सिफारिश कर रहा हूँ। मैंने रेड गेट के समाधान का उपयोग करने की कोशिश की, लेकिन आउटपुट बहुत विशाल है। सभी मैं चाहता हूँ डेटाबेस किसी भी निर्भरता की जरूरत नहीं है कि में वस्तुओं की एक सूची है - वे न तो अन्य वस्तुओं पर निर्भर करते हैं, और न ही वहाँ किसी भी वस्तुओं है कि उन पर निर्भर कर रहे हैं। - निर्भरता - जो में मैं इस परिणाम प्रत्येक डीबी से सेट डालने की जाएगी

SELECT 
DB_NAME() referencing_database_name, 
OBJECT_NAME (referencing_id) referencing_entity_name, 
ISNULL(referenced_schema_name,'dbo') referenced_schema_name, 
referenced_entity_name, 
ao.type_desc referenced_entity_type, 
ISNULL(referenced_database_name,DB_NAME()) referenced_database_name 
FROM sys.sql_expression_dependencies sed 
JOIN sys.all_objects ao 
ON sed.referenced_entity_name = ao.name 

मैं एक मेज बनाने की जाएगी:

यहाँ स्क्रिप्ट मैं निर्भरता की एक सूची प्राप्त करने के लिए इस्तेमाल किया है। AllObjects- जो डेटाबेस में सभी वस्तुओं की एक सूची में शामिल होंगे - एक अगले कदम के रूप में, मैं भी एक और तालिका बनाने की जाएगी। यहाँ यह करने के लिए स्क्रिप्ट है:

SELECT 
DB_NAME() DBName, 
name, 
type_desc 
FROM sys.all_objects 
WHERE type_desc IN 
(
'VIEW', 
'SQL_TABLE_VALUED_FUNCTION', 
'SQL_STORED_PROCEDURE', 
'SQL_INLINE_TABLE_VALUED_FUNCTION', 
'USER_TABLE', 
'SQL_SCALAR_FUNCTION' 
) 

अब, यह मेज, कि निर्भरता तालिका में referenced_entity_name स्तंभ में दिखाई नहीं देते वस्तुओं है कि मैं देख रहा हूँ की एक सूची देना चाहिए से नाम की एक सूची।

SELECT 
AO.DBName, 
AO.name, 
AO.type_desc 
FROM AllObjects AO 
LEFT OUTER JOIN Dependencies D ON 
D.referenced_database_name = AO.DBName AND 
D.referenced_entity_name = AO.name AND 
D.referenced_entity_type = AO.type_desc 
WHERE 
D.referenced_database_name IS NULL AND 
D.referenced_entity_name IS NULL AND 
D.referenced_entity_type IS NULL 

अब सवाल:

  1. कुछ वस्तु निर्भरता उत्पादन में लापता हो रहे हैं। मैं क्या याद आ रही रहा हूँ?
  2. मैं कैसे सत्यापित करूं कि मेरे निष्कर्ष सही हैं?
  3. मेरा मतलब है कि ऐसा करने का एक अलग तरीका है, इसलिए मैं परिणामों की तुलना कर सकता हूं और दोबारा जांच कर सकता हूं?

अग्रिम धन्यवाद,

राज

+0

आप भी प्रणाली वस्तुओं की परवाह करते हैं है? –

+0

लेकिन टाइप = 'यू' केवल उपयोगकर्ता टेबल देगा, है ना? मुझे अन्य उपयोगकर्ता निर्मित वस्तुओं पर विचार करने की भी आवश्यकता है। – Raj

+0

क्षमा करें, "और is_ms_shipped = 0" दूसरी क्वेरी के लिए अधिक उपयुक्त हो सकता है। यह सिस्टम विशिष्ट वस्तुओं को बाहर करना चाहिए। –

उत्तर

3

ओह, एमएस sys.sql_expression_dependencies साथ पार डेटाबेस निर्भरता का पता लगाने में एक अच्छा प्रयास किया है, लेकिन मैंने देखा है यह पहले बातें याद आती है। आपके मामले में, मैं एक लापता निर्भरता का एक उदाहरण ढूंढ सकते हैं, और उलटे पांव लौटने से शुरू: आप अपनी क्वेरी से यह गिरावट आई है कुछ कैसे? यदि ऐसा है, तो अपनी क्वेरी को ठीक करें। sys.sql_expression_dependencies निर्भरता की एक निश्चित वर्ग छोड़ करता है? किस परिस्थितियों में? गतिशील एसक्यूएल दोष है? आदि।

आपको sys.sql_modules में प्रत्येक ऑब्जेक्ट के लिए sp_refreshsqlmodule भी चलाया जाना चाहिए, और फिर अपना कोड दोबारा शुरू करना चाहिए। यह निर्भरता जानकारी को रीफ्रेश करने के लिए SQL सर्वर को मजबूर करता है (इसकी सर्वोत्तम क्षमता के लिए)।

अब, प्रमाणीकरण के लिए, एक ट्रेस सेट अप करें, और ईवेंट 114, "ऑडिट स्कीमा ऑब्जेक्ट एक्सेस इवेंट", साथ ही संग्रहित प्रक्रिया और/या आरपीसी कॉल के लिए प्रारंभिक और पूर्ण ईवेंट सुनें। कॉलम DatabaseName, ParentName, ObjectName, ServerName, SPID और RequestID (एमएआरएस-सक्षम कनेक्शन के लिए) शामिल करें। शायद कुछ अन्य भी। "ऑडिट स्कीमा ऑब्जेक्ट एक्सेस इवेंट" किसी ऑब्जेक्ट तक पहुंचने पर होता है, इसलिए इस ट्रेस के दौरान ऐप का प्रयोग करें, फिर SPID + RequestId का उपयोग करके डेटा को एकत्र करें और sys.sql_expression_dependencies का उपयोग करके अपने परिणामों की तुलना करें। यदि ट्रेस डेटा में कुछ भी है जो आपके निर्भरता डेटा में प्रकट नहीं होता है, तो आप कुछ याद कर चुके हैं।

7

आप अपने परिणामों की तुलना निम्न स्क्रिप्ट को प्राप्त कर सकते हैं। यहाँ पूर्ण article

CREATE PROCEDURE [dbo].[get_crossdatabase_dependencies] AS 

SET NOCOUNT ON; 

CREATE TABLE #databases(
    database_id int, 
    database_name sysname 
); 

INSERT INTO #databases(database_id, database_name) 
SELECT database_id, [name] 
FROM sys.databases 
WHERE 1 = 1 
    AND [state] <> 6 /* ignore offline DBs */ 
    AND database_id > 4; /* ignore system DBs */ 

DECLARE 
    @database_id int, 
    @database_name sysname, 
    @sql varchar(max); 

CREATE TABLE #dependencies(
    referencing_database varchar(max), 
    referencing_schema varchar(max), 
    referencing_object_name varchar(max), 
    referenced_server varchar(max), 
    referenced_database varchar(max), 
    referenced_schema varchar(max), 
    referenced_object_name varchar(max) 
); 

WHILE (SELECT COUNT(*) FROM #databases) > 0 BEGIN 
    SELECT TOP 1 @database_id = database_id, 
       @database_name = database_name 
    FROM #databases; 

    SET @sql = 'INSERT INTO #dependencies select 
     DB_NAME(' + convert(varchar,@database_id) + '), 
     OBJECT_SCHEMA_NAME(referencing_id,' 
      + convert(varchar,@database_id) +'), 
     OBJECT_NAME(referencing_id,' + convert(varchar,@database_id) + '), 
     referenced_server_name, 
     ISNULL(referenced_database_name, db_name(' 
      + convert(varchar,@database_id) + ')), 
     referenced_schema_name, 
     referenced_entity_name 
    FROM ' + quotename(@database_name) + '.sys.sql_expression_dependencies'; 

    EXEC(@sql); 

    DELETE FROM #databases WHERE database_id = @database_id; 
END; 

SET NOCOUNT OFF; 

SELECT * FROM #dependencies; 
+1

ध्यान रखें कि यदि कोई डेटाबेस ऑफ़लाइन है तो भी इसे एक्सेस करने का प्रयास किया जाएगा और इस प्रकार –

+0

त्रुटि बिंदु को ग़लत कर देगा, मैंने अभी ऑफ़लाइन डेटाबेस को अनदेखा करने के लिए 'WHERE' फ़िल्टर में एक पंक्ति जोड़ा है^_ ^ – Oreo

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

  • कोई संबंधित समस्या नहीं^_^