আমি কোনও ডিবিতে সমস্ত টেবিল কীভাবে খুঁজে পাব যাতে কোনও স্পষ্ট প্রাথমিক কী নেই?


10

গুগল অনুসন্ধানে ক্লাস্টার ইনডেক্স ছাড়া টেবিলগুলি কীভাবে খুঁজে পাওয়া যায় সে সম্পর্কে লক্ষ লক্ষ হিট হয়েছিল, পিকে সাধারণত টেবিলের ক্লাস্টারড ইনডেক্স। তবে, একটি টেবিলটিতে সহজেই একটি ক্লাস্টারড সূচক হিসাবে একটি প্রাকৃতিক কী এবং কোনও পরিচয় কলামের মতো একটি নন-ক্লাস্টারড সারোগেট সূচক থাকতে পারে।

প্রাথমিক কী সংজ্ঞায়িত না করে ডিবিতে সমস্ত টেবিল আমি কীভাবে খুঁজে পাব? আমার এই ডিবিতে 245 টেবিল রয়েছে: ম্যানুয়াল পরিদর্শন গুরুতরভাবে অক্ষম।

উত্তর:


13

এই বিড়ালের চামড়ার বেশ কয়েকটি উপায় কিন্তু এসকিউএল সার্ভার ২০০৫ এবং তারপরে এটি দুর্দান্ত কাজ করে এবং আমি সমস্যাটি পরিচালনা করার জন্য এটি একটি ব্যথামুক্ত উপায় মনে করি -

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 সংস্করণ।


ভাল বস্তু_আইডি কাজ করবে আমি ভেবেছিলাম আমরা ফাংশনটি ব্যবহার করছি using তবে sys.tablesনিজেই এই আইডি দেয় এবং এই দুর্দান্ত ফাংশনটি দেখানোর জন্য ধন্যবাদ।
বিজু জোস

সমস্যা নেই. এটি একটি ভাল ফাংশন। সম্পত্তি প্রচুর। এই ক্ষেত্রে আপনার ঠিক আছে - sys.tables ইতিমধ্যে এর ভিতরে অবজেক্ট_আইডি তালিকাবদ্ধ করে। এবং এটি হ'ল অবজেক্ট_আইডি আমরা আইডি প্যারামিটারের জন্য OBJECTPROPERTY ফাংশনে যেতে চাই। আমি সেখানে ব্যবহার করা সংরক্ষিত কীওয়ার্ডটিতে ভাল ধরা পড়ার জন্য ধন্যবাদ :)
মাইক ওয়ালশ

, আপনি অবজেক্ট_আইডি ফাংশন সম্পর্কে যথাযথভাবে সঠিক ছিলেন, আমি সেখানে জিনিসগুলি মিশ্রিত করেছি well এটি উল্লেখ করার জন্য ধন্যবাদ well objectproperty()2005 সাল থেকে পাওয়া যায়, আমি ঠিক বলটি পরীক্ষা করেছি, তাই না?
বিজু জোস

হ্যাঁ. সেখানে 2005 - 2014 এবং তার পরেও এই মুহুর্তে :-)
মাইক ওয়ালশ

স্কিমা নাম যুক্ত করতে আমি স্ক্রিপ্ট সম্পাদনা করেছি। মনে রাখবেন (ওবিজেইসিটিপিপ্রটিটির মতো) ওবিজেইসিএসএসইচেমিএক্স () ফাংশনটি এমএসএসকিউএল 2005-এ নতুন ছিল
গ্রিনস্টোন ওয়াকার

5

মাইকের সমাধান নির্দিষ্ট সমস্যার জন্য দুর্দান্ত।

আপনি আরো নমনীয়তা চাইলে এখানে একটি বিকল্প সহজেই একটি ক্যোয়ারী মধ্যে morphed করা যেতে পারে যে আয় এই ধরনের সমস্ত টেবিল যে গাদা হয় খোঁজার বা টেবিল আছে কোন অনন্য সীমাবদ্ধতার খোঁজার অন্যান্য তথ্য, এ সব

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 টেবিলের ওপরে গেলে, সমস্ত মেটাডেটা টেবিলের সাথে পরিচিত হওয়া সত্যিই গুরুত্বপূর্ণ, কারণ আপনি যেমনটি বলেছিলেন, প্রতিটি টেবিলের ম্যানুয়ালি অযৌক্তিক হওয়া (এবং ত্রুটির প্রবণতা!) Is


"এর জন্য" কারণ আপনি যেমন বলেছেন, প্রতিটি টেবিলের মাধ্যমে ম্যানুয়ালি অযৌক্তিক (এবং ত্রুটির প্রবণতা!) Is " আমেন সেখানে। খুব ত্রুটি হওয়ার প্রবণতা :)
মাইক ওয়ালশ

4

নীতি ম্যানেজমেন্ট SQL সার্ভার এর বৈশিষ্ট্যটি এই কিছু করতে পারেন।

সারণী মুখীটির ক্ষেত্রগুলি রয়েছে @ হ্যাস ইন্ডেক্স এবং @ হ্যাসক্লাস্টার্ড ইন্ডেক্স (পাশাপাশি অন্যান্য যেগুলি কার্যকর হতে পারে যেমন ট্রিগারগুলির মতো)। সমস্ত টেবিলের শর্তাবলী পরীক্ষা করতে একটি নীতি তৈরি করা যেতে পারে, সমস্ত ডাটাবেসে, বেশ কয়েকটি সার্ভারে (সেন্ট্রাল ম্যানেজমেন্ট সার্ভার বৈশিষ্ট্য ব্যবহার করে)।

এটি অবশ্য প্রাথমিক কী সূচক বা সীমাবদ্ধতার অস্তিত্ব পরীক্ষা করতে পারে না। আমি শপথ করে বলতাম যে এখানে @ হাসপ্রাইমারিকি একটি ক্ষেত্র ছিল তবে এটি এমএসএসকিউএল ২০১২ তে নেই। আমি হয় দুর্বৃত্ত বা পাগল হয়ে যাচ্ছি।

দ্রষ্টব্য: নীতি ব্যবস্থাপনার এসকিউএল সার্ভার 2012 এন্টারপ্রাইজ, বিজনেস ইন্টেলিজেন্স এবং স্ট্যান্ডার্ড সংস্করণগুলির সাথে অন্তর্ভুক্ত রয়েছে। এটি এক্সপ্রেস সংস্করণে উপলভ্য নয়।


2
আমি মনে করি আপনি একটি কাস্টম শর্ত লিখতে পারেন যা এটি পরীক্ষা করে। এটি করার জন্য সম্পূর্ণ ভিন্ন উপায়ে +1।
জন সেগেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.