$primaryReplica = $configFile.Config.PrimaryReplica
$Database = $configFile.Config.DatabaseName
$SqlServer = $configFile.Config.ServerName
$machineName = gc env:computername
if ($machineName -eq $primaryReplica)
{
Import-Module "sqlps" -DisableNameChecking
cd "SQLSERVER:\SQL\$SqlServer\Default\Databases"
$DatabaseInstance = Get-Item "$Database" -ErrorAction SilentlyContinue
if ($DatabaseInstance -eq $null)
{
# Create DB
$DatabaseInstance = New-Object Microsoft.SqlServer.Management.SMO.Database
$DatabaseInstance.Parent = Get-Item "SQLSERVER:\SQL\$SqlServer\Default"
$DatabaseInstance.Name = $Database
$DatabaseInstance.RecoveryModel = "Full"
$DatabaseInstance.Create()
}我希望使用PowerShell脚本在Server中创建数据库。上面的代码正在生成以下错误:
异常设置“父”:“无法将"Microsoft.SqlServer.Management.Smo.Server”类型的"PAAROR“值转换为”Microsoft.SqlServer.Management.Smo.Server“。”
发布于 2016-10-11 13:48:32
要隔离这个问题,首先要验证一个服务器对象可以使用$SqlServer实例名实例化。然后继续创建数据库:
$primaryReplica = $configFile.Config.PrimaryReplica
$Database = $configFile.Config.DatabaseName
$SqlServer = $configFile.Config.ServerName
...
if ($DatabaseInstance -eq $null)
{
# Create DB
$SqlServerInstance = New-Object Microsoft.SqlServer.Management.SMO.Server $SqlServer
$DatabaseInstance = New-Object Microsoft.SqlServer.SMO.Database($SqlServerInstance, $Database)
$DatabaseInstance.Create()
}发布于 2016-10-11 14:10:31
发生这种情况是因为您从不同的程序集中得到了冲突的类型。我在我的系统里看到的是:
> (get-item "SQLSERVER:\SQL\$server").GetType().Assembly.LocationC:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
> [Microsoft.SqlServer.Management.Smo.Server].Assembly.LocationC:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll
sqlps为我提供Server 2014中的类型,但直接解析该类型将为我提供Server 2016中的类型。这是因为当您导入sqlps时,两者都会被加载,这是.不幸的是。
如果从Server 2016开始使用新模块,则应该导入SqlServer (然后也可以省略-DisableNameChecking )。如果您必须使用sqlps进行向后兼容性,我不确定正确的解决方案是什么。作为一种非常丑陋的解决方法,您可以显式地将类型名称指定为[Microsoft.SqlServer.Management.Smo.Database, Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91],但是如果提供程序实际上不是此版本的话,这显然会中断。
https://stackoverflow.com/questions/39958385
复制相似问题