۱۳۸۷/۰۹/۲۳

پيدا كردن وابستگي‌هاي اشياء در SQL Server


با بالا رفتن تعداد اشياء تعريف شده در SQL server ، نگهداري آنها نيز مشكل‌تر مي‌شود. در اين حالت تغيير كوچكي در يكي از اشياء ممكن است باعث از كار افتادن قسمتي از سيستم شود. بنابراين قبل از هر گونه تغييري در يك شيء، ابتدا بايد ساير اشياء وابسته به آن‌ را يافت و در نظر داشت ( dependencies ). براي اين منظور ( impact analysis ) راه‌كارهاي مختلفي در SQL server وجود دارد كه در ادامه به آن‌ها خواهيم پرداخت:

الف) استفاده از امكانات management studio (اس كيوال سرور 2005 به بعد)

ساده‌ترين راه ممكن كه گزارش مفصلي را نيز ارائه مي‌دهد، كليك بر روي يك شيء در management studio و انتخاب گزينه view dependencies است (شكل زير).


در صفحه ظاهر شده مي‌توان اشيايي را كه شيء مورد نظر به آنها وابسته است، مشاهده نمود يا برعكس (اشيايي كه عملكرد آنها وابسته به شيء انتخابي است را نيز مي‌توان ملاحظه كرد).

ب) كوئري گرفتن از جداول سيستمي

امكانات قسمت قبل را با استفاده از اطلاعات جدول syscomments نيز مي‌توان شبيه سازي كرد. در اين جدول اطلاعات تعاريف كليه view ، trigger ، رويه‌هاي ذخيره شده و غيره نگهداري مي‌شود. براي مثال فرض كنيد قصد داريم در جدول Orders ديتابيس Northwind ، نام فيلد OrderDate را تغيير دهيم. قبل از اين‌كار بهتر است كوئري زير را اجرا كنيم تا نام اشياء وابسته را بدست آوريم:
SELECT NAME
FROM syscomments c
JOIN sysobjects o
ON c.id = o.id
WHERE TEXT LIKE '%OrderDate%'
AND TEXT LIKE '%Orders%'


اين روش انعطاف پذيري بيشتري را نسبت به امكانات قسمت الف ، ارائه مي‌دهد. براي نمونه فرض كنيد مي‌خواهيد در يك ديتابيس كليه اشيايي كه عمليات delete را انجام مي‌دهند پيدا كنيد (جستجوي اشياء حاوي يك عبارت خاص). در اين مورد خواهيم داشت:

SELECT NAME
FROM syscomments c
JOIN Northwind.dbo.sysobjects o
ON c.id = o.id
WHERE TEXT LIKE '%delete%'

ج) استفاده از رويه ذخيره شده سيستمي sp_depends

جدول سيستمي ديگري در اس كيوال سرور به نام sysdepends وجود دارد كه اطلاعات وابستگي‌هاي اشياء در آن‌ها نگهداري مي‌شود. براي دسترسي به اطلاعات اين جدول ، اس كيوال سرور رويه ذخيره شده سيستمي sp_depends را ارائه داده است. براي مثال فرض كنيد مي‌خواهيم ليست اشيايي را كه به جدول Oredres ديتابيس Northwind وابسته هستند، پيدا كنيم. در اين حالت داريم:
USE Northwind
EXEC sp_depends 'Orders'


د) استفاده از schema view

با استفاده از view سيستمي INFORMATION_SCHEMA.ROUTINES ، كه از تركيب جداول syscolumns و sysobjects ايجاد شده است نيز مي‌توان عملكرد sp_depends را شبيه سازي كرد اما جداول و view ها از گزارش آن حذف شده‌اند.
SELECT routine_name,
routine_type
FROM INFORMATION_SCHEMA.ROUTINES
WHERE routine_definition LIKE '%Orders%'

در جدول زير مقايسه‌اي از امكانات و گزارش حاصل از اين چهار روش با هم مقايسه شده‌اند:



ه) استفاده از برنامه SQL Dependency Tracker

نسخه آزمايشي برنامه ذكر شده را از اين آدرس مي‌توان دريافت كرد.


همانطور كه ملاحظه مي‌كنيد اين جستجوها بر روي اطلاعات ذخيره شده در اس كيوال سرور صورت مي‌گيرند و اگر در كدهاي خود در خارج از اس كيوال سرور مخلوطي از عبارات اس كيوال را داشته باشيد، نگهداري آنها بسيار مشكل خواهد بود. بنابراين تا حد ممكن بايد عمليات مرتبط را در ديتابيس و توسط اشياء اس كيوال سرور مانند رويه‌هاي ذخيره شده، view ها و امثال آن‌ها انجام داد تا اين جدا سازي به‌خوبي صورت گرفته و در زمان نياز به انجام تغييرات، ردگيري اشياء وابسته به‌سادگي صورت گيرد.