Управление выпуском не будет развертываться в базе данных SQL 2014.

Используя сервер управления выпусками Microsoft для Team Foundation Server 2013 v12.0.31101.0, я продолжаю получать сообщение об ошибке (включено позже). Однако я могу успешно запустить команду sqlpackage с моей локальной машины, сервера сборки и целевого SQL-сервера.

Предпринятые шаги:

  • Я взял dll и sqlpackage.exe из C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin и скопировал их в папку на рабочем столе.
  • В Release Management я создал новый инструмент с помощью команды: sqlpackage.exe /Action:Publish /SourceFile:__FileName__ /TargetDatabaseName:__DatabaseName__ /TargetServerName:__ServerName__
  • Затем я добавил dll и SqlPackage.exe из папки, созданной ранее.
  • Сохрани и закрой
  • Затем я создал новый компонент, который в основном просто обертывает этот инструмент (расположение сборки — это обратная косая черта, указывающая, что dacpac находится в корне папки сборки).
  • Затем я выбрал инструмент, который я создал, и он заполнил все. Я обновил свой шаблон выпуска, чтобы включить и использовать компонент

Поместив созданную папку на любой рабочий стол, я могу запустить следующую команду, и она работает просто отлично

sqlpackage.exe /Action:Publish /SourceFile:MyDatabase.dacpac /TargetDatabaseName:MyDatabase /TargetServerName:MyDatabaseServer

Я сделал это со своего локального ПК, сервера сборки и самого SQL Server, но когда я использую Управление релизами, я получаю сообщение об ошибке.

Ошибка:

An unexpected failure occurred: The type initializer for 'Microsoft.SqlServer.Dac.DacPackage' threw an exception..

Unhandled Exception: System.TypeInitializationException: The type initializer for 'Microsoft.SqlServer.Dac.DacPackage' threw an exception. ---> System.TypeInitializationException: The type initializer for 'Microsoft.SqlServer.Dac.DacServices' threw an exception. ---> System.TypeInitializationException: The type initializer for 'SqlSchemaModelStaticState' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.SqlServer.TransactSql.ScriptDom, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.

Обновление 1. В сообщении об ошибке от Release Management я заметил, что целевым сервером был мой веб-сервер, а не SQL Server, несмотря на то, что SQL Server был правильно назван в команде. Я проверил журнал на веб-сервере и нашел ошибки. Я скопировал свою папку dll на рабочий стол, запустил скрипт и вуаля, я смог воссоздать ошибку. Я проверил установленные программы в панели управления и заметил, что установленная версия Transact-SQL ScriptDom относится к 2012 году, версия 11.0.2100.60. Поэтому я установил SSDT здесь. Установка не удалась, потому что у меня не установлена ​​Visual Studio, но мне все же удалось установить версии Transact-SQL ScriptDom 12.0.2000.8 и связанные библиотеки DLL. Когда я снова запустил скрипт, он успешно опубликовал базу данных! Однако, когда я попытался выполнить сборку из Release Management, я получил новую ошибку.

Publishing to database 'Logging' on server 'BYDWVCMNSQ01'.
Initializing deployment (Start)
Initializing deployment (Failed)
*** Could not deploy package.
Unable to connect to target server.

Обновление 2. Итак, я подтвердил, что причина сбоя на данном этапе заключалась в том, что учетная запись, которую использовал сервер сборки, не имела учетной записи для входа в SQL Server. Я добавил учетную запись, а затем предоставил ей привилегии ddladmin и securityadmin в базе данных, на которую я ориентируюсь. Это приводит к новой ошибке, что я не могу создать нового пользователя, но, по крайней мере, я приближаюсь.

Последнее обновление: мне также пришлось предоставить системного администратора, чтобы учетная запись могла создать логин. Это позволило выполнить этап развертывания в RM. Это, очевидно, не то, как я оставлю это, я буду использовать профиль публикации или флаги команд, чтобы предотвратить создание dacpac с объектами безопасности и позволить ему работать с минимальными привилегиями.

Решена проблема получения RM для развертывания в SQL 2014. Основная проблема заключалась в моем шаблоне выпуска, я поместил компонент DACPAC вместе с остальной сборкой для моего веб-сервера. Это заставляет команду DACPAC запускаться с веб-сервера, и для этого мне пришлось установить SSDT на веб-сервере. Мне это не нравится, и я, вероятно, перестрою свой шаблон выпуска, чтобы веб-сервер и sql-сервер были параллельны, но вложены в один и тот же откат.


comment
Имеет ли развертываемая учетная запись RM соответствующие разрешения для SQL Server?   -  person Graham Smith    schedule 20.05.2015


Ответы (2)


На сервере, на котором выполняется развертывание, запустите procmon с фильтром отсутствующей dll, затем скопируйте его в одну из папок, в которых он ищет.

Правильным способом было бы установить ssdt и биты scriptdom (ищите создание безголовой машины для сборки ssdt)

person Ed Elliott    schedule 20.05.2015

Мне повезло с этим ответом, переключаясь со старого SqlPackage на новый, я думаю, что это какая-то путаница связанных dll:

Чтобы устранить эту проблему, измените путь к sqlpackage.exe на новую версию «140». Новый путь к sqlpackage.exe должен быть таким:

%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\140\SqlPackage.exe

person David Rogers    schedule 14.12.2017