Ограничения модели программирования на основе интеграции со средой CLR

Применимо к: SQL Server Управляемый экземпляр SQL Azure

При создании управляемой хранимой процедуры или другого управляемого объекта базы данных SQL Server выполняет определенные проверки кода, которые необходимо учитывать. SQL Server выполняет проверки сборки управляемого кода при первой регистрации в базе данных с помощью инструкции CREATE ASSEMBLY, а также во время выполнения. Управляемый код проверяется также во время выполнения, поскольку в сборке могут быть кодовые пути, фактически не достижимые во время выполнения. Благодаря этому достигается гибкость при регистрации сборок сторонних производителей, поскольку сборка не блокируется из-за наличия в ней «небезопасного» кода, предназначенного для выполнения в клиентской среде, но никогда не выполняющегося во внутрипроцессной среде CLR. Требования, которым должен соответствовать управляемый код, зависят от того, зарегистрирована ли сборка как SAFE, EXTERNAL_ACCESS или UNSAFE, при этом safe является самой строгой, и перечислены ниже.

Кроме ограничений, которые распространяются на сборки управляемого кода, им также предоставляются права доступа к коду. Среда CLR поддерживает модель безопасности, называемую управлением доступом для кода (CAS). В этой модели разрешения предоставляются сборкам на основе идентификатора кода. Сборки SAFE, EXTERNAL_ACCESS и UNSAFE имеют разные разрешения CAS. Дополнительные сведения см. в разделе ClR Integration Code Access Security.

Проверки CREATE ASSEMBLY

При выполнении инструкции CREATE ASSEMBLY для каждого уровня безопасности выполняются следующие проверки. Если какой-либо проверка завершается сбоем, инструкция CREATE ASSEMBLY завершится ошибкой с сообщением об ошибке.

Глобальная проверка (любой уровень безопасности)

Все сборки, на которые имеются ссылки, должны удовлетворять одному или нескольким из следующих критериев.

  • Сборка уже зарегистрирована в базе данных.

  • Сборка принадлежит к числу поддерживаемых сборок. Дополнительные сведения см. в разделе Поддерживаемые библиотеки платформа .NET Framework.

  • Вы используете инструкцию CREATE ASSEMBLY FROM<location>, и все сборки, на которые имеются ссылки, и их зависимости доступны в <расположении>.

  • Вы используете create ASSEMBLY FROM<bytes ...>, и все ссылки указываются с помощью байтов, разделенных пробелами.

EXTERNAL_ACCESS

Все EXTERNAL_ACCESS сборки должны соответствовать следующим критериям:

  • Статические поля не используются для хранения информации. Допускаются статические поля только для чтения.

  • Тест PEVerify пройден успешно. Средство проверки PEVerify (peverify.exe), проверяющее соответствие кода MSIL и связанных с ним метаданных требованиям безопасности, поставляется в комплекте с пакетом разработчика .NET Framework SDK.

  • Синхронизация, например с классом SynchronizationAttribute , не используется.

  • Методы завершения не используются.

Следующие настраиваемые атрибуты запрещены в EXTERNAL_ACCESS сборках:

  • System.ContextStaticAttribute

  • System.MTAThreadAttribute

  • System.Runtime.CompilerServices.MethodImplAttribute

  • System.Runtime.CompilerServices.CompilationRelaxationsAttribute

  • System.Runtime.Remoting.Contexts.ContextAttribute

  • System.Runtime.Remoting.Contexts.SynchronizationAttribute

  • System.Runtime.InteropServices.DllImportAttribute

  • System.Security.Permissions.CodeAccessSecurityAttribute

  • System.Security.SuppressUnmanagedCodeSecurityAttribute

  • System.Security.UnverifiableCodeAttribute

  • System.STAThreadAttribute

  • System.ThreadStaticAttribute

SAFE

  • Проверяются все условия сборки EXTERNAL_ACCESS .

Проверки времени выполнения

Во время выполнения код сборки проверяется на соответствие ряду условий. Если имеет место хотя бы одно из этих условий, выполнение управляемого кода не разрешается и активизируется исключение.

UNSAFE

Загрузка сборки явным образом путем вызова метода System.Reflection.Assembly.Load() из массива байтов или неявно с помощью пространства имен Reflection.Emit не допускается.

EXTERNAL_ACCESS

Проверяются все условия UNSAFE .

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

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • Синхронизация

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • Пользовательский интерфейс

Дополнительные сведения о HPA и список запрещенных типов и членов в поддерживаемых сборках см. в разделах Атрибуты защиты узла и Программирование интеграции со средой CLR.

SAFE

Проверяются все EXTERNAL_ACCESS условия.

См. также:

Поддерживаемые библиотеки платформы .NET Framework
Управление доступом для кода на основе интеграции со средой CLR
Атрибуты защиты узла и программирование средств интеграции со средой CLR
Создание сборки