Невозможно обновить / импортировать файл dacpa c - PullRequest
3 голосов
/ 16 апреля 2020

ОРИГИНАЛЬНЫЙ ВОПРОС:

Попытка обновить пустую базу данных, созданную в тестовой ВМ, с использованием файла .dacpac, но получить следующее сообщение об ошибке:

Error SQL72014: .Net SqlClient Data Provider: Msg 15401, Level 16, State 1, Line 1 Windows NT user or group 'SOURCE_DOMAIN\SOURCE SQL Readers' not found. Check the name again.
Error SQL72045: Script execution error.  The executed script:
CREATE LOGIN [SOURCE_DOMAIN\SOURCE SQL Readers]
    FROM WINDOWS WITH DEFAULT_LANGUAGE = [us_english];


 (Microsoft.SqlServer.Dac)

------------------------------
Program Location:

   at Microsoft.SqlServer.Dac.DeployOperation.ThrowIfErrorManagerHasErrors()
   at Microsoft.SqlServer.Dac.DeployOperation.<>c__DisplayClass14.<>c__DisplayClass16.<CreatePlanExecutionOperation>b__13()
   at Microsoft.Data.Tools.Schema.Sql.Dac.OperationLogger.Capture(Action action)
   at Microsoft.SqlServer.Dac.DeployOperation.<>c__DisplayClass14.<CreatePlanExecutionOperation>b__12(Object operation, CancellationToken token)
   at Microsoft.SqlServer.Dac.Operation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.ReportMessageOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.OperationExtension.CompositeOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.OperationExtension.CompositeOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.DeployOperation.Microsoft.SqlServer.Dac.IOperation.Run(OperationContext context)
   at Microsoft.SqlServer.Dac.OperationExtension.Execute(IOperation operation, DacLoggingContext loggingContext, CancellationToken cancellationToken)
   at Microsoft.SqlServer.Dac.DacServices.InternalDeploy(IPackageSource packageSource, Boolean isDacpac, String targetDatabaseName, DacDeployOptions options, CancellationToken cancellationToken, DacLoggingContext loggingContext, Action`3 reportPlanOperation, Boolean executePlan)
   at Microsoft.SqlServer.Dac.DacServices.Deploy(DacPackage package, String targetDatabaseName, Boolean upgradeExisting, DacDeployOptions options, Nullable`1 cancellationToken)
   at Microsoft.SqlServer.Management.Dac.DacWizard.UpgradeModel.RunAction()
   at Microsoft.SqlServer.Management.Dac.DacWizard.ExecuteDacPage.backgroundWorker1_DoWork(Object sender, DoWorkEventArgs e)
   at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
   at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)

Предполагается, что пользователь существует в источнике, но не в месте назначения. Поможет ли создание этого пользователя на ВМ решить эту проблему, или мне нужно будет использовать другой подход для получения данных схемы из источника, воссозданного в месте назначения ВМ, для целей тестирования?


ОБНОВЛЕНИЕ К ВОПРОСУ 1:

Файл .dacpac создается на сервере, который находится в совершенно другом домене, и тестовая виртуальная машина не сможет когда-либо находиться в одном домене. Имея это в виду, как мне заставить файл .dacpac работать на тестовой ВМ?

Ответы [ 3 ]

2 голосов
/ 26 апреля 2020

Взгляните на this , эта ошибка обычно возникает из-за COMPATIBILITY_LEVEL Я бы порекомендовал попробовать этот карьер:

ALTER DATABASE database_name
SET COMPATIBILITY_LEVEL =  130;

Надеюсь, это поможет!

1 голос
/ 25 апреля 2020

Если у вас все еще есть доступ к ВМ, вы можете сгенерировать .dacpa c снова на этот раз, игнорируя логины. В зависимости от того, какой инструмент вы используете, у вас должен быть доступ к параметру типа «Включить сопоставление имени пользователя».

Самый надежный из них имеет VS: «Как создать файл DACPA C?» Камиль Новински :

enter image description here

Источник изображения: https://sqlplayer.net/wp-content/uploads/2018/10/visual-studio-extract-dacpac-options.png

После этого вы можете воссоздать надлежащие имена входа и пользователей с помощью собственного SQL сценария.


Связанный: Использование Publi sh Профилей для развертывания базы данных DACPA C Без учетных записей пользователей

Решение этой проблемы заключается в определении соответствующего профиля publi sh для вашего DACPA C, который затем инструктирует выбранный вами инструмент развертывания - SQLPackage.exe, Visual Studio или Azure DevOps - о том, как выполнить развертывание

Профиль определяется как файл XML.

ExcludeUsers
ExcludeLogins
ExcludeDatabaseRoles

При установке этих параметров в True в нашем опубликованном профиле sh создание или изменение этих объектов будет полностью пропущено при любом развертывании базы данных.


Еще одним вариантом является использование dbtools.io - Export-DbaDacPackage

Ключевой момент здесь:

$exportProperties = "/p:IgnorePermissions=True /p:IgnoreUserLoginMappings=True" # Ignore 

и publi sh. xml:

...
<ExcludeLogins>True</ExcludeLogins>
<IgnorePermissions>True</IgnorePermissions>
<IgnoreLoginSids>True</IgnoreLoginSids>
<IgnoreRoleMembership>True</IgnoreRoleMembership>

Сводка:

  • создать dacpa c без логина
  • создать файл publi sh. xml, который будет игнорировать разрешения
0 голосов
/ 20 апреля 2020

Создание пользователя внутри виртуальной машины - один из способов решения этой проблемы, но вам нужно изменить «SOURCE_DOMAIN» на имя хоста виртуальной машины, так как пользователь будет частью локальной базы данных пользователей.

Вероятно, лучшее решение - это установить связь между виртуальной машиной и контроллером домена, чтобы аутентификация работала, и учетные записи пользователей в действительности становились видимыми внутри виртуальной машины.

...