2017-03-14 11 views
0

SqlPsモジュールから「Restore-SqlDatabase」を呼び出すPowershell関数があり、スプラットを介して関数にパラメータを送信しています。なぜ私はそれが期待通りに動作していないのか理解しようとしています。私のコードは次のとおりです:powershell関数を呼び出し、スプラットを使用してパラメータを送信する

$SqlParams = @{"ServerInstance"="'$ServerName'"; 
    "Database"="'$DatabaseName'"; 
    "BackupFile"="'$BackupFile'";} 

if($Credential -ne $null) { 
    $SqlParams.Add("SqlCredential", $Credential) 
} 

if($ReplaceDatabase) { 
    $SqlParams.Add("ReplaceDatabase", $null) 
} 

try { $PathResult = Test-Path -Path $RestorePath } catch { $PathResult = $False } 

if($PathResult) { 
    Write-Verbose "RestorePath exists, using: $RestorePath" 

    $RelocateData = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' 
    $RelocateData.LogicalFileName = $DatabaseName 
    $RelocateData.PhysicalFileName = $(Join-Path -Path $RestorePath -ChildPath "$DatabaseName.mdf") 

    $RelocateLog = New-Object 'Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' 
    $RelocateLog.LogicalFileName = "$DatabaseName`_log" 
    $RelocateLog.PhysicalFileName = $(Join-Path -Path $RestorePath -ChildPath "$DatabaseName`_log.ldf") 

    $RelocateFile = @($RelocateData,$RelocateLog) 
    $SqlParams.Add("RelocateFile", $RelocateFile) 
} 

try{ 
    Write-Verbose "Using the following parameters:" 
    $paramString = $SqlParams | Out-String 
    Write-Verbose $paramString 
    Restore-SqlDatabase @SqlParams 
} catch { 
    Write-Error $_ 
    Write-Output "Restore failed..." 
    return 
} 
Write-Output "Database successfully restored!" 

これを実行すると、データベースに接続できません。しかし、ターミナルで "param"ハッシュテーブルと同じパラメータ値を使用してコマンドを直接実行すると、期待どおりに動作します。

私のためのヒント?

+0

あなたが得る正確なエラーは何ですか? '$ Error'リストの内容は何ですか? 'Restore-SqlDatabase'によって報告された欠落/指定されていないパラメータがありますか? –

+0

次のエラーが表示されます: 'パラメータ 'DatabaseObject'の引数を検証できません。引数がnullまたは空です。 nullまたは空でない引数 を指定してから、コマンドを再試行してください。 行目:1文字:1' これは、 '$ Error'リストで重要なのは –

+0

です。一重引用符を削除しようとしましたが、助けになりませんでした。 '$ SqlParams = @ {" ServerInstance "= $ ServerName; "データベース" = $ DatabaseName; "BackupFile" = $ BackupFile; } ' –

答えて

0

ここにいくつかの秘密のソースがあります。

Restore-SqlDatabaseコールの前にこれをしなかった:

SQLCMD -S $ServerName -d master -Q "Alter Database [$DatabaseName] SET SINGLE_USER With ROLLBACK IMMEDIATE" 

そしてRestore-SqlDatabase呼び出した後にこれをやった:

SQLCMD -S $ServerName -d master -Q "Alter Database [$DatabaseName] SET MULTI_USER WITH ROLLBACK IMMEDIATE" 

すべての今、正常に動作するようです。