قائمة الإجراءات المخزنة من الجدول
-
02-07-2019 - |
سؤال
لدي قاعدة بيانات ضخمة تحتوي على مئات الجداول والإجراءات المخزنة.باستخدام SQL Server 2005، كيف يمكنني الحصول على قائمة بالإجراءات المخزنة التي تقوم بعملية إدراج أو تحديث في جدول معين.
المحلول
select
so.name,
sc.text
from
sysobjects so inner join syscomments sc on so.id = sc.id
where
sc.text like '%INSERT INTO xyz%'
or sc.text like '%UPDATE xyz%'
سيعطيك هذا قائمة بجميع محتويات الإجراءات المخزنة مع INSERT أو UPDATE لجدول معين (من الواضح أنه يمكنك تعديل الاستعلام ليناسب).سيتم أيضًا تقسيم الإجراءات الأطول عبر صفوف متعددة في مجموعة السجلات التي تم إرجاعها، لذا قد تحتاج إلى إجراء القليل من التدقيق اليدوي خلال النتائج.
يحرر:تم تعديل الاستعلام لإرجاع اسم SP أيضًا.لاحظ أيضًا أن الاستعلام أعلاه سيُرجع أي UDFs بالإضافة إلى SPs.
نصائح أخرى
sys.sql_dependencies
يحتوي على قائمة بالكيانات ذات التبعيات، بما في ذلك الجداول والأعمدة التي يتضمنها sproc في الاستعلامات.يرى هذا المشنور للحصول على مثال لاستعلام يخرج التبعيات.سيحصل مقتطف الكود أدناه على قائمة بتبعيات الجدول/العمود حسب الإجراء المخزن
select sp.name as sproc_name
,t.name as table_name
,c.name as column_name
from sys.sql_dependencies d
join sys.objects t
on t.object_id = d.referenced_major_id
join sys.objects sp
on sp.object_id = d.object_id
join sys.columns c
on c.object_id = t.object_id
and c.column_id = d.referenced_minor_id
where sp.type = 'P'
يمكنك محاولة تصدير جميع إجراءاتك المخزنة إلى ملف نصي ثم استخدام بحث بسيط.
تتمثل الطريقة الأكثر تقدمًا في استخدام بحث regexp للعثور على جميع إدخالات SELECT FROM وINSERT FROM.
يبدو أن هذا يعمل:
select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means
إذا قمت بتنزيل sp_search_code من موقع Vyaskn، فسوف يسمح لك بالعثور على أي نص داخل كائنات قاعدة البيانات الخاصة بك.
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name
هذا الرابط تم استخدامه كمورد للبحث في SP.