كيف تبحث بسرعة عن البيانات والعناصر الأخرى في قواعد بيانات SQL

في كثير من الأحيان ، يحتاج المبرمجون و مديرو قواعد البيانات إلى البحث عن البيانات والعناصر الأخرى في قاعدة البيانات. فإذا حاولت مسبقاً البحث عن عنصر دالة 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. والتي يمكنها البحث عن النصوص في عناصر قاعدة البيانات (بالإضافة إلى اسماء هذه العناصر) ، والبيانات المخزنة في الجداول والعروض (حتى المشفرة منها) ، وكذلك إعادة البحوث السابقة بكبسة زر.

للبحث عن البيانات في الجداول والعروض :

  1. من القائمة الرئيسية في SQL Server Management Studio أو Visual Studio’s اختر ApexSQL Search.
  2. اذهب الى الخيار Database text search.

  3. في حقل نص البحث ، أدخل القيمة التي تريد البحث عنها.
  4. اختر قاعدة البيانات التي تريد البحث فيها من قائمة قواعد البيانات.
  5. اختر الجداول أو العروض الذي تريد البحث فيها من قائمة العناصر، أو أبقيها مختارة كاملة كما هي.
  6. اختر اذا كنت تريد البحث عن العروض ، القيم الرقمية ، النصوص ، القيم التعريفية الفريدة وأعمدة التواريخ من خلال تحديد المربع المجاول لكل منها ، وكذلك اذا كنت تريد البحث المطابق أم لا. وإذا كان البحث في أعمدة التواريخ حدد صيغة التاريخ.

    ApexSQL Search - Database text search

  7. انقر على خيار Find now لتبدأ بالبحث.ستبدأ عندها شبكة النتائج بعرض جداول وعروض قاعدة البيانات التي تحوي القيمة المراد البحث عنها.

    ApexSQL Search - Database text search

  8. انقر على النقاط المتقطعة بجانب Column value لإظهار تفاصيل العنصر الذي تم ايجاده.

    ApexSQL Search - Database search details

للبحث عن عناصر قاعدة البيانات :

  1. من القائمة الرئيسية في SQL Server Management Studio أو Visual Studio ، ومن قائمة ApexSQL اختر ApexSQL Search.
  2. اذهب الى الخيار Database object search:

    ApexSQL Search - Database search details

  3. في حقل نص البحث ، أدخل النص الذي تريد البحث عنه (مثلاً: إسم المتغير).
  4. اختر قاعة البيانات التي تريد البحث فيها من قائمة قواعد البيانات.
  5. اختر نوع العناصر التي تريد البحث فيها من قائمة العناصر ، أو أبقيها مختارة كاملة كما هي.
  6. اختر اذا كنت تريد البحث في عنصر ، عمود ، أسماء الفهارس ، تعريفات العناصر أو عناصر النظام من خلال تحديد المربع المجاور لكل منها ، وكذلك اذا كنت تريد البحث المطابق أم لا وما هو رمز الهروب الذي تريد استخدامه.
  7. انقر على خيار Find now لتبدأ بالبحث.

    ApexSQL Search - Database object search

    ستبدأ عندها شبكة النتائج بإظهار عناصر قاعدة البيانات التي تحتوي على نص البحث.

  8. انقر نقراً مزدوجا على العنصر الذي تريده من شبكة النتائج وسيتم تظليله في متصفح العناصر في SQL.

    ApexSQL Search - Database object search

لا يوفر كل من SQL Server Management Studio و Visual Studio خيارات بحث عن أسماء عناصر قواعد البيانات ، تعريفاتها أو البيانات المخزنة فيها . وكذلك برامج الإستعلام في SQL التي تستخدم للبحث تكون معقدة وبطيئة وتحتاج إلى معرفة بعناصر النظام في SQL Server.

قم باستخدام ApexSQL Search للتعمق في قواعد البيانات لديك والبحث عن العناصر والبيانات التي تريدها بسرعة وبكل سهولة.

مترجم Ahmad Yaseen

January 19, 2016