في كثير من الأحيان ، يحتاج المبرمجون و مديرو قواعد البيانات إلى البحث عن البيانات والعناصر الأخرى في قاعدة البيانات. فإذا حاولت مسبقاً البحث عن عنصر دالة Function يحتوي على عمود في جدول أو متغير ما في قاعدة البيانات ، أو عن جدول يحتوي بيانات معينة ، لن تجد حل سريع بكبسة زر مثل Ctrl+F .
وبما أنه لا يوجد حل في أداة متضمنة في كل من SQL Server management Studio أو Visual Studio ، إليك بعض الخيارات التي يمكنك استخدامها:
البحث عن البيانات في الجداول والعروض
إنّ استخدام SQL للبحث عن بيانات محددة في كافة الجداول وكافة الأعمدة في قاعدة بيانات ما لا يعتبر الحل الأمثل. فهناك العديد من البرامج النصية بأساليب مختلفة في SQL التي يمكنك استخدامها للحصول على هذه المعلومات، والمشترك بينها هو أنها كلها تستخدم المؤشرات Cursors وعناصرالنظام.
DECLARE @SearchText varchar(200), @Table varchar(100), @TableID int, @ColumnName varchar(100), @String varchar(1000); --modify the variable, specify the text to search for SET @SearchText = 'John'; DECLARE CursorSearch CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U'; --list of tables in the current database. Type = 'U' = tables(user-defined) OPEN CursorSearch; FETCH NEXT FROM CursorSearch INTO @Table, @TableID; WHILE @@FETCH_STATUS = 0 BEGIN DECLARE CursorColumns CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @TableID AND system_type_id IN(167, 175, 231, 239); -- the columns that can contain textual data --167 = varchar; 175 = char; 231 = nvarchar; 239 = nchar OPEN CursorColumns; FETCH NEXT FROM CursorColumns INTO @ColumnName; WHILE @@FETCH_STATUS = 0 BEGIN SET @String = 'IF EXISTS (SELECT * FROM ' + @Table + ' WHERE ' + @ColumnName + ' LIKE ''%' + @SearchText + '%'') PRINT ''' + @Table + ', ' + @ColumnName + ''''; EXECUTE (@String); FETCH NEXT FROM CursorColumns INTO @ColumnName; END; CLOSE CursorColumns; DEALLOCATE CursorColumns; FETCH NEXT FROM CursorSearch INTO @Table, @TableID; END; CLOSE CursorSearch; DEALLOCATE CursorSearch;
عيوب هذا الحل: استخدام المؤشرات Cursors ، التي تعتبر بشكل عام غير فعالة ، عالية التعقيد، ويلزمها الكثير من الوقت لتنفيذها، حتى على قواعد البيانات صغيرة الحجم. مشكلة أخرى هي أنه يمكن استخدامها للبحث عن البيانات النصية فقط. للبحث عن أنواع البيانات الأخرى، مثل الوقت والتاريخ ، يجب عليك كتابة برامج جديدة.
البحث عن عناصر قواعد البيانات.
إنّ البحث عن إسم عنصر في قاعدة البيانات أو تعريف هذا العنصرهو أسهل قليلا من البحث عن نص معين. هناك العديد من الطرق التي يمكنك استخدامها. ومع ذلك، كل من هذه الأساليب تشمل الإستعلام من عناصرالنظام.
سنعرض في الأمثلة التالية كيفية البحث عن النص المحدد – المتغيرِ@StartProductID – في الإجراءات المخزنة في SQL. عند البحث في أنواع أخرى من عناصر قاعدة بيانات – الدالات Functions، والمشغلات، والأعمدة، وما إلى ذلك، أو في عدة أنواع من عناصر قاعدة البيانات في نفس الوقت، ينبغي تعديل برنامج SQL المبين أعلاه وفقا لذلك.
إستخدام INFORMATION_SCHEMA.ROUTINES
يمكنك استخدام برامج SQL التي تستعلم من العرض INFORMATION_SCHEMA.ROUTINES للبحث عن متغير محدد في جميع الإجراءات المخزنة. يحتوي العرض INFORMATION_SCHEMA.ROUTINES معلومات حول كافة الإجراءات المخزنة والوظائف في قاعدة البيانات. يحتوي العمود ROUTINE_DEFINITION على جملة إنشاء الوظيفة أو الإجراء المخزن.
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%@StartproductID%' AND ROUTINE_TYPE='PROCEDURE'
ونتيجة التنفيذ:
لا ينصح باستخدام العرض INFORMATION_SCHEMA للبحث عن مخططات العناصر المخزنة في العمود ROUTINE_SCHEMA. استخدم العرض المفهرس sys.objects بدلا منها.
إستخدام عرض sys.syscomments
يمكنك الاستعلام من عرض sys.syscomments، والذي يحتوي على معلومات حول كافة الإجراءات المخزنة ,والعروض، والقواعدrule ، والقيم الإفتراضية، والمشغلات، وقيود التحقيق والإفتراض في قاعدة بيانات. حيث يقوم البرنامج بالاستعلام عن نص معين في عمود النص الذي يحتوي على جملة تعريف العنصر.
SELECT OBJECT_NAME( id ) FROM SYSCOMMENTS WHERE text LIKE '%@StartProductID%' AND OBJECTPROPERTY(id , 'IsProcedure') = 1 GROUP BY OBJECT_NAME( id );
ونتيجة التنفيذ:
لا ينصح باستخدام هذه الطريقة وذلك لأن الجدول sys.syscomments سوف يتم حذفه في إصدارات قواعد بيانات SQL في المستقبل.
إستخدام عرض sys.sql_modules
يمكنك الإستعلام من عرض sys.sql_modules والذي يحتوي على إسم ونوع وتعريف كل وحدة نمطية في قاعدة بيانات.
SELECT OBJECT_NAME( object_id ) FROM sys.sql_modules WHERE OBJECTPROPERTY(object_id , 'IsProcedure') = 1 AND definition LIKE '%@StartProductID%';
ونتيجة التنفيذ ستكون نفس نتيجة الطريقة السابقة:
إستخدام عروض النظام الأخرى schemaviews
يمكنك الاستعلام من العروض sys.syscomments ، sys.schemas و sys.objects. حيث يحتوي العرض sys.schemas على سجل لكل مخطط في قاعدة البيانات. ويحتوي العرض sys.objects على سجل لكل مخطط معرف من قبل المستخدم في قاعدة البيانات. لاحظ أن هذه العروض لا تحتوي على معلومات عن المشغلات، لذلك سيكون عليك استخدام العرض sys.triggers للبحث عن أسماء العناصر أو تعريفاتها في المشغلات.
DECLARE @searchString nvarchar( 50 ); SET@searchString = '@StartProductID'; SELECT DISTINCT s.name AS Schema_Name , O.name AS Object_Name , C.text AS Object_Definition FROM syscomments C INNER JOIN sys.objects O ON C.id = O.object_id INNER JOIN sys.schemas S ON O.schema_id = S.schema_id WHERE C.text LIKE '%' + @searchString + '%' OR O.name LIKE '%' + @searchString + '%' ORDER BY Schema_name , Object_name;
ونتيجة التنفيذ:
إنّ العيب الرئيسي في استخدام هذه الأساليب هو أنك ستكون بحاجة إلى تغييربرنامج SQL مع كل تغيير في أنواع العناصرالتي تبحث عنها. ولتكون قادر على القيام بذلك، عليك أن تكون على دراية ببنية عناصر النظام حتى تتمكن من تعديلها. إنّ البحث في أنواع متعددة من العناصر ، وإضافة معايير بحث إضافية، مثل إضافة أواستثناء الأسماء والتعريفات للعنصر، أو تحديد رمز الهروب، سيزيد من التعقيد في برنامج SQL، والذي سيكون عرضة للأخطاء دون الإختبار السليم والذي يستغرق الكثير من الوقت.
إذا لم تكون مطور برامج ذو الخبرة، وتفضل حل تم اختباره مسبقا وخاليا من الأخطاء للبحث عن عناصر SQL والبيانات يدويا، ولست على دراية تامة بعناصر النظام التي تحتوي على تعريفات ومعلومات عناصر قاعدة البيانات، استخدم أداة البحث ApexSQL Search.
إنّ اداة البحث ApexSQL Search هي أداة يمكن إضافتها الى كل من SSMS و Visual Studio. والتي يمكنها البحث عن النصوص في عناصر قاعدة البيانات (بالإضافة إلى اسماء هذه العناصر) ، والبيانات المخزنة في الجداول والعروض (حتى المشفرة منها) ، وكذلك إعادة البحوث السابقة بكبسة زر.
للبحث عن البيانات في الجداول والعروض :
- من القائمة الرئيسية في SQL Server Management Studio أو Visual Studio’s اختر ApexSQL Search.
-
اذهب الى الخيار Database text search.
- في حقل نص البحث ، أدخل القيمة التي تريد البحث عنها.
- اختر قاعدة البيانات التي تريد البحث فيها من قائمة قواعد البيانات.
- اختر الجداول أو العروض الذي تريد البحث فيها من قائمة العناصر، أو أبقيها مختارة كاملة كما هي.
- اختر اذا كنت تريد البحث عن العروض ، القيم الرقمية ، النصوص ، القيم التعريفية الفريدة وأعمدة التواريخ من خلال تحديد المربع المجاول لكل منها ، وكذلك اذا كنت تريد البحث المطابق أم لا. وإذا كان البحث في أعمدة التواريخ حدد صيغة التاريخ.
-
انقر على خيار Find now لتبدأ بالبحث.ستبدأ عندها شبكة النتائج بعرض جداول وعروض قاعدة البيانات التي تحوي القيمة المراد البحث عنها.
- انقر على النقاط المتقطعة بجانب Column value لإظهار تفاصيل العنصر الذي تم ايجاده.
للبحث عن عناصر قاعدة البيانات :
- من القائمة الرئيسية في SQL Server Management Studio أو Visual Studio ، ومن قائمة ApexSQL اختر ApexSQL Search.
-
اذهب الى الخيار Database object search:
- في حقل نص البحث ، أدخل النص الذي تريد البحث عنه (مثلاً: إسم المتغير).
- اختر قاعة البيانات التي تريد البحث فيها من قائمة قواعد البيانات.
- اختر نوع العناصر التي تريد البحث فيها من قائمة العناصر ، أو أبقيها مختارة كاملة كما هي.
- اختر اذا كنت تريد البحث في عنصر ، عمود ، أسماء الفهارس ، تعريفات العناصر أو عناصر النظام من خلال تحديد المربع المجاور لكل منها ، وكذلك اذا كنت تريد البحث المطابق أم لا وما هو رمز الهروب الذي تريد استخدامه.
- انقر على خيار Find now لتبدأ بالبحث.
ستبدأ عندها شبكة النتائج بإظهار عناصر قاعدة البيانات التي تحتوي على نص البحث.
- انقر نقراً مزدوجا على العنصر الذي تريده من شبكة النتائج وسيتم تظليله في متصفح العناصر في SQL.
لا يوفر كل من SQL Server Management Studio و Visual Studio خيارات بحث عن أسماء عناصر قواعد البيانات ، تعريفاتها أو البيانات المخزنة فيها . وكذلك برامج الإستعلام في SQL التي تستخدم للبحث تكون معقدة وبطيئة وتحتاج إلى معرفة بعناصر النظام في SQL Server.
قم باستخدام ApexSQL Search للتعمق في قواعد البيانات لديك والبحث عن العناصر والبيانات التي تريدها بسرعة وبكل سهولة.
مترجم Ahmad Yaseen
January 19, 2016