پیدا کردن وابستگیهای یک شی در SQL Server
از ویژگیهای خوب SQL Server وجود داشتن فانکشنها و آبجکتهای مختلف برای راحتسازی کارها است.
بطور مثال دو شی زیر که از نوع Dynamic Management Views
هستند، برای پیدا کردن وابستگیها استفاده میشوند.
توسط این دو کوئری بهترتیب میتوانید اشیائی که از آبجکت ورودی استفاده کردهاند و اشیائی که در آبجکت شما از آنها استفاده شده است را بدست بیاورید.
SELECT * FROM sys.dm_sql_referencing_entities('[mySchema].myEntity', 'Object')
SELECT * FROM sys.dm_sql_referenced_entities('[mySchema].myEntity', 'Object')
بطور مثال فرض کنید میخواهید یک دیتابیس بزرگ را پاکسازی کنید و فقط آبجکتهایی که در اسکیما شما استفاده شده است را نگهداری کنید، توسط کوئریهای بالا میتوانید وابستگیها را بدست بیاورید.
برای راحت انجام دادن کار بالا و پیدا کردن آبجکتهایی که در اسکیما شما استفاده نشدهاند نیز میتوانید از کوئری زیر استفاده کنید:
SELECT DISTINCT 'mySchema.MyEntity',
referenced_entity_name + '.' + referenced_schema_name
FROM sys.dm_sql_referenced_entities('[mySchema].MyEntity', 'Object') r
LEFT JOIN sys.objects o ON o.object_id = r.referenced_id
WHERE o.object_id IS NULL;
کد بالا را نیز میتوانید توسط کوئری زیر تولید کنید و در نهایت میتوانید آیتمهای موجود در Temp را پاک کنید.
CREATE TABLE #Temp
(
TargetName VARCHAR(500),
ReferenceName VARCHAR(500)
);
SELECT 'Insert Into #Temp
SELECT Distinct ''' + SCHEMA_NAME(o.schema_id) + '.' + o.name +
''', referenced_entity_name + ''.'' + referenced_schema_name from sys.dm_sql_referenced_entities(''[' +
SCHEMA_NAME(o.schema_id) + '].' + o.name + ''',''Object'') r
LEFT JOIN sys.objects o on o.object_id = r.referenced_id
where o.object_id is null'
FROM sys.objects o;
جزئیات بیشتر:
sys-dm-sql-referenced-entities-transact-sql
sys-dm-sql-referencing-entities-transact-sql