База данных с DLL CLR была перенесена с SQL Server 2008R2 на SQL Server 2017.
Автоматическое развертывание этой базы данных с использованием DacPa c в Azure DevOps.
DLL зарегистрирована с EXTERNAL_ACCESS
.
С момента перехода на новый сервер конвейер развертывания нарушен.
Вот что я сделал, чтобы исправить это.
Я изменил целевую платформу в проекте базы данных с SQL Server 2008 на SQL Server 2017.
Ошибка в конвейере изменена с
Невозможно подключиться к главному или целевому серверу. У вас должен быть пользователь с тем же паролем на главном или целевом сервере
до
Внутренняя ошибка. Служба платформы базы данных с типом Microsoft.Data.Tools.Schema. Sql .Sql140DatabaseSchemaProvider недопустима. Вы должны убедиться, что служба загружена, или вы должны предоставить полное имя типа действительной службы платформы базы данных.
Из этого ответа , Microsoft SQL Серверная среда уровня данных сервера (17.1 DacFx) была установлена на агенте сборки.
Ошибка в конвейере изменена на
Assembly 'system.componentmodel.dataannotations, версия = 3.5.0.0, culture = нейтральный, publickeytoken = 31bf3856ad364e35.' не был найден в каталоге SQL.
Затем я изменил целевую структуру библиотеки DLL в проекте базы данных с NET Framework 3.5 на NET Framework 4.0
Ошибка в конвейере изменена на:
Не удалось развернуть пакет. Ошибка SQL72014:. Net Поставщик данных SqlClient: сообщение 6218, уровень 16, состояние 2, строка 1
СОЗДАТЬ СБОРКУ для сборки «System.ComponentModel.DataAnnotations» не удалось из-за сбоя сборки «System.ComponentModel.DataAnnotations». проверка.
Проверьте, являются ли указанные сборки актуальными и надежными (для external_access или unsafe) для выполнения в базе данных.
Сообщения об ошибках CLR Verifier, если таковые будут следовать после этого сообщения
[ : System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider :: GetTypeDescriptor] [mdToken = 0x6000003] [смещение 0x00000000] размер кода равен нулю
[:. System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider :: т е р] [mdToken = 0x6000001] [смещение. 0x00000000] Размер кода равен нулю.
[: System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider ::. Ctor] [mdToken = 0x6000002] [смещение 0x00000000] Размер кода равен нулю.
. Узел соединения:. tadataTypeTypeDescriptor :: GetAttributes] [mdToken = 0x6000007] [offset 0x00000000] Размер кода равен нулю.
[: System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptor: offset_000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000 7 0 10000 10000 1000000000000600000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000, [т [прилаг [], т. 1056 * [: System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptor :: GetProperties] [mdToken = 0x6000005] [смещение 0x00000000] Размер кода равен нулю.
[: System.ComponentModel.DataDoTenTokToneTone.ToTe0Te0T. ] [смещение 0x00000000] Размер кода равен нулю.
[: System.ComponentModel.DataAnnotations.AssociationAttribute ::. ctor] [mdToken = 0x6000008] [смещение 0x00000000] Размер кода равен нулю.
[: System.ComponentModel. DataAnnotations.AssociationAttribute :: get_Name] [mdToken = 0x6000009] [offset 0x00000000] Размер кода равен нулю.
[: System.ComponentModel.DataAnnotations.AssociationAttribute :: get_ThisKey] [mdToken] 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000 0 0 0 0 0 00 0 0 00 0 0 00 0 0 00 0 0 00 0 000 0 0 000 0 .
[: System.Componen tModel.DataAnnotations.AssociationAttribute :: get_OtherKey] [mdToken = 0x600000b] [смещение 0x00000000] Размер кода равен нулю.
[: System.ComponentModel.DataAnnotations.AssociationAttribute :: get_IsForedK0 * m00000000000] [0] 1064 * Ошибка SQL72045: Ошибка выполнения скрипта. Выполненный скрипт: СОЗДАТЬ СБОРКУ [System.ComponentModel.DataAnnotations] АВТОРИЗАЦИЯ [dbo] ОТ
Начиная с шагов 3, я не смог выполнить. Все мои попытки оттуда ничего не сделали. Вот что я попробовал.
- GRANT ВНЕШНИЙ ДОСТУП В СБОРКЕ [userName]
- GRANT UNSAFE ASSEMBLY TO userName]
- ALTER DATABASE [DatabaseName] SET TRUSTWORTHY ON
- SET [userName] как db_owner
SET [userName] как sysadmin - установить всю зависимость dll как UNSAFE
- SET 'clr enabled' на 1
- SET 'clr строгая защита' TO 0
- Успешно импортирован фиктивная DLL CLR
- Я повторил проблему с простым фиктивным проектом, который ссылается на
System.ComponentModel.DataAnnotations
со свойством Model Aware
активировано.
Что я могу сделать дальше, чтобы исправить развертывание DacPa c?
РЕДАКТИРОВАТЬ:
Моя следующая попытка - декомпилировать System.ComponentModel.DataAnnotations
и посмотрим, будет ли это более плавным для конвейера, используя мою собственную версию. Я пытаюсь это потому, что я где-то читал, что сервер проверяет, существует ли dll в GA C. Если это так, то версия / подпись dll сильно совпадают. Поэтому я чувствую, что даже если мне удастся загрузить эту сборку, она неизбежно снова выйдет из строя после обслуживания другого сервера. Таким образом, цена по сравнению с выгодой от использования этой DLL плохо. Зная, что в любом случае используется только небольшая часть библиотеки DLL, я мог бы также принести код, используемый в декомпиляторе.