it-swarm.asia

كيفية تنفيذ SQL مقابل جميع قواعد البيانات على الخادم

لدي بعض SQL القياسية التي أقوم بتشغيلها على قواعد بيانات متعددة على خادم واحد لمساعدتي في تشخيص المشاكل:

select 
    so.name,
    so.type,
    MAX(case when sc.text like '%remote%' then '' ELSE 'N' END) AS Relevant,
    @@ServerName as Server,
    DB_Name() as DBName 
from
    sysobjects so with (nolock)
    join syscomments sc with (nolock) on so.id = sc.id
where (sc.text like '%emote%')
group by so.name, so.type
order by so.type, so.name

كيف يمكنني تنفيذ ذلك على جميع قواعد البيانات على خادم واحد؟ (إلى جانب الاتصال يدويًا بواحد في كل مرة وتنفيذها)

39
Andrew Bickerton

sp_MSForEachDB

خيار واحد sp_MSForEachDB . إنه غير موثق ولكنه مفيد مع ذلك

DECLARE @command varchar(1000) 
SELECT @command = 
    'USE [?] UPDATE Table1 SET Field1 = ''ninjas'' WHERE Field2 = ''pirates''' 
EXEC sp_MSforeachdb @command

البحث عن interwebs لديه العديد من الأمثلة أيضًا

ملاحظة: كونك وظيفة غير مدعومة (التي لديها بعض الأخطاء المعروفة) قد ترغب في كتابة وظيفتك الإصدار (شكراPradeep)


سيحتاج مثال SQL أعلاه إلى إعادة هيكلة على النحو التالي:

DECLARE @findKeySQL nvarchar(2000)
DECLARE @searchKey nvarchar(20)

SET @searchKey = lower('%remote%')

SET @findKeySQL = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'', 
                                     ''[msdb]'', ''[tempdb]'')
        select 
            so.name,
            so.type,
            @@ServerName as Server,
            ''?'' as DBName 
        from
            [?].dbo.sysobjects so with (nolock)
            join [?].sys.all_sql_modules sc with (nolock) on so.id = sc.object_id
        where (lower(sc.definition) like ''' + @searchKey + ''')
        group by so.name, so.type
        order by so.type, so.name'

EXEC sp_MSForEachDB @findKeySQL

ملاحظات:

  1. ؟؟؟ يتم استبداله في الاستعلام باسم اسم قاعدة البيانات ، لذا قم ببناء الاستعلام لتحديد قاعدة البيانات التي يجب الاستعلام عنها صراحةً
  2. تم تعديله لاستخدام sys.all_sql_modules لأنه يحمل نصًا كاملاً للوحدة النمطية (syscomments يمكن تقسيم الكلمة الرئيسية عند الوصول إلى الامتداد عبر الصفوف)
44
gbn

فقط 0.05 دولارًا أمريكيًا: SQL Multi Script (تنفيذ نصوص متعددة ضد خوادم SQL متعددة).

9
garik

تقوم حزمة أدوات SSMS بذلك بشكل جيد وهي مجانية لخوادم قاعدة البيانات قبل عام 2012. الميزة: "تشغيل على أهداف متعددة" - http://www.ssmstoolspack.com/Features؟f=6

3
EnocNRoll - Ananda Gopal

هناك طريقة أخرى ستعطي الإخراج في مجموعة نتائج شبه مدمجة واحدة. قم أولاً بفتح خوادم مسجلة وقم بإنشاء مجموعة جديدة ضمن مجموعات الخوادم المحلية ثم قم بتسجيل الخادم الخاص بك مرة واحدة لكل قاعدة بيانات ، وفي كل حالة قم بتعيين قاعدة البيانات الافتراضية على تلك المطلوبة.

بمجرد اكتمال النقر بزر الماوس الأيمن على مجموعتك واختيار استعلام جديد. ستحتوي نافذة الاستعلام التي تفتح على "متعددة" حيث ترى اسم الخادم عادةً على شريط الحالة. ستعمل أي استعلامات يتم تشغيلها في هذه النافذة على كل خادم مسجل كان موجودًا في المجموعة. سيكون العمود الأول من النتائج هو اسم الخادم المسجل. سيتم تجزئة مجموعة النتائج حسب ذلك العمود الأول وسيعمل الترتيب حسب الوصايا فقط داخل هذا الجزء.

وظيفة قوية للغاية ولكن تم تجاهلها عندما يكون لديك بشكل روتيني لتشغيل نفس SQL على خوادم متعددة.

2
Paul

طورت شركتي أداة تسمى xSQL Script Executor . إنه مجاني للاستخدام الشخصي ، وبالنسبة لي ، جعل نشر البرامج النصية على أهداف متعددة أمرًا سهلاً للغاية.

1
Endi Zhupani

لقد طورت هذه الأداة: https://github.com/andreujuanc/TakoDeploy

ما زلت أكتب بعض السطور عليها ، لكنها مستقرة الآن. لقد استخدمته ضد قواعد بيانات الإنتاج ويعمل مثل السحر.

0
Juan Carlos