2014-10-16 25 views
5

Mam programistę SQL Server 2012 zainstalowany na moim komputerze. Też mam zainstalowane obiekty do zarządzania SQL Server 2014, co jest prawdopodobnie źródłem problemu.Nie można powiązać RelocateFile podczas używania cmdlet Restore-SqlDatabase

Piszę moduł do automatyzacji niektórych typowych zadań programistycznych za pomocą Powershell. Jednym z nich jest po prostu skopiowanie istniejącej bazy danych do nowej bazy danych.

Mam świadomość, że istnieją trzy różne sposoby tworzenia kopii zapasowych i przywracania: wykonywania instrukcji SQL, obiektów SMO i poleceń cmdlet SQLPS. Interesuje mnie trasa SQLPS. Oto moja funkcja:

push-location 
import-module sqlps -disablenamechecking 
pop-location 

function Copy-Database { 
    param (
     [string] $database, 
     [string] $newDatabase 
    ) 

    $backupFile = "$database-{0:yyyyMMddhhmmss}.bak" -f (get-date) 
    backup-sqldatabase -serverinstance $defaultServerInstance -database $database -backupfile $backupFile -copyonly 

    $solutionName = $newDatabase 

    $mdf = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("MyDb_Data", "$defaultDatabaseRootPath\$solutionName\$newDatabase.mdf") 
    $ldf = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("MyDb_Log", "$defaultDatabaseRootPath\$solutionName\$newDatabase.ldf") 

    restore-sqldatabase -serverinstance $defaultServerInstance -database $newDatabase -backupfile $backupFile -RelocateFile @($mdf,$ldf) 
} 

To tworzy kopie zapasowe bazy danych, ale przy próbie przywracania, pojawia się następujący błąd:

Restore-SqlDatabase : Cannot bind parameter 'RelocateFile'. Cannot convert the "Microsoft.SqlServer.Management.Smo.RelocateFile" value of type "Microsoft.SqlServer.Management.Smo.RelocateFile" to type "Microsoft.SqlServer.Management.Smo.RelocateFile".

Problem ten jest również opisany tutaj: Problems with RelocateFile property in the Restore-SqlDatabase cmdlet

I zaakceptuj, że problemem może być konflikt w zgromadzeniach. Przyjęta odpowiedź oferuje dwie sugestie:

  1. Make sure that the versions match.
  2. Use the Microsoft.SqlServer.Management.Smo.Restore.SqlRestore method instead of the Restore-SqlDatabase cmdlet.

Wyjaśniają jednak tylko, jak to zrobić # 2. Chcę wiedzieć, jak to zrobić, używając cmdletu Restore-SqlDatabase.

+0

Czy próbowałeś zarówno 32 jak i 64 bit PowerShell sesje? Użyj '[Environment] :: Is64BitProcess', aby upewnić się, na którym jesteś. – vonPryz

+0

@vonPryz Nie mam, dam ci szansę – HackedByChinese

Odpowiedz

0

Nie mogłem wymyślić dobry sposób rozwiązania tego, jak jest. Zakończyłem odinstalowywanie zarówno instalacji SQL Server, jak i instalacji SQL Server 2014.

8

Wiem, że to jest stare, ale natknąłem się na ten sam problem.

PS C:> [AppDomain] :: CurrentDomain.GetAssemblies(). GetTypes() | ? FullName -eq Microsoft.SqlServer.Management.Smo.RelocateFile | wybierz Zgromadzenie

Zgromadzenie

  • Microsoft.SqlServer.SmoExtended, Version = 13.0.0.0, Culture = neutral, TokenKluczaPublicznego = 89845dcd8080cc91

  • Microsoft.SqlServer.SmoExtended, Version = 12,0 .0,0, Kultura = neutralna,
    PublicKeyToken = 89845dcd8080cc91

New-Obiekt "Microsoft.SqlServer.Management.Smo.RelocateFile, Microsoft.SqlServer.SmoExtended, wersja = 12.0.0.0 Kultura = neutralne TokenKluczaPublicznego = 89845dcd8080cc91" (LogicalName, PhysicalName)

Wykonanie tego w ten sposób, z pełną nazwą typu, rozwiązuje problem.

Mam nadzieję, że pomoże to komuś, kto znajdzie to pytanie.

+0

Świetnie, pomogło! Dziękuję Ci! – Roel

2

Można to zrobić w sposób niezależny od wersji:

$sqlServerSnapinVersion = (Get-Command Restore-SqlDatabase).ImplementingType.Assembly.GetName().Version.ToString() 
$assemblySqlServerSmoExtendedFullName = "Microsoft.SqlServer.SmoExtended, Version=$sqlServerSnapinVersion, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 

$mdf = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, $assemblySqlServerSmoExtendedFullName"('MyDb_Data', "$defaultDatabaseRootPath\$solutionName\$newDatabase.mdf") 
$ldf = New-Object "Microsoft.SqlServer.Management.Smo.RelocateFile, $assemblySqlServerSmoExtendedFullName"('MyDb_Log', "$defaultDatabaseRootPath\$solutionName\$newDatabase.ldf") 

restore-sqldatabase -serverinstance $defaultServerInstance -database $newDatabase -backupfile $backupFile -RelocateFile @($mdf,$ldf)