2016-09-23 21 views
0

複数のSQL Serverがあり、ほとんどがスタンドアロンです。私はすべてのサーバーからテーブルにすべてのデータベース名を挿入するストアドプロシージャ/ビューを作成する必要があります。複数のサーバーからすべてのデータベース名を取得

ストアドプロシージャまたはビューを使用してこれを行う方法はありますか?私はパワーシェルや.Netの経験がありません。

これまで私がこれまで持っていたことは次のとおりです。私はちょうどサーバーからサーバーへ「ジャンプ」する方法を理解できず、すべての結果を実際のテーブルに追加することはできません。

CREATE TABLE ##temp 
(
DATABASE_NAME VARCHAR(100), 
DATABASE_SIZE INT, 
REMARKS VARCHAR(500) 
) 


INSERT into ##temp 
EXEC [sp_databases] 

--doing this to also get ServerName along with the db name. 
--When I insert into a real table, I'll seperate it into two columns plus remove "@[email protected]" 
update ##temp 
set DATABASE_NAME = (select @@SERVERNAME) + '@[email protected] ' + DATABASE_NAME 
where DATABASE_NAME not like '%@[email protected]%' 

select DATABASE_NAME from ##temp 
+0

「Registered Servers」ウィンドウ –

答えて

1

情報の必要なすべてのサーバーにリンクされた接続を持つ少なくとも1台のサーバーを持つことは、この種のことにとっては良いことです。もしあなたがそうすれば、私が書いたちょっとしたスクリプトを使うことができます:

-- (1) Create global temp table used to store results 
IF OBJECT_ID('tempdb..##databases') IS NOT NULL DROP TABLE ##databases; 
CREATE TABLE ##databases 
(
    serverDBID int identity, 
    serverName varchar(100), 
    databaseName varchar(100), 
    databaseSize decimal(20,6) 
); 

-- (2) Create and populate table variable used to collect server names 
DECLARE @servers TABLE(id int identity, serverName varchar(100)); 
INSERT @servers(serverName) 
SELECT name FROM sys.servers; 

-- (3) loop through each DB and collect database names into ##databases 
DECLARE @i int = 1, @serverName varchar(100), @db varchar(100), @sql varchar(8000); 
WHILE @i <= (SELECT COUNT(*) FROM @servers) 
BEGIN 
    SELECT @serverName = serverName FROM @servers WHERE id = @i; 

    SET @sql = 'INSERT ##databases(serverName, databaseName) SELECT '''[email protected]+ 
      ''', name FROM master.sys.databases'; 
    EXEC (@sql); 

    SET @i += 1; 
END; 

-- (4) Collect database sizes 
SET @i = 1; -- reset/re-use @i; 
WHILE @i <= (SELECT COUNT(*) FROM ##databases) 
BEGIN 
    SELECT @serverName = serverName, @db = databaseName 
    FROM ##databases 
    WHERE serverDBID = @i; 

    SET @sql = 
    'UPDATE ##databases 
    SET databaseSize = 
    (SELECT sum(size)/128. FROM ['[email protected]+'].['[email protected]+'].sys.database_files) 
    WHERE serverDBID = '+CAST(@i AS varchar(4))+';' 

    BEGIN TRY 
    EXEC (@sql); 
    END TRY 
    BEGIN CATCH 
    PRINT 'There was an error getting dbsize info for '[email protected]+' > '[email protected]; 
    END CATCH; 

    SET @i += 1; 
END; 

-- Final Output 
SELECT * FROM ##databases; 
2

SQL Server Management Studioを使用すると、Registered Servers機能を使用してquery against multiple serversを実行することができます。これはSQL Server 2008 as this tutorial showsで追加されました。互換性について心配する必要はありません。マルチサーバーのクエリを実行する

は簡単です:

  1. Viewメニューから、 `登録済みサーバーを選択します。これにより、単一のサーバーのオブジェクトを表示するオブジェクトエクスプローラに似た新しいウィンドウが開きます。
  2. Local Server Groupsフォルダにすべてのサーバー接続の接続の接続を追加します。
  3. ローカルサーバーグループフォルダを右クリックし、New Queryを選択します。ここで入力するクエリは、登録されているすべてのサーバーを実行します。すべてのデータベースを検索するに
  4. select * from sys.databasesを実行するか、単にsp_databases

SSMSは、すべてのサーバからの結果を収集し、グリッドに表示します。結果を単一のサーバーの表に表示するには、ターゲット・サーバーを他のすべてのサーバーに追加する必要があります。たとえば、 INSERT INTO myManagementServer.MyDb.dbo.ThatTable...

SQLサーバーには、複数のサーバーを管理するためのさらに強力な機能があります。 Central Management Serverで複数のサーバーを管理し、ポリシーを使用して複数のサーバーに設定を適用できます。

では、さらに遠くに行き、複数のサーバーから診断、メトリック、パフォーマンスデータを収集し、レポートを作成するために管理ウェアハウスに格納します。たとえば、複数のサーバーのストレージとクエリのパフォーマンス、または最後のX月間の空き容量の傾向を確認できるとします。

欠点は、履歴データにはスペースが必要であることです。それを収集するには、監視されているすべてのサーバーにいくつかのストアドプロシージャを追加する必要がありますが、これは自動的に行われます。

関連する問題