2

ファイル内のすべてのサーバーとデータベースに特定のログインとユーザーを作成するために、サーバーと各サーバー上のデータベースに関する情報を含む CSV ファイルとして入力として受け取る Powershell スクリプトに取り組んでいます。このスクリプトは、Invoke-SqlCmd を使用して SQL コマンドでログインとユーザーの作成を試み、その結果を新しい CSV ファイルに出力します。ログインとユーザーの追加に成功した場合は成功メッセージとともにデータが出力され、いずれかのコマンドが失敗した場合は失敗メッセージとともにデータが出力されるはずです。現在、Invoke-SqlCmd エラーがある場合、スクリプトは失敗があったことを認識せず、実行が成功したことを出力します。

SQL コマンドが失敗したことを実際にキャッチして正しいメッセージを出力するように、Try/Catch ブロックを記述する方法を理解するための助けが必要です。

これらのセクションの現在の Try/Catch ブロック:

Try # Create Login
{
    # Importing sqlserver module to run the commands
    if (-not (Get-Module -Name "sqlserver"))
    {
        Import-Module sqlserver
    }
    Write-Host "Checking server $fullServerName to see if login [Example_Login] exists. Will create login if it does not already exist."
    Invoke-Sqlcmd -ServerInstance $fullServerName -Query "$loginCommand"

    Write-Host "Login command successfully executed.`n"
}
Catch
{
    Write-Host "An error has occurred while attempting to add login [Example_Login] to server $fullServerName."
    Write-Host $_
}

Try # Create database user
{
    Write-Host "Checking server $fullServerName to see if user [Example_User] exists on database $currentDatabase. Will create user if it does not already exist."
    Invoke-Sqlcmd -ServerInstance $fullServerName -Query "$databaseUserCommand"
    Write-Host "Database User command successfully executed.`n"
}
Catch
{
    Write-Host "An error has occurred while attempting to add user [Example_User] to login [Example_Login] on $currentDatabase."    
    Write-Host $_
}

上記のコードを実行すると、Invoke-SqlCmd の実行時に問題が発生したことがわかると思いますが、次のエラーが表示されますが、スクリプトは実行が成功したことを出力します。

Invoke-Sqlcmd : Database 'MyDatabase' does not exist. Make sure that the name is entered correctly. 
 Msg 911, Level 16, State 1, Procedure , Line 2.
At E:\Create_Login.ps1:175 char:6
+ ...             Invoke-Sqlcmd -ServerInstance $fullServerName -Query "$da ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

Invoke-Sqlcmd とエラー処理 ( sourcesource ) に既知の問題があることは知っていますが、このような状況でスクリプトに正しいメッセージを出力させる方法はありますか? 現在、手動で出力ファイルにアクセスし、メッセージを成功から失敗に変更しています。これは作業環境にあるため、スクリプトを編集せずに他の人が実行できるようにしたいと考えています。私は単純な間違いを犯しているだけですか?

どんな助けでも大歓迎です!

4

1 に答える 1