利用可能なツールを使用して、指定されたすべてのサーバーの指定されたMS SQL Serverデータベースに要求を送信する

尊敬されるjobgemwsのメモ「 MS SQL ServerとC#.NETを例として指定したすべてのサーバーのすべてのデータベースにクエリを送信する 」によって、この記事を書くように求められました



標準のMSSQLSERVERツール、つまりSSMS(または管理からの極端なユーザー-sqlcmd)を使用して、プログラミングなしで小さなライフハックを使用して、同様の問題をどのように解決できるかを説明します。



そのため、私たちの組織には、数十種類の異なる種類のMSSQLSERVER、異なるエディションがあります。 Expressが優先されますが、それは重要ではありません。 インフラストラクチャは古く、完全に継承され、部分的に連続しています。



タスク:「まれに、しかし頻繁に起こる」ように、「複数のデータベースの複数のサーバーで同じリクエスト/パッケージを実行する」。



そして、この「まれに発生する」という事実は、動物園全体を集中管理するための本格的なソフトウェアを購入または作成する価値のある正当性を発明することを許可しません。



しかし、これは余談であり、免責事項です。



多くの異なるデータベースの多くのサーバーでスクリプトを実行するには何が必要ですか? もちろん、このスクリプト自体に加えて、少なくともデスクトップ上にある「C:\ Users \ usr_root \ Desktop \ check_version.sql」には、もちろん私たちがいます。



スクリプトは絶対に任意であるか、生成されるか、手で書かれている可能性があるため、ここでは説明しません。 ただし、Use [データベース]を削除する必要があることに注意してください。



したがって、次のものが必要です。



1.サーバーに接続してこのスクリプトを実行できる権限。 誰がシステム管理者と言ったのですか?



2.スクリプトを実行するベースを持つサーバーのリスト

リストは、もちろん、サーバー上のどこかのタブレットに保存するのが最適ですが、通常はテーブルデザイナーで対処します。



もちろん、サーバーへの接続はWindowsモードで実行され、特権ユーザーのパスワードがランダムに表示されないことは言うまでもありません。



3. SSMSは、最初は、他のサーバーで実行するスクリプトを作成します。



4. SSMSまたはsqlcmdを実行します。



始めましょう。



1.サーバーインスタンスで次のスクリプトを実行します。



Select N' :connect ' + t.[server] + isNull(N' -U ' + t.[user] + N' -P ' + t.[pwd],N'') + N' Use ' + t.base + N' GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO ' From (Values (N'dbt0300',N'5.144.18.12', N'sa', N'pwd@',''), (N'dbt1100',N'S01100s0', NULL, NULL,''), (N'dbt1200',N'S01200s11', NULL, NULL,'-'), (N'dbt1300',N'S01300', NULL, NULL,''), (N'dbt1800',N'S01800', NULL, NULL,''), (N'dbt2300',N'S02300', NULL, NULL,''), (N'dbt2800',N'S02800', NULL, NULL,''), (N'dbt2900_1',N'S02900-backup', NULL, NULL,''), (N'dbt3000',N'S03000-2', NULL, NULL,''), (N'dbt3400',N'S03400_tds', NULL, NULL,''), (N'dbt3600',N'S03600_s1', NULL, NULL,''), (N'dbt3700_1',N'S03700-s1', NULL, NULL,''), (N'dbt3900',N'S03900s1', NULL, NULL,''), (N'dbt4100',N's04100s2', NULL, NULL,''), (N'dbt4900',N'S04900s0', NULL, NULL,''), (N'dbt5600',N'S05600v', NULL, NULL,''), (N'dbt5700_release',N'S05700v', NULL, NULL,''), (N'dbt6100',N'S06100s1', NULL, NULL,''), (N'dbt6200',N'S06200-1', NULL, NULL,''), (N'dbt6500',N'S06500', NULL, NULL,''), (N'dbt6501',N'S06500-2', NULL, NULL,''), (N'dbt6600',N'S06600-1', NULL, NULL,''), (N'dbt7400',N'S07400-01', NULL, NULL,''), (N'dbt6700',N'S06700-bd01', NULL, NULL,''), (N'dbt7000_0',N'S07000-01', NULL, NULL,''), (N'dbt7200',N'S07200-02', NULL, NULL,''), (N'dbt7700',N'S07710-01', NULL, NULL,''), (N'dbt8600',N'S08600-s1', NULL, NULL,''), (N'dbt8700',N'8.12.36.11',N'sa', N'sapwd' ,''), (N'dbt8900',N'S08950s3', NULL, NULL,'- '), (N'dbt5000_zzz',N'S09700s1', NULL, NULL,' ')) t(base, [server], [user], [pwd], [name]) For xml path(N''), type
      
      





2.結果をクリックします







3.開いたウィンドウで、Ctrl + A、Ctrl + Cを実行します。



4.新しいリクエストのウィンドウを開き、Ctrl + Vを実行します。



5. [SSMSのクエリ]メニュー項目で、[SQLCMDモード]を選択します。 スクリプトはすぐに明るい灰色のトーンに変わり、sqlcmdコマンドが認識されたことを示します。







6.出来上がり! 実行できます。 スクリプトは、登録とSMSなしで、複数のサーバーで一度に1つずつ実行されます...ええと、申し訳ありませんが、C#、PowerShell、および他の奇跡はありません。 ただ怠laz。



どのスクリプトが(+)の結果であるか
 :connect 5.144.18.12 -U sa -P pwd@ Use dbt0300 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S01100s0 Use dbt1100 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S01200s11 Use dbt1200 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S01300 Use dbt1300 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S01800 Use dbt1800 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S02300 Use dbt2300 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S02800 Use dbt2800 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S02900-backup Use dbt2900_1 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S03000-2 Use dbt3000 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S03400_tds Use dbt3400 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S03600_s1 Use dbt3600 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S03700-s1 Use dbt3700_1 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S03900s1 Use dbt3900 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect s04100s2 Use dbt4100 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S04900s0 Use dbt4900 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S05600v Use dbt5600 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S05700v Use dbt5700_release GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S06100s1 Use dbt6100 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S06200-1 Use dbt6200 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S06500 Use dbt6500 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S06500-2 Use dbt6501 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S06600-1 Use dbt6600 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S07400-01 Use dbt7400 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S06700-bd01 Use dbt6700 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S07000-01 Use dbt7000_0 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S07200-02 Use dbt7200 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S07710-01 Use dbt7700 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S08600-s1 Use dbt8600 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect 8.12.36.11 -U sa -P sapwd Use dbt8700 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S08950s3 Use dbt8900 GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO :connect S09700s1 Use dbt5000_zzz GO :r "C:\Users\usr_root\Desktop\check_version.sql" GO
      
      





さらに、スクリプトがいくつかのデータを選択して(場合によっては複数の)結果データセットを生成すると、それらは通常どおり、SSMS要求ウィンドウの「データベース」に表示され、ssmsboosterのようなものから抽出できます、しばらくの間、残念ながら、厳しい支払いになっています。



さて、または単に結果の表示モードを「テキストへの結果」または「ファイルへの結果」に変更し、受信したテキストをExcelなどの区切り文字で解析します。



ただし、コマンド:out <filename>を使用することもできます。このコマンドは、スクリプトに次のように記述できます:connectおよび:r



実際、それはすべて魔法です。



この方法の欠点には、サーバー上でスクリプトが順番に実行されるという事実が含まれますが、 このライフハックは、即興手段として分類される可能性が高く、これはほとんど意味がありません。



まあ関連リンク:



クエリエディターでSQLCMDスクリプトを編集する

SSMSのSQLCMDモードの概要

SQLCMDモードでのSSMSクエリエディターの使用



All Articles