2017-03-14 5 views
0

SqlPs 모듈에서 "Restore-SqlDatabase"를 호출하는 Powershell 함수가 있으며 splatting을 통해 함수에 매개 변수를 보냅니다. 나는 그것이 내가 기대했던대로 작동하지 않는 이유를 알아 내려고 노력하고있다. 내 코드는 다음과 같습니다.powershell 함수 호출, splatting을 통한 매개 변수 전송

$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 또는 비어 있지 않은 인수 을 제공 한 다음 명령을 다시 시도하십시오. 줄에 : 1 char : 1' '$ Error'리스트에서 유일하게 중요합니다. –

+0

작은 따옴표를 지우려고했지만 도움이되지 않았습니다. '$ SqlParams = @ { "ServerInstance"= $ ServerName; "데이터베이스"= $ DatabaseName; "BackupFile"= $ BackupFile; }' –

답변

0

여기에 몇 가지 비밀 소스가 있습니다.

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

을 그리고 Restore-SqlDatabase 호출 후 이런 짓을 :

Restore-SqlDatabase 호출하기 전에 이런 짓을

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

모든 이제 잘 작동하는 것 같다.