СОЗДАТЬ СБОРКУ не удалось, поскольку сборка не прошла проверку. Проверьте, являются ли указанные сборки современными и надежными для выполнения в базе данных. - PullRequest
2 голосов
/ 10 марта 2020

База данных с DLL CLR была перенесена с SQL Server 2008R2 на SQL Server 2017.
Автоматическое развертывание этой базы данных с использованием DacPa c в Azure DevOps.

DLL зарегистрирована с EXTERNAL_ACCESS.

С момента перехода на новый сервер конвейер развертывания нарушен.

Вот что я сделал, чтобы исправить это.

  1. Я изменил целевую платформу в проекте базы данных с SQL Server 2008 на SQL Server 2017.

    Ошибка в конвейере изменена с

    Невозможно подключиться к главному или целевому серверу. У вас должен быть пользователь с тем же паролем на главном или целевом сервере

    до

    Внутренняя ошибка. Служба платформы базы данных с типом Microsoft.Data.Tools.Schema. Sql .Sql140DatabaseSchemaProvider недопустима. Вы должны убедиться, что служба загружена, или вы должны предоставить полное имя типа действительной службы платформы базы данных.

  2. Из этого ответа , Microsoft SQL Серверная среда уровня данных сервера (17.1 DacFx) была установлена ​​на агенте сборки.

    Ошибка в конвейере изменена на

    Assembly 'system.componentmodel.dataannotations, версия = 3.5.0.0, culture = нейтральный, publickeytoken = 31bf3856ad364e35.' не был найден в каталоге SQL.

  3. Затем я изменил целевую структуру библиотеки 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, я мог бы также принести код, используемый в декомпиляторе.

1 Ответ

3 голосов
/ 11 марта 2020

Похоже, что на вас воздействует clr строгая безопасность , чтобы подтвердить, что попытайтесь развернуть сборку вручную (без использования DacPa c).
Если подтверждено, вы можете временно отключить строгую безопасность - изменить опцию clr строгая защита с помощью sp_configure.
В качестве окончательного решения вы должны начать подписывать свои сборки.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-assembly-transact-sql?view=sql-server-ver15

CLR использует код Безопасность доступа (CAS) в. NET Framework, которая больше не поддерживается в качестве границы безопасности. Сборка CLR, созданная с помощью PERMISSION_SET = SAFE, может иметь доступ к внешним системным ресурсам, вызывать неуправляемый код и получать привилегии sysadmin. Начиная с SQL Server 2017 (14.x), для повышения безопасности сборок CLR введена опция sp_configure, называемая строгой безопасностью clr. Строгая защита clr включена по умолчанию и обрабатывает сборки SAFE и EXTERNAL_ACCESS, как если бы они были помечены как UNSAFE. Опция строгой безопасности clr может быть отключена для обратной совместимости, но это не рекомендуется. Microsoft рекомендует, чтобы все сборки были подписаны сертификатом или асимметричным ключом c с соответствующим именем входа, которому было предоставлено разрешение UNSAFE ASSEMBLY в базе данных master. Для получения дополнительной информации см. CLR строгая безопасность.

...