2011-03-18 14 views
7

मेरे पास कई तालिकाओं के साथ SQL सर्वर डेटाबेस है, कुछ अब उपयोग नहीं किए गए हैं इसलिए मैं उन्हें हटाना चाहता हूं। सभी डेटाबेस इंटरएक्टिविटी संग्रहित प्रक्रिया के माध्यम से इन तालिकाओं में है।संग्रहित प्रक्रियाओं में संदर्भित सभी तालिकाओं को नहीं ढूंढें

क्या कोई डेटाबेस एसक्यूएल स्क्रिप्ट है जिसका उपयोग मैं कर सकता हूं जो डेटाबेस में किसी भी संग्रहीत प्रक्रियाओं में संदर्भित सभी तालिकाओं को सूचीबद्ध नहीं करेगा?

+0

एसक्यूएल सर्वर के किन संस्करणों अपने डेटाबेस के भीतर प्रत्येक देखने के लिए, नियम, डिफ़ॉल्ट, ट्रिगर, जांच बाधा, डिफ़ॉल्ट बाधा, और संग्रहीत प्रक्रिया की जाँच करेगा? –

+0

यह प्रश्न लगभग [लगभग एक] है (http://stackoverflow.com/questions/5352353/find-all-tables-not-referenced-in-stored-procedures) लेकिन उत्तर अलग हैं। – DOK

+1

@ डीओके - कौन सा? आपने इस सवाल पर वापस लिंक किया है! पकड़ के लिए –

उत्तर

3

यदि आप किसी गतिशील टी-एसक्यूएल का उपयोग करते हैं तो आप ऐसा नहीं कर सकते हैं। डायनामिक टी-एसक्यूएल ऑब्जेक्ट निर्भरताओं की किसी भी जांच में दिखाई नहीं देगा।

इसके बजाय, आप किसी भी प्रश्न से संदर्भित वस्तुओं को संदर्भित नहीं करने के लिए DMV sys.dm_db_index_usage_stats का उपयोग कर सकते हैं। यहाँ एक प्रश्न मुझे लगता है कि के लिए SQLServerPedia पर किया था है:

http://sqlserverpedia.com/wiki/Find_Indexes_Not_In_Use

क्वेरी, प्रदर्शन ट्यूनिंग अनुक्रमित लिए बनाया गया है, ताकि आप कुछ लाइनें बदलाव करने की आवश्यकता होगी। यहाँ संशोधित क्वेरी है:

SELECT 
o.name 
, indexname=i.name 
, i.index_id 
, reads=user_seeks + user_scans + user_lookups 
, writes = user_updates 
, rows = (SELECT SUM(p.rows) FROM sys.partitions p WHERE p.index_id = s.index_id AND s.object_id = p.object_id) 
, CASE 
    WHEN s.user_updates < 1 THEN 100 
    ELSE 1.00 * (s.user_seeks + s.user_scans + s.user_lookups)/s.user_updates 
    END AS reads_per_write 
, 'DROP INDEX ' + QUOTENAME(i.name) 
+ ' ON ' + QUOTENAME(c.name) + '.' + QUOTENAME(OBJECT_NAME(s.object_id)) as 'drop statement' 
FROM sys.dm_db_index_usage_stats s 
INNER JOIN sys.indexes i ON i.index_id = s.index_id AND s.object_id = i.object_id 
INNER JOIN sys.objects o on s.object_id = o.object_id 
INNER JOIN sys.schemas c on o.schema_id = c.schema_id 
WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1 
AND s.database_id = DB_ID() 
ORDER BY reads 

ध्यान रखें कि यह सब अनुक्रमित पकड़ता है, और आप में छान-बीन की आवश्यकता होगी - ढेर अपने वस्तुओं में से कुछ हो सकता है, कुछ अनुक्रमित संकुल हो सकता है, आदि मैं छोड़ देंगे यह एक विकी के रूप में है, इसलिए कोई मेरे द्वारा अधिक महत्वाकांक्षी है, इसे एक समर्पित सूची बनाने के लिए संपादित कर सकता है। :-D

0

शायद इन पंक्तियों के साथ कुछ:

select t.table_name 
from INFORMATION_SCHEMA.TABLES t 
where not exists (
    select 1 from INFORMATION_SCHEMA.ROUTINES r 
    where object_definition(object_id(r.ROUTINE_NAME)) like '%'+t.TABLE_NAME+'%' 
) order by t.TABLE_NAME 
0

यह का उपयोग करता है संग्रहीत proc नाम के साथ पहली क्वेरी सूचियों तालिका। दूसरी क्वेरी तालिका का उपयोग करके संग्रहीत प्रोसेस की संख्या के साथ सूचीबद्ध करती है।

-- list all tables/sprocs 
select t.name [Table], p.name [StoredProc] 
from sys.tables t 
left join sys.procedures p on (OBJECT_DEFINITION(p.object_id)) like '%' + t.name + '%' 
where t.type = 'U' 
order by t.name, p.name 

-- count stored procs using table 
select t.name [Table], count(p.name) [Count] 
from sys.tables t 
left join sys.procedures p on (OBJECT_DEFINITION(p.object_id)) like '%' + t.name + '%' 
where t.type = 'U' 
group by t.name 
order by t.name 
3

यदि SQL सर्वर 2008 तो निर्भरता जानकारी अब विश्वसनीय है।

SELECT SCHEMA_NAME(t.schema_id), 
     t.name 
FROM sys.tables t 
WHERE is_ms_shipped = 0 
     AND NOT EXISTS (SELECT * 
         FROM sys.sql_expression_dependencies d 
         WHERE d.referenced_entity_name = t.name 
           AND ((is_ambiguous = 1 or is_caller_dependent=1) 
            OR 
          d.referenced_id = t.object_id) ) 
+0

क्रॉस-डीबी निर्भरता सटीक हैं? मैंने सोचा कि वे अभी भी – JNK

+0

@JNK नहीं थे - 'sys.sql_expression_dependencies' में 'referenced_database_name' है जिसे देखा जा सकता है। मैंने इसके जवाब में बिल्कुल इसका विवरण नहीं लिया है और इसके अतिरिक्त मेरे उत्तर को ट्वीविंग की आवश्यकता होगी यदि ओपी के पास उनके किसी भी टेबल के समान नाम के कॉलम हैं। मैंने ओपी के लिए एक अभ्यास के रूप में छोड़ दिया है! –

0

तो performace नहीं है:

select 
    name 
from 
     sys.tables t 
    left join 
     sys.sql_dependencies d 
    on 
     t.object_id = 
     d.referenced_major_id 
where 
    d.referenced_major_id is null 

अन्यथा, यहाँ एक संदर्भ मैं अतीत में प्रयोग किया गया है आप निम्नलिखित कोशिश कर सकते हैं।

Select Distinct Object_Name(ID) 
From syscomments 
Where ID Not In (Select ID From syscomments Where Text Like '%<TableName>%') 

यह

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