2

誰かが示されている次のコードを手伝ってくれるかどうか疑問に思いました。基本的に、可能であればこのコードを再ハッシュして、「servers.txt」という名前のテキストファイルで提供される一連のサーバー名に対して実行できるようにしようとしています。

DBCCはPSスクリプトによって実行され、そのサーバー名のすべてのDBに対して実行される必要があります。このスクリプトでこれを行う方法を理解するには、PSの速度が十分ではありません。

サーバー名ごとにハードコーディングする代わりに、値をプラグインできるように変更するにはどうすればよいですか?

私はこれについて少し読んで、Invoke-SqlPSのSQL2008拡張であると私が信じるコマンドを見ました。

残念ながら、PS環境はSQL 2005ボックスのものであり、これを移動する権限がないため、invokeを使用できないとは思わないでください。

元のコードを参照してから、invokeを使用して実行するための実験を行ってください。

$ScriptName = $myInvocation.MyCommand.Name
[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")
$ConnString = "Server=DB-OCC05;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
$MasterConn = new-object ('System.Data.SqlClient.SqlConnection') $ConnString
$MasterCmd = new-object System.Data.SqlClient.SqlCommand 
$MasterCmd.Connection = $MasterConn
$SqlDBCC = "DBCC CHECKDB(master) WITH TABLERESULTS"
$MasterCmd.CommandText = $SqlDBCC
$MasterConn.Open()
$Rset = $MasterCmd.ExecuteReader()
If ($Rset.HasRows -eq $true) {
    While ($Rset.Read()) {
        $line = $Rset["MessageText"]
        If ($Rset["Level"] -gt 10) {
            Write-Host $line -backgroundcolor Yellow -foregroundcolor Red
        } else {
            Write-Host $line 
        }
    }
    $Rset.Close()
}
$MasterConn.Close() 

そして、SQL2005環境から実行している私のテスト:

Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"

また、このテストを試しました:

gc "C:\Powershell\Servers.txt" | foreach-object {Invoke-Sqlcmd "DBCC checkdb;" -ServerInstance "$_\MyInstance"}

しかし、上記のテスト実行は、次の原因で機能しませんでした。

「Invoke-Sqlcmd」という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスを確認してください。

4

1 に答える 1

2

スクリプトにいくつかの変更を加えます。接続文字列と、servers.txt ファイル (インスタンスごとに 1 行のテキスト ファイル) を読み込んでその内容を列挙するための下部の数行を除いて、すべては基本的に同じです。

function Execute-DBCC
{
    param (
        [parameter(Mandatory = $true)][string]$serverInstance
    )

    $connString = "Server=$serverInstance;Integrated Security=SSPI;Database=master;Application Name=$ScriptName"
    $masterConn = new-object ('System.Data.SqlClient.SqlConnection') $connString
    $masterCmd = new-object System.Data.SqlClient.SqlCommand 
    $masterCmd.Connection = $masterConn

    $masterCmd.CommandText = "EXECUTE master.sys.sp_MSforeachdb 'DBCC CHECKDB([?]) WITH TABLERESULTS'"
    $masterConn.Open()
    $reader = $masterCmd.ExecuteReader()

    if ($reader.HasRows -eq $true) 
    {
        while ($reader.Read()) 
        {
            $messageText = $reader["MessageText"]

            if ($reader["Level"] -gt 10) 
                { Write-Host $messageText -backgroundcolor Yellow -foregroundcolor Red  } 
            else 
                { Write-Host $messageText  }
        }

        $reader.Close()
    }

    $masterConn.Close() 
}




[void][reflection.assembly]::LoadWithPartialName("System.Data.SqlClient")

$servers = @(Get-Content ".\servers.txt")

$servers | %{
    Execute-DBCC $_
}
于 2013-02-19T16:43:18.163 に答える