मुझे एक DB में सभी तालिकाएँ कैसे मिलेंगी जिनमें कोई स्पष्ट प्राथमिक कुंजी नहीं है?


10

एक Google खोज ने बिना अनुक्रमित किए टेबल को खोजने के लिए लाखों हिट दिए, पीके आम तौर पर एक टेबल का क्लस्टर इंडेक्स होता है। हालाँकि, एक तालिका में आसानी से क्लस्टर इंडेक्स के रूप में एक प्राकृतिक कुंजी और पहचान कॉलम की तरह एक गैर-क्लस्टर किए गए सरोगेट इंडेक्स हो सकते हैं।

मैं एक प्राथमिक कुंजी के बिना एक DB में सभी तालिकाओं को कैसे खोज सकता हूं? मेरे पास इस डीबी में 245 टेबल हैं: मैनुअल निरीक्षण सकल अक्षम है।

जवाबों:


13

युगल इस बिल्ली की त्वचा के लिए तरीके लेकिन यह SQL Server 2005 और ऊपर में ठीक काम करता है, और मैं इसे समस्या से निपटने के लिए एक दर्द मुक्त तरीका लगता है -

OBJECTPROPERTY()समारोह वस्तुओं के बारे में विभिन्न गुणों को सूचीबद्ध कर सकते - तालिकाओं की तरह। उन गुणों में से एक है कि एक मेज के पास एक प्राथमिक कुंजी है या नहीं।

OBJECTPROPERTY(object_id, tablehasprimarykey) = 0 एक प्राथमिक कुंजी के बिना एक तालिका होगी।

इसलिए

SELECT OBJECT_SCHEMA_NAME( object_id ) as SchemaName, name AS TableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'tablehasprimaryKey') = 0 
ORDER BY SchemaName, TableName ;

आपको जो चाहिए वो आपको देना चाहिए। आप ऑनलाइन पुस्तकों में OBJECTPROPERTY () फ़ंक्शन का उपयोग करने के अन्य तरीकों के बारे में देख सकते हैं। यह लेख का 2012 संस्करण है।


अच्छी तरह से object_id काम करेगा मुझे लगा कि हम फ़ंक्शन का उपयोग कर रहे हैं। लेकिन sys.tablesखुद ही इस शानदार फ़ंक्शन को दिखाने के लिए आईडी और धन्यवाद देता है।
बीजू ने

कोई दिक्कत नहीं है। यह एक अच्छा कार्य है। गुणों का बहुत। इस स्थिति में आपके पास यह अधिकार है - sys.tables पहले से ही इसके अंदर object_id को सूचीबद्ध करता है। और वह ऑब्जेक्ट_आईडी है जिसे हम OBJECTPROPERTY फ़ंक्शन के ID पैरामीटर के लिए पास करना चाहते हैं। मेरे द्वारा उपयोग किए गए आरक्षित कीवर्ड पर अच्छी पकड़ के लिए धन्यवाद :)
माइक वॉल्श

, आप ऑब्जेक्ट_आईडी फ़ंक्शन के बारे में बिल्कुल सही थे, मैंने बस चीजों को मिलाया। इसे इंगित करने के लिए धन्यवाद। इसके अलावा objectproperty()2005 से उपलब्ध है, मैंने अभी-अभी बोल की जांच की है, है ना?
बीजू जॉस

हाँ। 2005 में - 2014 और इस बिंदु पर परे :-)
माइक वाल्श

मैंने स्कीमा नाम जोड़ने के लिए स्क्रिप्ट को संपादित किया। ध्यान दें कि (OBJECTPROPERTY की तरह) OBJECT_SCHEMA_NAME () फ़ंक्शन MSSQL 2005 के लिए नया था।
ग्रीनस्टोन वाकर

5

विशिष्ट समस्या के लिए माइक का समाधान उत्कृष्ट है।

आप और अधिक लचीलापन चाहते हैं, यहाँ एक विकल्प है कि आसानी से एक प्रश्न में बदल किया जा सकता है कि इस तरह के रिटर्न सभी तालिकाओं कि ढेर कर रहे हैं खोजने, या टेबल है कि कोई भी अद्वितीय की कमी की खोज के रूप में अन्य जानकारी, बिल्कुल

SELECT
    OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName,
    t.name AS TableName
    FROM sys.tables t
    WHERE
        NOT EXISTS
        (
            SELECT *
                FROM sys.indexes i
                WHERE
                    (i.object_id = t.object_id) AND
                    (i.is_primary_key = 1)
        );

एक बार जब आपकी (उप) प्रणाली ~ 50 तालिकाओं से अधिक हो जाती है, तो सभी मेटाडेटा तालिकाओं से परिचित होना वास्तव में महत्वपूर्ण है, क्योंकि जैसा कि आपने कहा, प्रत्येक तालिका के माध्यम से मैन्युअल रूप से जाना अव्यवहारिक है (और त्रुटि की संभावना है!)।


+1 के लिए "क्योंकि जैसा कि आपने कहा, मैन्युअल रूप से प्रत्येक तालिका के माध्यम से जाना अव्यवहारिक है (और त्रुटि के लिए प्रवण!)।" आमीन वहाँ। त्रुटि का बहुत खतरा :)
माइक वाल्श

4

SQL सर्वर का नीति प्रबंधन फ़ीचर इसमें से कुछ कर सकता है।

टेबल पहलू में @HasIndex और @HasClusteredIndex (साथ ही अन्य जो उपयोगी हो सकते हैं, जैसे ट्रिगर) फ़ील्ड हैं। सभी टेबलों पर, सभी डेटाबेस में, कई सर्वरों में (केंद्रीय प्रबंधन सर्वर सुविधा का उपयोग करके) स्थितियों की जाँच के लिए एक नीति बनाई जा सकती है।

हालांकि, यह एक प्राथमिक कुंजी इंडेक्स या बाधा के अस्तित्व की जांच नहीं कर सकता है। मैंने शपथ ली होगी कि @HasPrimaryKey एक क्षेत्र था, लेकिन यह MSSQL2012 में नहीं है। मैं या तो गलत कह रहा हूं या पागल हो रहा हूं।

नोट: नीति प्रबंधन SQL सर्वर 2012 एंटरप्राइज, बिजनेस इंटेलिजेंस और मानक संस्करणों के साथ शामिल है। यह एक्सप्रेस संस्करण में उपलब्ध नहीं है।


2
मुझे लगता है कि आप एक कस्टम स्थिति लिख सकते हैं जो इसे जांचती है। ऐसा करने के लिए पूरी तरह से अलग तरीके के लिए +1।
जॉन सिगेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.