我正在尝试运行以下Powershell脚本:
add-type -path "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\Microsoft.SqlServer.Dac.dll";
$d = new-object Microsoft.SqlServer.Dac.DacServices "server=localhost"
# Load dacpac from file & deploy to database named pubsnew
$dp = [microsoft.sqlserver.dac.dacpackage]::load("c:\deploy\MyDbDacPac.dacpac")
$d.deploy($dp, "MyDb", $true)
然而,当它运行时,我收到以下错误:
New-Object : Exception calling ".ctor" with "1" argument(s): "The type initializer for 'Microsoft.SqlServer.Dac.DacServices' threw an exception."
At C:\Scripts\DeployDacPac.ps1:3 char:16
+ $d = new-object <<<< Microsoft.SqlServer.Dac.DacServices "server=localhost"
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : Cons tructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
我正在尝试为自动数据库部署运行它,但无法通过这个奇怪的错误。 我已经将执行策略设置为remotesigned并将我的运行时版本更新为Powershell到.NET 4.0。无法弄清楚还有什么可能是错的。
非常感谢任何帮助!
答案 0 :(得分:2)
这里的问题是默认的身份验证方法是SQL Server身份验证,需要用户名和密码。您需要提供这些参数或明确指定应使用Windows身份验证。您可以通过使用以下内容替换连接字符串参数来完成此操作。
"server=localhost;Integrated Security = True;"
或者,您可以使用以下函数来封装此逻辑。请注意,默认参数集是&#39; WindowsAuthentication&#39;其中不包含UserName或Password参数。如果您提供其中任何一个,Powershell将使用&#39; SqlServerAuthentication&#39;参数集和$ PSCmdlet.ParameterSetName变量将被适当设置。
function Get-DacServices()
{
[CmdletBinding(DefaultParameterSetName="WindowsAuthentication")]
Param(
[string]$ServerName = 'localhost',
[Parameter(ParameterSetName='SqlServerAuthentication')]
[string]$UserName,
[Parameter(ParameterSetName='SqlServerAuthentication')]
[string]$Password
)
$connectionString = "server=$serverName;";
if($PSCmdlet.ParameterSetName -eq 'SqlServerAuthentication')
{
$connectionString += "User ID=$databaseUsername;Password=$databasePassword;";
}
else
{
$connectionString += "Integrated Security = True;";
}
$result = new-object Microsoft.SqlServer.Dac.DacServices $connectionString;
return $result;
}