Я делаю некоторую автоматизацию и переписываю 10-15 старых причудливых скриптов в один простой модуль, который может:
- Экспорт схемы базы данных из MsSql2012 в производственной среде
- Импорт схемы базы данных в MsSql2012 в среде разработки
Я делаю это с помощью Microsoft.SqlServer.Dac, в котором я могу экспортировать/импортировать пакеты dac.
Это прекрасно работает :), но после всех моих TDD и тестов пришло время для настоящего дела, и оказалось, что я совершенно пропустил, что у меня на работе есть 2 домена.
Это означает, что я получаю сообщение об ошибке, когда импортирую dacpac в среду разработки, из-за того, что у наших двух доменов нет полного двустороннего доверия, и, конечно же, в базе данных есть пользователи из обоих доменов. В частности, пользователи производственного домена. Я вижу 3 жизнеспособных решения:
- Получите полное доверие между средами. Но этого не произойдет из-за высокого уровня безопасности, применяемого на моей работе.
- Импортируйте dacpac без пользователей.
- Экспорт в dacpac без пользователей.
Я прочитал документацию (которая, конечно, расплывчата), пытаясь найти набор опций, которые могли бы достичь 2) или 3). Я тестировал много комбо, но ни одна из них не сработает. Импорт dac pac продолжает попытки создать пользователей и терпит неудачу, поскольку рабочие пользователи не могут быть проверены в среде разработки.
Я использую Deploy and Extract для экспорта/импорта. Различные варианты можно найти здесь:
- Извлечение: http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacextractoptions.aspx
- Развертывание: http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacdeployoptions.aspx
Никакая комбинация, которую я нашел, не работает, и я даже читал сообщения, которые предполагают, что это ошибка в DacPac. Но я не уверен. Последний вариант, который я рассматриваю прямо сейчас, - это использовать метод GenerateScript, который, надеюсь, может принудительно исключить пользователей/логины, но я боюсь, что он тоже не сработает. См. (http://technet.microsoft.com/en-us/library/hh753526.aspx).
Вопрос. Как я могу исключить пользователей/логины из моего dacpac при экспорте или импорте?
ОБНОВЛЕНИЕ
Текущие настройки извлечения:
IgnoreUserLoginMappings = true,
VerifyExtraction = false,
Текущие настройки развертывания:
CreateNewDatabase = true,
DeployDatabaseInSingleUserMode = true,
DisableAndReenableDdlTriggers = true,
IgnoreUserSettingsObjects = true,
Обновить
Пока все указывает на одно уродливое решение.
I can generate a deploy script using DacServices.
Then i can parse the script (Remove logins etc).
Then write the result to a file.
And then call SQLCMD in an external process given it the generated and parsed file.
Finally i must evaluate the result from the SQLCMD process.
Причина использования SQLCMD заключается в том, что сгенерированный скрипт, по-видимому, не является чистым tsql, а использует такие вещи, как ':setvar', которые, насколько я могу судить, может обрабатывать только SQLCMD. Давай МС...
Опять же, если кто-нибудь знает лучший способ сделать это на С# или знает об исправлении/обновлении ошибки для сборок DacPac, поделитесь, пожалуйста. :)
Обновить
Я обнаружил, что такие вещи, как IgnorePartitionSchemes, также не работают. Кажется, что пространство имен Microsoft.SqlServer.Dac не просто немного, а ОЧЕНЬ содержит ошибки или не имеет реализации.
ExcludeObjectTypes
. Например, версия на моей машине для разработки, которая была установлена с расширением SSDT, этого не сделала. В версии на моем сервере развертывания он был, и я очень благодарен за это. Эта версия поступила из пакета дополнительных компонентов SQL Server (версия 2012 года здесь< /а>). 23.01.2017