Сбой импорта базы данных через BACPAC/DACPAC для пользователей при использовании инструментов CLI (sqlpackage.exe/PS dbatools)

Цель

Клонировать базу данных SQL на другой удаленный SQL Server с помощью сценария PowerShell.

Что работает

Использование SSMS для импорта файла BACPAC на разные серверы (удаленно и локально) работает без предупреждений или ошибок (сообщается).

Чего нет

Импорт BACPAC на удаленный SQL Server приводит к следующей ошибке при использовании sqlpackage.exe и инструментов PowerShell dbatools:

Warning SQL72038: The object [XXX] already exists in database with a different definition and will not be altered.
Error SQL72014: .Net SqlClient Data Provider: Msg 15023, Level 16, State 1, Line 1 User, group, or role 'XXX' already exists in the current database.
Error SQL72045: Script execution error.  The executed script:
CREATE USER [XXX] FOR LOGIN [XXX];

Я также пытался использовать подход PS dbatools DACPAC: https://dbatools.io/clone/

Сообщение об ошибке с другими настройками изменилось на:

Initializing deployment (Start)
                       The object [XXX] already exists in database with a different definition and will not be altered.
                       Initializing deployment (Complete)
                       Analyzing deployment plan (Start)
                       Analyzing deployment plan (Complete)
                       Reporting and scripting deployment plan (Start)
                       Reporting and scripting deployment plan (Complete)
                       Updating database (Start)
                       Creating NEW_DATABASE...
                       The database settings cannot be modified. You must be a SysAdmin to apply these settings.
                       Creating [XXX]...
                       .Net SqlClient Data Provider: Msg 15023, Level 16, State 1, Line 1 User, group, or role 'XXX' already
                       exists in the current database.
                       Script execution error.  The executed script:
                       CREATE USER [XXX] WITHOUT LOGIN;

An error occurred while the batch was being executed.
                       Updating database (Failed)

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

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

Чтобы это исправить, нам пришлось изменить пароль администратора в RDS.

SQL Server AWS RDS не может удалить базу данных

Примечания

  • Я не могу удалить пользователя XXX, поскольку он сопоставлен с другими базами данных.
  • Студия управления SQL Server версии 17.9.1
  • Инструменты базы данных PowerShell v1.0.30

Вопросы

  • Есть ли способ узнать, что выполняет SSMS, чтобы я мог воспроизвести его с помощью сценария?
  • Какие есть варианты решения этой проблемы?

person andrewjamesbowen    schedule 16.08.2019    source источник
comment
Я не уверен, что вы используете правильный инструмент для работы. docs.microsoft.com/ en-us/sql/tools/sqlpackage/ говорит, что вы не можете использовать импорт в существующую базу данных, если она не содержит никаких пользовательских объектов. Если вы используете его для обновления схемы базы данных, я думаю, вам нужно использовать публикацию из dacpac.   -  person Luke Briner    schedule 19.05.2021
comment
Спасибо за ответ. Проблема в том, как мне клонировать производственную БД в тестовый SQL Server с помощью инструментов CLI? т. е. мне нужна каждая таблица, хранимая процедура, строка и т. д. Что меня смущает, так это то, что SSMS отлично работает с bacpacs, но я не могу воспроизвести эту функциональность с помощью инструмента CLI.   -  person andrewjamesbowen    schedule 22.05.2021
comment
Создайте пустую базу данных, а затем используйте импорт sqlpackage.   -  person Luke Briner    schedule 23.05.2021