اسکریپت یافتن جداول فاقد PrimaryKey
اسکریپت یافتن جداول فاقد Primary Key در SQL Server با استفاده از کوئریهای سیستمی، جدولهای بدون کلید اصلی را شناسایی میکند.
23 آبان 1405
لینک کوتاه
اسکریپت یافتن جداول فاقد Primary Key در SQL Server
در پایگاه داده SQL Server، هر جدول برای ذخیرهسازی و مدیریت اطلاعات به ساختار مشخصی نیاز دارد.یکی از مهمترین اجزای این ساختار، کلید اصلی یا Primary Key است.
کلید اصلی ستونی یا مجموعهای از ستونهاست که هر رکورد را بهصورت یکتا مشخص میکند و مانع از ثبت مقادیر تکراری یا NULL در ستونهای مربوط به آن میشود.
با این حال، در بسیاری از پایگاههای داده، تعدادی از جداول بدون تعریف کلید اصلی ایجاد شدهاند.
شناسایی این جداول یکی از اقدامات مهم برای بررسی ساختار دیتابیس و بهبود کیفیت طراحی آن محسوب میشود.
اسکریپت یافتن جداول فاقد Primary Key به مدیران پایگاه داده و برنامهنویسان کمک میکند تا بدون بررسی دستی تکتک جداول، فهرست جدولهایی را مشاهده کنند که هیچ کلید اصلی تعریفشدهای ندارند.
این موضوع بهخصوص در دیتابیسهای بزرگ که ممکن است صدها یا هزاران جدول داشته باشند، اهمیت بیشتری پیدا میکند.
🌟 آیا میخواهید به یک متخصص پایگاه داده تبدیل شوید و در دنیای فناوری اطلاعات بدرخشید؟با دوره آموزشی SQL Server ما، شما میتوانید به راحتی و با روشی عملی، تمام مهارتهای لازم را یاد بگیرید!این دوره به شما آموزش میدهد که چگونه دادهها را به بهترین شکل مدیریت کنید، گزارشهای قدرتمند بسازید و به تحلیلهای عمیق دست یابید.با محتوای جذاب و پروژههای واقعی، شما نه تنها تئوری را یاد میگیرید، بلکه تواناییهای عملی خود را نیز تقویت میکنید.پس فرصت را از دست ندهید! همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده شغلی روشنتر بردارید!
چرا باید جداول فاقد Primary Key را شناسایی کنیم؟
در پروژههای نرمافزاری، ساختار پایگاه داده ممکن است در طول زمان تغییر کند.گاهی جداول جدید بدون توجه کافی به اصول طراحی ایجاد میشوند و گاهی نیز دیتابیس از سیستم دیگری منتقل میشود که در آن بعضی جداول کلید اصلی ندارند.
شناسایی این جداول چند مزیت مهم دارد.
نخست اینکه وجود کلید اصلی، شناسایی دقیق رکوردها را آسانتر میکند.
اگر جدولی چندین رکورد مشابه داشته باشد و هیچ شناسه یکتایی برای آن تعریف نشده باشد، ممکن است انتخاب یا حذف یک رکورد مشخص دشوار شود.
دوم اینکه کلید اصلی میتواند مبنای ایجاد ارتباطهای معتبر میان جداول قرار بگیرد.
در بسیاری از طراحیهای رابطهای، جدولهای دیگر با استفاده از Foreign Key به کلید اصلی یک جدول اشاره میکنند.
سوم اینکه بررسی جداول فاقد کلید اصلی در فرایند بازبینی ساختار دیتابیس، مستندسازی و شناسایی مشکلات احتمالی طراحی مفید است.
چهارم اینکه در برخی ابزارها و فرایندهای پردازش داده، وجود کلید اصلی یا یک شناسه یکتا برای تشخیص تغییرات و شناسایی رکوردها اهمیت دارد.
با این حال، باید بین شناسایی جداول فاقد کلید اصلی و تصمیمگیری برای افزودن کلید اصلی تفاوت قائل شد.
هر جدول بدون Primary Key الزاماً به اصلاح نیاز ندارد.
برای مثال، بعضی جداول موقت، واسط یا مرحلهای ممکن است بر اساس نیاز پروژه بدون کلید اصلی طراحی شده باشند.
اسکریپت یافتن جداول فاقد Primary Key
برای شناسایی جداولی که در دیتابیس فعلی هیچ کلید اصلی تعریفشدهای ندارند، میتوان از نماهای سیستمی SQL Server استفاده کرد.اسکریپت زیر تمام جداول کاربری دیتابیس جاری را بررسی میکند و جدولهایی را نمایش میدهد که هیچ Primary Key ندارند.
SELECT
s.name AS SchemaName,
t.name AS TableName
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.schema_id = s.schema_id
WHERE NOT EXISTS
(
SELECT 1
FROM sys.key_constraints AS kc
WHERE kc.parent_object_id = t.object_id
AND kc.type = 'PK'
)
ORDER BY
s.name,
t.name;
این کوئری اطلاعات جدولهای کاربری را از نماهای سیستمی دریافت میکند.
خروجی آن شامل دو ستون است: SchemaName و TableName.
ستون اول نام اسکیمایی را نشان میدهد که جدول در آن قرار دارد و ستون دوم نام جدول را نمایش میدهد.
برای مثال، اگر دیتابیس شما شامل جدولهای Customers، Orders، Products و ImportData باشد و فقط جدول ImportData فاقد کلید اصلی باشد، نام این جدول در خروجی ظاهر خواهد شد؛ البته به شرط آنکه سایر جدولها واقعاً دارای Primary Key باشند.
استفاده از نام اسکیما در کنار نام جدول اهمیت دارد؛ زیرا ممکن است در یک دیتابیس، دو جدول با نام یکسان در اسکیمـاهای متفاوت وجود داشته باشند.
بررسی نحوه عملکرد اسکریپت یافتن جداول فاقد PrimaryKey
برای درک بهتر کوئری، لازم است با بخشهای اصلی آن آشنا شویم.-
استفاده از sys.tables
نمای سیستمی sys.tables اطلاعات مربوط به جدولهای کاربری دیتابیس جاری را ارائه میدهد.
این نما شامل اطلاعاتی مانند نام جدول و شناسه داخلی آن است.
در اسکریپت، این نما بهعنوان منبع اصلی جدولهایی استفاده شده است که باید بررسی شوند. -
استفاده از sys.schemas
هر جدول در SQL Server به یک اسکیما تعلق دارد.
اسکیما به سازماندهی اشیای دیتابیس کمک میکند و نام آن معمولاً در کنار نام جدول برای مشخص کردن آدرس کامل جدول استفاده میشود.
برای مثال، نام کامل یک جدول میتواند به شکل زیر باشد:
dbo.Customers
در این مثال، dbo نام اسکیما و Customers نام جدول است.
اتصال sys.tables به sys.schemas از طریق schema_id باعث میشود نام اسکیما نیز در خروجی نمایش داده شود.
-
استفاده از sys.key_constraints
نمای سیستمی sys.key_constraints اطلاعات مربوط به محدودیتهای کلیدی تعریفشده در دیتابیس را نگهداری میکند.
این اطلاعات شامل محدودیتهای Primary Key و Unique است.
در این کوئری، شرط زیر فقط محدودیتهایی را در نظر میگیرد که نوع آنها PK است:
kc.type = 'PK'
بنابراین، وجود یک محدودیت Unique بهتنهایی باعث نمیشود جدول از فهرست نتایج حذف شود.
این رفتار منطقی است؛ زیرا هدف اسکریپت یافتن جدولهایی است که کلید اصلی ندارند، نه جدولهایی که هیچ نوع محدودیت یکتایی در آنها تعریف نشده است.
این رفتار منطقی است؛ زیرا هدف اسکریپت یافتن جدولهایی است که کلید اصلی ندارند، نه جدولهایی که هیچ نوع محدودیت یکتایی در آنها تعریف نشده است.
-
استفاده از NOT EXISTS
عبارت NOT EXISTS بررسی میکند که آیا برای جدول موردنظر، هیچ محدودیت Primary Key وجود ندارد یا خیر.
اگر زیرکوئری هیچ رکوردی مطابق شرط پیدا نکند، جدول در خروجی قرار میگیرد.
در مقابل، اگر یک Primary Key برای جدول تعریف شده باشد، آن جدول از نتایج حذف میشود.
مزیت این روش آن است که نیازی به شمارش محدودیتها یا گروهبندی تمام جدولها وجود ندارد و هدف کوئری بهصورت مستقیم بیان میشود.
نسخه جایگزین با استفاده از LEFT JOIN
برای یافتن جدولهای فاقد کلید اصلی، میتوان از LEFT JOIN نیز استفاده کرد.در این روش، ابتدا تمام جدولهای کاربری با محدودیتهای Primary Key اتصال داده میشوند و سپس جدولهایی انتخاب میشوند که محدودیت متناظری برای آنها پیدا نشده است.
SELECT
s.name AS SchemaName,
t.name AS TableName
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.schema_id = s.schema_id
LEFT JOIN sys.key_constraints AS kc
ON kc.parent_object_id = t.object_id
AND kc.type = 'PK'
WHERE kc.object_id IS NULL
ORDER BY
s.name,
t.name;
در این اسکریپت، اگر جدول کلید اصلی داشته باشد، اطلاعات مربوط به آن در ستونهای نمای sys.key_constraints قرار میگیرد.
اما اگر کلید اصلی وجود نداشته باشد، مقادیر ستونهای این نما NULL خواهند بود.
شرط kc.object_id IS NULL همین وضعیت را شناسایی میکند و تنها جدولهای فاقد Primary Key را نمایش میدهد.
هر دو روش برای این کار مناسب هستند.
انتخاب بین NOT EXISTS و LEFT JOIN معمولاً به ترجیح برنامهنویس، خوانایی کوئری و استانداردهای پروژه بستگی دارد.




کاربران ما
شما هم نظرتون با ما دریاره “اسکریپت یافتن جداول فاقد PrimaryKey” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید