#powershell #scripting #dacpac
#powershell #сценарии #dacpac
Вопрос:
У меня есть следующий сценарий Powershell, который я пытаюсь запустить:
add-type -path "C:Program Files (x86)Microsoft SQL Server110DACbinMicrosoft.SqlServer.Dac.dll";
$d = new-object Microsoft.SqlServer.Dac.DacServices "server=localhost"
# Load dacpac from file amp; deploy to database named pubsnew
$dp = [microsoft.sqlserver.dac.dacpackage]::load("c:deployMyDbDacPac.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:ScriptsDeployDacPac.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. Не могу понять, что еще может быть не так.
Любая помощь будет с благодарностью!
Комментарии:
1.Я использую следующие ссылки для настройки этого, и я считаю, что использую правильный синтаксис в соответствии с их примерами. msmvps.com/blogs/deborahk/archive/2014/02/10/…blogs.blackmarble.co.uk/blogs/rfennell/post/2013/03/14/…blog.raffaeu.com/archive/2013/10/17 /…
Ответ №1:
Проблема здесь в том, что методом проверки подлинности по умолчанию является проверка подлинности SQL Server, которая ожидает имя пользователя и пароль. Вам нужно будет либо указать эти параметры, либо явно указать, что должна использоваться проверка подлинности Windows. Вы можете сделать это, заменив аргумент строки подключения следующим.
"server=localhost;Integrated Security = True;"
В качестве альтернативы вы можете использовать следующую функцию для инкапсуляции этой логики. Обратите внимание, что набором параметров по умолчанию является ‘WindowsAuthentication’, который не включает параметры имени пользователя или пароля. Если вы укажете любой из этих параметров, Powershell будет использовать набор параметров ‘SqlServerAuthentication’ и $ 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;
}