Хобрук: Ваш путь к мастерству в программировании

DacPac исключает пользователей и логины при экспорте или импорте

Я делаю некоторую автоматизацию и переписываю 10-15 старых причудливых скриптов в один простой модуль, который может:

  1. Экспорт схемы базы данных из MsSql2012 в производственной среде
  2. Импорт схемы базы данных в MsSql2012 в среде разработки

Я делаю это с помощью Microsoft.SqlServer.Dac, в котором я могу экспортировать/импортировать пакеты dac.

Это прекрасно работает :), но после всех моих TDD и тестов пришло время для настоящего дела, и оказалось, что я совершенно пропустил, что у меня на работе есть 2 домена.

Это означает, что я получаю сообщение об ошибке, когда импортирую dacpac в среду разработки, из-за того, что у наших двух доменов нет полного двустороннего доверия, и, конечно же, в базе данных есть пользователи из обоих доменов. В частности, пользователи производственного домена. Я вижу 3 жизнеспособных решения:

  1. Получите полное доверие между средами. Но этого не произойдет из-за высокого уровня безопасности, применяемого на моей работе.
  2. Импортируйте dacpac без пользователей.
  3. Экспорт в dacpac без пользователей.

Я прочитал документацию (которая, конечно, расплывчата), пытаясь найти набор опций, которые могли бы достичь 2) или 3). Я тестировал много комбо, но ни одна из них не сработает. Импорт dac pac продолжает попытки создать пользователей и терпит неудачу, поскольку рабочие пользователи не могут быть проверены в среде разработки.

Я использую Deploy and Extract для экспорта/импорта. Различные варианты можно найти здесь:

  1. Извлечение: http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacextractoptions.aspx
  2. Развертывание: 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 не просто немного, а ОЧЕНЬ содержит ошибки или не имеет реализации.


Ответы:


1

Мне удалось решить эту проблему с помощью следующего развертывания файла dacpac. Важная настройка была в ExcludeObjectTypes.

const string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB...";
var dacServices = new DacServices(connectionString);

// show deployment in the output window.
dacServices.Message += (o, args) => Debug.WriteLine(args.Message);
dacServices.ProgressChanged += (o, args) => Debug.WriteLine(args.Status);

// load the file.
var dacpac = DacPackage.Load("file.dacpac");
var options = new DacDeployOptions
    {
         IgnorePermissions = true,
         IgnoreUserSettingsObjects = true,
         IgnoreLoginSids = true,
         IgnoreRoleMembership = true,

         // THIS IS THE MAGIC SETTING THAT FINALLY WORKED.
         ExcludeObjectTypes = new[] { 
             ObjectType.Users,
             ObjectType.Logins,
             ObjectType.RoleMembership }
    };
dacServices.Deploy(
    dacpac,
    "MyDbName",
    true,
    options);
06.07.2016
  • Не все версии Microsoft.SqlServer.Dac.dll содержат член ExcludeObjectTypes. Например, версия на моей машине для разработки, которая была установлена ​​с расширением SSDT, этого не сделала. В версии на моем сервере развертывания он был, и я очень благодарен за это. Эта версия поступила из пакета дополнительных компонентов SQL Server (версия 2012 года здесь< /а>). 23.01.2017
  • Существует отдельный установщик SSDT, который включает ExcludeObjectTypes, чтобы устранить несоответствия, я включил правильную DLL, как только я основал ее в качестве прямой ссылки в своем проекте. 03.08.2018

  • 2

    Во время развертывания важным параметром является «IgnoreUserSettingsObjects». Это будет игнорировать пользователей, отношения пользователь-> логин и пользователь-> схема. Установка этого значения в true должна быть главной, чтобы заставить это работать.

    При извлечении вы также можете установить для параметра DacExtractOptions.IgnoreUserLoginMappings значение true. В этом случае сопоставление user->login не включено, но похоже, что важнее просто игнорировать пользователей во время развертывания. Это означает, что вам нужно запустить скрипт после развертывания, чтобы убедиться, что нужные пользователи присутствуют.

    20.02.2014
  • Я уже пробовал это. Поэтому я выполнил чистый экспорт и импорт и получил тот же результат: {Не удалось развернуть пакет.\r\nОшибка SQL72014: поставщик данных .Net SqlClient: Msg 15401, уровень 16, состояние 1, строка 1, пользователь Windows NT или группа 'PROD \\Read_Write TestDB' не найден. Проверьте имя еще раз.\r\nОшибка SQL72045: ошибка выполнения сценария. Выполняемый скрипт:\r\nCREATE LOGIN [PROD\\Read_Write TestDB]\r\n ИЗ WINDOWS WITH DEFAULT_DATABASE = [****], DEFAULT_LANGUAGE = [us_english];\r\n\r\n\r\n } 21.02.2014
  • Удивительно, это была именно та настройка, которая помогла мне. 09.08.2016


  • 4

    Способ, которым мы справились с этим, заключался в том, чтобы просто исключить таблицы, содержащие конфиденциальную информацию о безопасности, а затем повторно вставить их с общей информацией. Метод DacServices.ExportBacpac имеет перегрузку, которая принимает список таблиц для включения; поэтому вы можете создать список, который не включает таблицы, которые вы хотите пропустить. Получается, что он будет включать таблицы, просто игнорирует данные. Таким образом, мы используем это, чтобы, например, получить bacpac из prod, а затем импортировать его на локальную машину разработки (которая была очищена из-за этой команды, которая программно пропускает конфиденциальные данные); затем мы запускаем некоторые сценарии вставки для заполнения пользовательской таблицы, например. с глобальным пользователем-администратором с общим паролем. См. здесь перегрузку, которая принимает список таблиц: https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacservices.exportbacpac(v=sql.120).aspx

    23.01.2017
    Новые материалы

    #093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
    TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..

    numberToString.js (8kyu 16)
    Алгоритм кодовых войн Проблема Нам нужна функция, которая может преобразовать число в строку. 숫자를 문자열로 변환하는 함수를 작성해라. Решение 01 function numberToString(n) { return n.toString(); }..

    Лучшие практики для быстрого изучения языка программирования
    Изучение языка программирования может быть сложной задачей, но при правильном подходе определенно возможно быстро выучить язык программирования. Хорошее понимание языка программирования может..

    Использование данных из Adobe Analytics в предложениях Adobe Target
    Я уверен, что все видели эти всплывающие окна в интернет-магазинах, которые говорят что-то вроде « 15 человек просматривают этот товар прямо сейчас! » или « 105 человек из Мичигана купили это..

    Машинное обучение и его набор данных в CreateML
    Когда я впервые начал учиться в Apple Developer Academy, у меня был момент неуверенности в моем интересе к машинному обучению. Нужно ли мне сменить карьеру моей мечты с специалиста по данным на..

    Обучение требует воли
    Недавно я прочитал отличную статью Шейна Легга и Джоэла Венесса из DeepMind. http://arxiv.org/pdf/1109.5951v2.pdf В статье «универсальный интеллект» агента π определяется как: Поэтому..

    Безопасность по дизайну делает всех счастливыми
    Заложенная безопасность делает всех счастливыми Если вы никогда не смотрели Louis C.K. рассказать о том, как Все удивительно, и никто не счастлив ; побаловать себя. Сделайте это прямо..