কোনও সার্ভারে সমস্ত ডিবি-এর বিপরীতে কীভাবে এসকিউএল চালানো যায়


38

আমার কাছে কিছু স্ট্যান্ডার্ড এসকিউএল রয়েছে যা আমি একক সার্ভারে একাধিক ডাটাবেসের বিরুদ্ধে চালায় যা আমাকে সমস্যাগুলি নির্ণয় করতে সহায়তা করে:

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

আমি কীভাবে এটি একটি একক সার্ভারে সমস্ত ডাটাবেসের বিরুদ্ধে কার্যকর করতে পারি? (এক সাথে একবারে ম্যানুয়ালি সংযোগ স্থাপন এবং কার্যকর করার পাশাপাশি)


আপনি এই বিকল্পটি এমএস_ফরফডিডিবিও দরকারী হিসাবে খুঁজে পেতে পারেন ।
যাযাবর

উত্তর:


44

sp_MSForEachDB

একটি বিকল্প হ'ল sp_MSforEachDB । এটি Undocumented তবে তবুও দরকারী

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

ইন্টারভেস্টগুলির অনুসন্ধানে আরও অনেক উদাহরণ রয়েছে

দ্রষ্টব্য: একটি অসমর্থিত ফাংশন হওয়ার কারণে (যার কিছু পরিচিত বাগ রয়েছে) আপনি নিজের সংস্করণটি লিখতে চাইতে পারেন (ধন্যবাদ @ প্রদীপ)


উপরের এসকিউএল উদাহরণটির পুনর্গঠন করা দরকার:

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 ব্যবহার করতে সংশোধন করা হয়েছে ( সারিগুলিতে বিস্তৃত অবস্থায় পৌঁছানোর সময় সিসকম্টগুলি কীওয়ার্ডকে বিভক্ত করতে পারে )

sp_MSforeachdb কখনও কখনও flaky হতে পারে, তাই প্রদীপের উত্তরে প্রদত্ত লিঙ্কটি দেখুন।
এরিক হামফ্রে - লটশেল্প

দ্রুত ক্যোয়ারির জন্য sp_MSForEachDB ভাল বলে মনে হচ্ছে। প্রতিটি ফলাফল কোন ডাটাবেস থেকে এসেছে তা দেখানোর জন্য কি আমি এটির কোনও উপায় পেতে পারি?
ডিস্কড্রাইভ

@ ডিস্কড্রাইভ: , ''?'' AS DBNameযে কোনও নির্বাচনী বিবৃতিতে যুক্ত করুন। আমার উদাহরণ হিসাবে
gbn

9

কেবল আমার $ 0.05: এসকিউএল মাল্টি স্ক্রিপ্ট (একাধিক এসকিউএল সার্ভারের বিপরীতে একাধিক স্ক্রিপ্টগুলি কার্যকর করা)।


1
এই মত উত্তর, বাণিজ্যিক সমাধান সমর্থন করে, তাই নিষিদ্ধ করা উচিত!
Fandango68

2
@ ফানডাঙ্গো 68 আমি সেই সংস্থার পক্ষে কাজ করছি না। আমি সবেমাত্র তাই সরঞ্জাম ব্যবহার করেছি। কোন স্বার্থের বিরোধ নেই, আপনার কী হবে? )।
গারিক

4
@ Fandango68- এর পরিবর্তে আমি তারা চাইতাম না। সর্বদা সেরা সমাধানগুলি সর্বদা বিবেচনা করা উচিত এবং সর্বোত্তম নিখরচায় সমাধানগুলি তাদের বিরুদ্ধে ওজন করা উচিত।
পল


2

আরও একটি পদ্ধতি রয়েছে যা একক আধা-মার্জ রেজাল্ট সেটে আউটপুট দেয়। প্রথমে নিবন্ধিত সার্ভারগুলি খুলুন এবং স্থানীয় সার্ভার গ্রুপগুলির অধীনে একটি নতুন গ্রুপ তৈরি করুন তারপরে প্রতিটি ডিবি-র জন্য আপনার সার্ভারটি একবার ডিফল্ট ডিবি-কে পছন্দসইভাবে সেট করে নিবন্ধ করুন।

একবার আপনার গ্রুপে ডান ক্লিক করুন এবং নতুন প্রশ্ন নির্বাচন করুন। খোলা ক্যোয়ারী উইন্ডোটির "একাধিক" থাকবে যেখানে আপনি সাধারণত স্ট্যাটাস বারে একটি সার্ভারের নাম দেখতে পাবেন। এই উইন্ডোতে চলমান যেকোনো প্রশ্ন গ্রুপে থাকা প্রতিটি নিবন্ধিত সার্ভারে কাজ করবে। ফলাফলগুলির প্রথম কলামটি নিবন্ধিত সার্ভারের নাম হবে। ফলাফল সেটটি সেই প্রথম কলাম দ্বারা খণ্ডিত হয়ে যাবে এবং উইল দ্বারা অর্ডার কেবল সেই খণ্ডের মধ্যেই কাজ করবে।

যখন আপনাকে নিয়মিতভাবে একাধিক সার্ভারে একই এসকিউএল চালাতে হয় তার জন্য কার্যক্ষমতার খুব শক্তিশালী তবে উপেক্ষিত টুকরো।


আমি এটি প্রচুর ব্যবহার করি এবং এটি এসএসএমএসের একটি দুর্দান্ত বৈশিষ্ট্য। ক্ষতিটি হ'ল এটি কেবল ম্যানুয়াল ব্যবহারের জন্য, তাই আপনি যদি নিয়মিতভাবে চালনার জন্য কিছু স্বয়ংক্রিয় করতে চান তবে দরকারী নয়।
স্যার ওয়েয়ারস-এ-লট

1

আমার সংস্থা xSQL স্ক্রিপ্ট এক্সিকিউটার নামে একটি সরঞ্জাম তৈরি করেছে । এটি ব্যক্তিগত ব্যবহারের জন্য নিখরচায় এবং আমার জন্য এটি একাধিক লক্ষ্যবস্তুতে স্ক্রিপ্টগুলি খুব সহজ করে দিয়েছে।


এটি একটি মহান প্রোগ্রাম! ব্যবহার করা সহজ এবং স্বজ্ঞাত।
শান পারকিনস

0

আমি এই সরঞ্জামটি বিকাশ করেছি: https://github.com/andreujuanc/TakoDeploy

আমি এখনও এটিতে কিছু লাইন লিখছি, তবে এটি এতক্ষণে স্থিতিশীল। আমি এটি প্রোডাকশন ডাটাবেসের বিরুদ্ধে ব্যবহার করেছি এবং একটি কবজির মতো কাজ করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.