Hac*_*ese 6 sql-server powershell smo
我在我的机器上安装了SQL Server 2012 Developer.我也安装了SQL Server 2014管理对象,这可能是问题的根源.
我正在编写一个模块,通过Powershell自动执行一些常见的开发任务.其中之一是简单地将现有数据库复制到新数据库.
我知道有三种不同的备份和还原方法:执行SQL语句,SMO对象和SQLPS cmdlet.我对SQLPS路线感兴趣.这是我的功能:
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)
}
Run Code Online (Sandbox Code Playgroud)
它备份数据库,但是当它尝试还原时,我收到以下错误:
Restore-SqlDatabase:无法绑定参数'RelocateFile'.无法将类型为"Microsoft.SqlServer.Management.Smo.RelocateFile"的"Microsoft.SqlServer.Management.Smo.RelocateFile"值转换为"Microsoft.SqlServer.Management.Smo.RelocateFile".
此处还描述了此问题:Restore-SqlDatabase cmdlet中的RelocateFile属性的问题
我接受这个问题可能是集会中的冲突.接受的答案提供了两个建议:
- 确保版本匹配.
- 使用Microsoft.SqlServer.Management.Smo.Restore.SqlRestore方法而不是Restore-SqlDatabase cmdlet.
但是,他们只解释了如何做#2.我想知道如何使用Restore-SqlDatabasecmdlet 使其工作.
Dav*_*ave 10
我知道这是旧的,但我遇到了同样的问题.
PS C:> [AppDomain] :: CurrentDomain.GetAssemblies().GetTypes()| ?FullName -eq Microsoft.SqlServer.Management.Smo.RelocateFile | 选择装配
部件
Microsoft.SqlServer.SmoExtended,Version = 13.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91
Microsoft.SqlServer.SmoExtended,Version = 12.0.0.0,Culture = neutral,
PublicKeyToken = 89845dcd8080cc91
New-Object"Microsoft.SqlServer.Management.Smo.RelocateFile,Microsoft.SqlServer.SmoExtended,Version = 12.0.0.0,Culture = neutral,PublicKeyToken = 89845dcd8080cc91"(LogicalName,PhysicalName)
这样做,使用完全限定的类型名称,解决了这个问题.
希望这会帮助找到这个问题的其他人.
您可以以与版本无关的方式执行此操作:
$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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3643 次 |
| 最近记录: |