2014-02-20 3 views
7

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

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

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

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

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

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

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

Im using Развертывание и извлечение для экспорта/импорта. Различных вариантов можно найти здесь:

  1. Extract: http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacextractoptions.aspx
  2. Deploy: http://technet.microsoft.com/en-us/library/microsoft.sqlserver.dac.dacdeployoptions.aspx

Нет комбинированный я нашел работу и Ive даже читать сообщения, которые предполагают, что его ошибка в DacPac , Но я не уверен. Последний вариант, который я сейчас рассматриваю, заключается в использовании метода GenerateScript, который, надеюсь, может заставить исключить пользователей/логинов, но я боюсь, что он не будет работать. См. (http://technet.microsoft.com/en-us/library/hh753526.aspx).

Вопрос: Как я могу исключить пользователей/логинов из моего dacpac, будь то в экспорте или в импорте?

UPDATE

Текущие настройки Извлечение:

IgnoreUserLoginMappings = true, 
VerifyExtraction = false, 

Текущий Deploy Настройки:

CreateNewDatabase = true, 
DeployDatabaseInSingleUserMode = true, 
DisableAndReenableDdlTriggers = true, 
IgnoreUserSettingsObjects = true, 

Update

До сих пор все указывает на одно уродливое решение.

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 является то, что сгенерированный скрипт apperently не является чисто TSQL, но использует материал как «: SetVar», который только SQLCMD может работать, насколько я могу судить. Приходите на MS ...

Опять же, если кто-нибудь знает лучший способ сделать это на C# или узнать об исправлении/обновлении ошибки для сборок DacPac, пожалуйста, поделитесь. :)

Update

Я обнаружил, что такие вещи, как IgnorePartitionSchemes тоже не работают. Похоже, что пространство имен Microsoft.SqlServer.Dac не просто немного, но ОЧЕНЬ глючно или отсутствует реализация.

ответ

1

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

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

+0

Ive allready попробовал это. Поэтому я сделал чистый экспорт и импорт и получил тот же результат: {«Не удалось развернуть пакет. \ R \ nError SQL72014:.Net SqlClient Data Provider: Msg 15401, уровень 16, состояние 1, строка 1 Пользователь или группа Windows NT «PROD \\ Read_Write TestDB» не найден. Проверьте имя еще раз. \ R \ nError SQL72045: Ошибка выполнения скрипта. Выполненный скрипт: \ r \ nCREATE LOGIN [PROD \\ Read_Write TestDB] \ r \ n ИЗ WINDOWS WITH DEFAULT_DATABASE = [****], DEFAULT_LANGUAGE = [us_english]; \ r \ n \ r \ n \ r \ n "} –

+0

Удивительно, это была именно та настройка, которая сделала трюк для меня. – Astrotrain

0

Я борюсь с подобной проблемой. DACPAC - это просто zip-архив с тремя XML-файлами. Я нашел исходный код для dacpac manipulation tool и изменил это, чтобы отключить пользователей и войти в систему из DACPAC.

2

Мне удалось решить эту проблему при следующем развертывании файла 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); 
+0

Не все версии ** Microsoft.SqlServer.Dac.dll ** содержат элемент' ExcludeObjectTypes'. Например, версия на моей машине разработки, который был установлен с расширением SSDT, нет. Версия на моем сервере развертывания _did_ есть, и я очень благодарен за это. Эта версия появилась в пакете Feature SQL Server (версия 2012 здесь) (https: // www.microsoft.com/en-us/download/details.aspx?id=29065)). – JamesQMurphy

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^