首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用PowerShell在Server中创建数据库

无法使用PowerShell在Server中创建数据库
EN

Stack Overflow用户
提问于 2016-10-10 12:32:04
回答 2查看 821关注 0票数 0
代码语言:javascript
复制
$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“。”

EN

回答 2

Stack Overflow用户

发布于 2016-10-11 13:48:32

要隔离这个问题,首先要验证一个服务器对象可以使用$SqlServer实例名实例化。然后继续创建数据库:

代码语言:javascript
复制
$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()
    }
票数 0
EN

Stack Overflow用户

发布于 2016-10-11 14:10:31

发生这种情况是因为您从不同的程序集中得到了冲突的类型。我在我的系统里看到的是:

代码语言:javascript
复制
> (get-item "SQLSERVER:\SQL\$server").GetType().Assembly.Location

C:\WINDOWS\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\12.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll

代码语言:javascript
复制
> [Microsoft.SqlServer.Management.Smo.Server].Assembly.Location

C:\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],但是如果提供程序实际上不是此版本的话,这显然会中断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39958385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档