Архитектура интеграции со средой CLR — среда размещения CLRCLR Integration Architecture - CLR Hosted Environment

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server нетБаза данных SQL AzureнетХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Интеграция SQL ServerSQL Server со средой CLR платформы .NET Framework позволяет программистам работать с базами данных, используя такие языки, как Visual C#, Visual Basic .NET, Visual C++.SQL ServerSQL Server integration with the .NET Framework common language runtime (CLR) enables database programmers to use languages such as Visual C#, Visual Basic .NET, and Visual C++. С помощью этих языков программисты могут создавать различные объекты бизнес-логики, например: функции, хранимые процедуры, триггеры, типы данных и агрегаты.Functions, stored procedures, triggers, data types, and aggregates are among the kinds of business logic that programmers can write with these languages.

Среда CLR характеризуется применением памяти со сбором мусора, потоковой обработки с вытеснением, службы метаданных (отражения типа), проверки кода и управления доступом для кода.The CLR features garbage-collected memory, pre-emptive threading, metadata services (type reflection), code verifiability, and code access security. В среде CLR метаданные используются для обнаружения и загрузки классов, размещения экземпляров в памяти, разрешения вызовов методов, формирования машинного кода, обеспечения безопасности и определения границ контекста времени выполнения.The CLR uses metadata to locate and load classes, lay out instances in memory, resolve method invocations, generate native code, enforce security, and set run-time context boundaries.

CLR и SQL ServerSQL Server различаются как варианты среды времени выполнения по способам управления памятью, потоками и синхронизацией.The CLR and SQL ServerSQL Server differ as run-time environments in the way they handle memory, threads, and synchronization. В этом разделе описан способ интеграции этих двух вариантов среды времени выполнения, позволяющий обеспечить единообразное управление всеми системными ресурсами.This topic describes the way in which these two run times are integrated so that all system resources are managed uniformly. В этом разделе рассматривается также способ интеграции средств управления доступом для кода (CAS) среды CLR и средств безопасности SQL ServerSQL Server в целях предоставления надежной и безопасной среды выполнения пользовательского кода.This topic also covers the way in which CLR code access security (CAS) and SQL ServerSQL Server security are integrated to provide a reliable and secure execution environment for user code.

Основные понятия архитектуры CLRBasic Concepts of CLR Architecture

На платформе .NET Framework программист использует язык высокого уровня, который реализует класс, определяющий его структуру (например, поля или свойства класса) и методы.In the .NET Framework, a programmer writes in a high-level language that implements a class defining its structure (for example, the fields or properties of the class) and methods. Некоторые из этих методов могут быть статическими функциями.Some of these methods can be static functions. Компиляции программа создает файл с именем сборки, содержащей скомпилированный код в MicrosoftMicrosoft промежуточного языка MSIL и манифест, содержащий все ссылки на зависимые сборки.The compilation of the program produces a file called an assembly that contains the compiled code in the MicrosoftMicrosoft intermediate language (MSIL), and a manifest that contains all references to dependent assemblies.

Примечание

Сборки — важнейший элемент архитектуры CLR.Assemblies are a vital element in the architecture of the CLR. Они представляют собой средства упаковки, развертывания и управления версиями кода приложений на платформе .NET Framework.They are the units of packaging, deployment, and versioning of application code in the .NET Framework. С помощью сборок можно развертывать код приложений в базе данных и предоставлять единообразный способ администрирования, создания резервных копий и восстановления законченных приложений базы данных.Using assemblies, you can deploy application code inside the database and provide a uniform way to administer, back up, and restore complete database applications.

Манифест сборки содержит метаданные о сборке, описывающие все структуры, поля, свойства, классы, связи наследования, функции и методы, определенные в программе.The assembly manifest contains metadata about the assembly, describing all of the structures, fields, properties, classes, inheritance relationships, functions, and methods defined in the program. Манифест устанавливает идентификационные данные сборки, указывает файлы, образующие реализацию сборки, задает типы и ресурсы, составляющие сборку, конкретизирует зависимости времени компиляции от других сборок и регламентирует набор разрешений, необходимых для правильного выполнения сборки.The manifest establishes the assembly identity, specifies the files that make up the assembly implementation, specifies the types and resources that make up the assembly, itemizes the compile-time dependencies on other assemblies, and specifies the set of permissions required for the assembly to run properly. Эти сведения используются во время выполнения для разрешения ссылок, применения политики привязки версии и проверки целостности загруженных сборок.This information is used at run time to resolve references, enforce version binding policy, and validate the integrity of loaded assemblies.

Платформа .NET Framework поддерживает пользовательские атрибуты для аннотации классов, свойств, функций и методов с дополнительными сведениями, которые приложение может собрать в метаданных.The .NET Framework supports custom attributes for annotating classes, properties, functions, and methods with additional information the application may capture in metadata. Все компиляторы .NET Framework воспринимают эти заметки без интерпретации и хранят их как метаданные сборки.All .NET Framework compilers consume these annotations without interpretation and store them as assembly metadata. Эти заметки можно анализировать так же, как любые другие метаданные.These annotations can be examined in the same way as any other metadata.

Управляемый код представляет собой код MSIL, выполняемый в среде CLR, а не непосредственно операционной системой.Managed code is MSIL executed in the CLR, rather than directly by the operating system. Приложения с управляемым кодом используют средства служб CLR, такие как автоматическая сборка мусора, проверка типов на стадии выполнения и обеспечение безопасности.Managed code applications acquire CLR services, such as automatic garbage collection, run-time type checking, and security support. Эти службы помогают обеспечить единообразное поведение приложений с управляемым кодом независимо от платформы и языка.These services help provide uniform platform- and language-independent behavior of managed code applications.

Цели проектирования при интеграции со средой CLRDesign Goals of CLR Integration

Если пользовательский код выполняется в среде размещения CLR в SQL ServerSQL Server (что принято называть интеграцией со средой CLR), то ставятся следующие цели проектирования.When user code runs inside the CLR-hosted environment in SQL ServerSQL Server (called CLR integration), the following design goals apply:

Надежность (безопасность)Reliability (Safety)

В пользовательском коде не должно быть разрешено выполнение операций, нарушающих целостность процесса компонента Database Engine, таких как вывод окна сообщения, запрашивающего ответ от пользователя, или выход из процесса.User code should not be allowed to perform operations that compromise the integrity of the Database Engine process, such as popping a message box requesting a user response or exiting the process. Пользовательский код не должен иметь возможности перезаписывать буфера памяти компонента Database Engine или внутренние структуры данных.User code should not be able to overwrite Database Engine memory buffers or internal data structures.

МасштабируемостьScalability

В SQL ServerSQL Server и в среде CLR используются различные внутренние модели планирования и управления памятью.SQL ServerSQL Server and the CLR have different internal models for scheduling and memory management. В SQL ServerSQL Server поддерживается кооперативная модель потоков без вытеснения, в которой каждый выполняющийся поток должен сам возвращать управление либо по прошествии определенного периода, либо во время ожидания освобождения блокировок или завершения операций ввода-вывода.SQL ServerSQL Server supports a cooperative, non-preemptive threading model in which the threads voluntarily yield execution periodically, or when they are waiting on locks or I/O. Среда CLR поддерживает модель потоков с вытеснением.The CLR supports a preemptive threading model. Если в пользовательском коде, выполняемом в SQL ServerSQL Server, допускается непосредственный вызов базовых функций управления потоками операционной системы, то интеграция этого кода в планировщик задач SQL ServerSQL Server становится неудовлетворительной и может снизиться масштабируемость системы.If user code running inside SQL ServerSQL Server can directly call the operating system threading primitives, then it does not integrate well into the SQL ServerSQL Server task scheduler and can degrade the scalability of the system. В среде CLR виртуальная и физическая память не различаются, но SQL ServerSQL Server непосредственно управляет физической памятью и должна использовать физическую память в пределах, определяемых конфигурацией.The CLR does not distinguish between virtual and physical memory, but SQL ServerSQL Server directly manages physical memory and is required to use physical memory within a configurable limit.

Если должно быть обеспечено масштабирование системы управления реляционной базой данных (СУРБД) в целях одновременной поддержки тысяч пользовательских сеансов, то приходится решать сложные задачи интеграции в связи с применением разных моделей организации потоков, планирования и управления памятью.The different models for threading, scheduling, and memory management present an integration challenge for a relational database management system (RDBMS) that scales to support thousands of concurrent user sessions. Создаваемая архитектура должна гарантировать, чтобы на масштабируемость системы не оказывал отрицательное влияние непосредственный вызов в пользовательском коде прикладных программных интерфейсов (API) в целях применения базовых функций управления потоками, памятью и синхронизацией.The architecture should ensure that the scalability of the system is not compromised by user code calling application programming interfaces (APIs) for threading, memory, and synchronization primitives directly.

БезопасностьSecurity

Пользовательский код, выполняемый в базе данных, должен соответствовать правилам проверки подлинности и авторизации SQL ServerSQL Server при доступе к таким объектам базы данных, как таблицы и столбцы.User code running in the database must follow SQL ServerSQL Server authentication and authorization rules when accessing database objects such as tables and columns. Кроме того, администраторы баз данных должны иметь возможность управлять доступом к ресурсам операционной системы, таким как файлы и сетевой доступ, осуществляемым из пользовательского кода, который выполняется в базе данных.In addition, database administrators should be able to control access to operating system resources, such as files and network access, from user code running in the database. Это становится необходимым, поскольку управляемые языки программирования (в отличие от неуправляемых языков наподобие Transact-SQL), предоставляют API для доступа к таким ресурсам.This becomes important as managed programming languages (unlike non-managed languages such as Transact-SQL) provide APIs to access such resources. Система должна предоставить безопасный способ доступа пользовательского кода к ресурсам компьютера вне процесса компонента Компонент Database EngineDatabase Engine.The system must provide a secure way for user code to access machine resources outside the Компонент Database EngineDatabase Engine process. Дополнительные сведения см. в статье CLR Integration Security.For more information, see CLR Integration Security.

ПроизводительностьPerformance

Управляемый пользовательский код, выполняемый в компоненте Компонент Database EngineDatabase Engine, должен обеспечивать вычислительную производительность, сравнимую с выполнением того же кода вне сервера.Managed user code running in the Компонент Database EngineDatabase Engine should have computational performance comparable to the same code run outside the server. Доступ к базам данных из управляемого пользовательского кода осуществляется не так быстро, как из собственного кода Transact-SQLTransact-SQL.Database access from managed user code is not as fast as native Transact-SQLTransact-SQL. Дополнительные сведения см. в разделе производительность интеграции со средой CLR.For more information, see Performance of CLR Integration.

Службы CLRCLR Services

Среда CLR предоставляет ряд служб, чтобы облегчить достижение целей проектирования для интеграции среды CLR с SQL ServerSQL Server.The CLR provides a number of services to help achieve the design goals of CLR integration with SQL ServerSQL Server.

Проверка безопасности типовType safety verification

Типизированный код — это код, который обращается к структурам памяти только строго определенными способами.Type-safe code is code that accesses memory structures only in well-defined ways. Например, при наличии допустимой ссылки на объект типизированный код может обращаться к памяти с фиксированными смещениями, соответствующими фактическим полям элементов.For example, given a valid object reference, type-safe code can access memory at fixed offsets corresponding to actual field members. Но если код обращается к памяти с произвольными смещениями внутри и вне области памяти, которая принадлежит к объекту, то код нетипизированный.However, if the code accesses memory at arbitrary offsets inside or outside the range of memory that belongs to the object, then it is not type-safe. Если выполняется загрузка сборок в среду CLR до компиляции MSIL с использованием JIT-компиляции, то на этапе проверки во время выполнения код анализируется, чтобы можно было определить безопасность типов.When assemblies are loaded in the CLR, prior to the MSIL being compiled using just-in-time (JIT) compilation, the runtime performs a verification phase that examines code to determine its type-safety. Код, успешно прошедший эту проверку, называется «проверяемым типизированным кодом».Code that successfully passes this verification is called verifiably type-safe code.

Домены приложенийApplication domains

Среда CLR поддерживает понятие доменов приложений как зон выполнения внутри основного процесса, в который можно загрузить и выполнить сборки управляемого кода.The CLR supports the notion of application domains as execution zones within a host process where managed code assemblies can be loaded and executed. Граница домена приложения обеспечивает изоляцию между сборками.The application domain boundary provides isolation between assemblies. Сборки изолированы с точки зрения видимости статических переменных и элементов данных, а также возможности динамического вызова кода.The assemblies are isolated in terms of visibility of static variables and data members and the ability to call code dynamically. Домены приложений также обеспечивают механизм для загрузки и выгрузки кода.Application domains are also the mechanism for loading and unloading code. Код можно выгрузить из памяти, только выгрузив домен приложения.Code can be unloaded from memory only by unloading the application domain. Дополнительные сведения см. в разделе домены приложений и безопасность интеграции CLR.For more information, see Application Domains and CLR Integration Security.

Управление доступом для кода (CAS)Code Access Security (CAS)

Система безопасности CLR обеспечивает способ выбора типа операций, которые могут быть выполнены управляемым кодом, назначая разрешения коду.The CLR security system provides a way to control what kinds of operations managed code can perform by assigning permissions to code. Разрешения доступа для кода назначаются на основе удостоверения кода (например, подпись сборки или происхождение кода).Code access permissions are assigned based on code identity (for example, the signature of the assembly or the origin of the code).

Среда CLR обеспечивает применение политики уровня компьютера, которую может назначить администратор компьютера.The CLR provides for a computer-wide policy that can be set by the computer administrator. Эта политика предоставляет разрешения для любого управляемого кода, выполняемого на компьютере.This policy defines the permission grants for any managed code running on the machine. Кроме того, существует политика безопасности на уровне узла, которую можно использовать на таких узлах, как SQL ServerSQL Server, чтобы указать дополнительные ограничения для управляемого кода.In addition, there is a host-level security policy that can be used by hosts such as SQL ServerSQL Server to specify additional restrictions on managed code.

Если управляемый API на платформе .NET Framework предоставляет операции над ресурсами, защищенные набором разрешений на доступ к коду, то API потребует разрешение перед доступом к ресурсу.If a managed API in the .NET Framework exposes operations on resources that are protected by a code access permission, the API will demand that permission before accessing the resource. В силу этого требования система безопасности CLR запускает исчерпывающую проверку каждого блока кода (сборки) в стеке вызова.This demand causes the CLR security system to trigger a comprehensive check of every unit of code (assembly) in the call stack. Только если вся цепочка вызовов имеет разрешение, будет предоставлен доступ к ресурсу.Only if the entire call chain has permission will access to the resource be granted.

Обратите внимание, что возможность динамического создания управляемого кода с использованием API Reflection.Emit в среде размещения CLR в SQL ServerSQL Server не поддерживается.Note that the ability to generate managed code dynamically, using the Reflection.Emit API, is not supported inside the CLR-hosted environment in SQL ServerSQL Server. Такой код не будет иметь разрешений CAS для выполнения и поэтому завершится неудачей во время выполнения.Such code would not have the CAS permissions to run and would therefore fail at run time. Дополнительные сведения см. в разделе CLR Integration Code Access Security.For more information, see CLR Integration Code Access Security.

Атрибуты защиты узла (HPA)Host Protection Attributes (HPAs)

Среда CLR обеспечивает механизм для аннотирования управляемых API, которые являются частью платформы .NET Framework с определенными атрибутами, которые могут представлять интерес для узла CLR.The CLR provides a mechanism to annotate managed APIs that are part of the .NET Framework with certain attributes that may be of interest to a host of the CLR. Примеры таких атрибутов включают следующее.Examples of such attributes include:

  • SharedState, который указывает, обеспечивает ли API возможность создавать или управлять общим состоянием (например, статическими полями классов).SharedState, which indicates whether the API exposes the ability to create or manage shared state (for example, static class fields).

  • Synchronization, который указывает, обеспечивает ли API возможность выполнять синхронизацию между потоками.Synchronization, which indicates whether the API exposes the ability to perform synchronization between threads.

  • ExternalProcessMgmt, который указывает, предоставляет ли API возможность управлять основным процессом.ExternalProcessMgmt, which indicates whether the API exposes a way to control the host process.

С учетом этих атрибутов узел может указать список атрибутов защиты узла, таких как атрибут SharedState, которые должны быть запрещены в управляемой среде.Given these attributes, the host can specify a list of HPAs, such as the SharedState attribute, that should be disallowed in the hosted environment. В этом случае среда CLR запрещает попытки пользовательского кода, которые направлены на вызов API, внесенных атрибутами защиты узла в запрещенный список.In this case, the CLR denies attempts by user code to call APIs that are annotated by the HPAs in the prohibited list. Дополнительные сведения см. в разделе атрибуты защиты узла и программирование интеграции со средой CLR.For more information, see Host Protection Attributes and CLR Integration Programming.

Совместная работа SQL Server и среды CLRHow SQL Server and the CLR Work Together

В этом разделе описано, как SQL ServerSQL Server интегрирует модели организации потоков, планирования, синхронизации и управления памятью SQL ServerSQL Server и среды CLR.This section discusses how SQL ServerSQL Server integrates the threading, scheduling, synchronization, and memory management models of SQL ServerSQL Server and the CLR. В частности, в этом разделе интеграция рассматривается с позиций масштабируемости, надежности и безопасности.In particular, this section examines the integration in light of scalability, reliability, and security goals. В сущности, SQL ServerSQL Server выполняет функцию операционной системы для среды CLR при ее размещении в SQL ServerSQL Server.SQL ServerSQL Server essentially acts as the operating system for the CLR when it is hosted inside SQL ServerSQL Server. Среда CLR вызывает низкоуровневые программы, реализованные в SQL ServerSQL Server, для управления потоками, планированием, синхронизацией и памятью.The CLR calls low-level routines implemented by SQL ServerSQL Server for threading, scheduling, synchronization, and memory management. Это те же базовые функции, которые используются остальными компонентами механизма SQL ServerSQL Server.These are the same primitives that the rest of the SQL ServerSQL Server engine uses. Этот подход обеспечивает несколько преимуществ с точки зрения масштабируемости, надежности и безопасности.This approach provides several scalability, reliability, and security benefits.

Масштабируемость. Распространенные потоков, планирования и синхронизацииScalability: Common threading, scheduling, and synchronization

В среде CLR происходит вызов API SQL ServerSQL Server для создания потоков, как для выполнения пользовательского кода, так и для собственного внутреннего использования.CLR calls SQL ServerSQL Server APIs for creating threads, both for running user code and for its own internal use. Чтобы синхронизировать несколько потоков, среда CLR вызывает объекты синхронизации SQL ServerSQL Server.In order to synchronize between multiple threads, the CLR calls SQL ServerSQL Server synchronization objects. Это позволяет планировщику SQL ServerSQL Server запланировать другие задачи, когда поток ожидает объект синхронизации.This allows the SQL ServerSQL Server scheduler to schedule other tasks when a thread is waiting on a synchronization object. Например, когда среда CLR запускает сбор мусора, все потоки ожидают завершения сбора мусора.For example, when the CLR initiates garbage collection, all of its threads wait for garbage collection to finish. Потоки CLR и ожидаемые ими объекты синхронизации известны планировщику SQL ServerSQL Server, поэтому SQL ServerSQL Server может планировать потоки, которые выполняют другие задачи базы данных, не связанные со средой CLR.Because the CLR threads and the synchronization objects they are waiting on are known to the SQL ServerSQL Server scheduler, SQL ServerSQL Server can schedule threads that are running other database tasks not involving the CLR. Это также позволяет SQL ServerSQL Server обнаруживать взаимоблокировки с участием блокировок, установленных объектами синхронизации CLR, и использовать традиционные методы снятия взаимоблокировок.This also enables SQL ServerSQL Server to detect deadlocks that involve locks taken by CLR synchronization objects and employ traditional techniques for deadlock removal.

Управляемый код выполняется в SQL ServerSQL Server с приоритетным прерыванием.Managed code runs preemptively in SQL ServerSQL Server. Планировщик SQL ServerSQL Server обеспечивает обнаружение и останов потоков, не возвращающих управление в течение значительного времени.The SQL ServerSQL Server scheduler has the ability to detect and stop threads that have not yielded for a significant amount of time. Возможность связывания потоков CLR с потоками SQL ServerSQL Server обусловливает то, что планировщик SQL ServerSQL Server может определять вышедшие из-под контроля потоки в среде CLR и управлять их приоритетом.The ability to hook CLR threads to SQL ServerSQL Server threads implies that the SQL ServerSQL Server scheduler can identify "runaway" threads in the CLR and manage their priority. Такие вышедшие из-под контроля потоки приостанавливаются и возвращаются в очередь.Such runaway threads are suspended and put back in the queue. Потокам, которые были повторно обнаружены как вышедшие из-под контроля, запрещается выполняться в течение определенного периода времени, чтобы обеспечить выполнение других рабочих потоков.Threads that are repeatedly identified as runaway threads are not allowed to run for a given period of time so that other executing workers can run.

Примечание

Продолжительно выполняемый управляемый код, который обращается к данным или выделяет достаточно памяти, чтобы запустить сбор мусора, осуществляет возврат управления автоматически.Long-running managed code that accesses data or allocates enough memory to trigger garbage collection will yield automatically. Продолжительно выполняемый управляемый код, который не обращается к данным или не выделяет достаточно памяти, чтобы запустить сбор мусора, должен явно возвращать управление путем вызова функции System.Thread.Sleep() платформы .NET Framework.Long-running managed code that does not access data or allocate enough managed memory to trigger garbage collection should explicitly yield by calling the System.Thread.Sleep() function of the .NET Framework.

Масштабируемость. Совместное управление памятьюScalability: Common memory management

Среда CLR вызывает базовые функции SQL ServerSQL Server для выделения и отмены выделения памяти.The CLR calls SQL ServerSQL Server primitives for allocating and de-allocating its memory. Память, используемая средой CLR, учитывается в общем объеме использования памяти системы, поэтому SQL ServerSQL Server может оставаться в пределах памяти, заданных в конфигурации, и предотвращать конкуренцию за память между средой CLR и SQL ServerSQL Server.Because the memory used by the CLR is accounted for in the total memory usage of the system, SQL ServerSQL Server can stay within its configured memory limits and ensure the CLR and SQL ServerSQL Server are not competing with each other for memory. SQL ServerSQL Server может также отвергать запросы памяти от среды CLR при ограниченном объеме доступной системной памяти и запрашивать у среды CLR сокращение использования памяти, если память нужна другим задачам.can also reject CLR memory requests when system memory is constrained, and ask CLR to reduce its memory use when other tasks need memory.

Надежность. Домены приложений и Невосстанавливаемые исключенияReliability: Application domains and unrecoverable exceptions

Когда управляемый код в API .NET Framework встречает критические исключения, такие как нехватка памяти или переполнение стека, не всегда удается выполнить восстановление после отказа и обеспечить согласованную и правильную семантику для их реализации.When managed code in the .NET Framework APIs encounters critical exceptions, such as out-of-memory or stack overflow, it is not always possible to recover from such failures and ensure consistent and correct semantics for their implementation. Эти API активизируют исключение прерывания потока в ответ на такие отказы.These APIs raise a thread abort exception in response to these failures.

При размещении в SQL ServerSQL Server такие прерывания потока обрабатываются следующим образом: среда CLR обнаруживает любое общее состояние в домене приложения, в котором происходит прерывание потока.When hosted in SQL ServerSQL Server, such thread aborts are handled as follows: the CLR detects any shared state in the application domain in which the thread abort occurs. Для этого среда CLR проверяет присутствие объектов синхронизации.The CLR does this by checking for the presence of synchronization objects. Если в домене приложения имеется общее состояние, то выгружается сам домен приложения.If there is shared state in the application domain, then the application domain itself is unloaded. В результате выгрузки домена приложения останавливаются транзакции базы данных, выполняемые в это время в домене приложения.The unloading of the application domain stops database transactions that are currently running in that application domain. Поскольку присутствие общего состояния может увеличить влияние таких критических исключений на пользовательские сеансы, отличные от сеанса, вызвавшего исключение, в SQL ServerSQL Server и среде CLR приняты меры для уменьшения вероятности возникновения общего состояния.Because the presence of shared state can widen the impact of such critical exceptions to user sessions other than the one triggering the exception, SQL ServerSQL Server and the CLR have taken steps to reduce the likelihood of shared state. Дополнительные сведения см. в документации по .NET Framework.For more information, see the .NET Framework documentation.

Безопасность: Наборы разрешенийSecurity: Permission sets

SQL ServerSQL Server позволяет пользователям указывать требования к надежности и безопасности для кода, развернутого в базе данных.allows users to specify the reliability and security requirements for code deployed into the database. При загрузке сборок в базе данных, автор сборки можно указать один из трех наборов разрешений для этой сборки: SAFE, EXTERNAL_ACCESS и UNSAFE.When assemblies are uploaded into the database, the author of the assembly can specify one of three permission sets for that assembly: SAFE, EXTERNAL_ACCESS and UNSAFE.

Набор разрешенийPermission set SAFESAFE EXTERNAL_ACCESSEXTERNAL_ACCESS UNSAFEUNSAFE
Управление доступом для кодаCode Access Security Только выполнениеExecute only Выполнение и доступ к внешним ресурсамExecute + access to external resources Неограниченный доступUnrestricted
Ограничения модели программированияProgramming model restrictions ДаYes ДаYes Без ограниченийNo restrictions
Требование к проверяемостиVerifiability requirement ДаYes ДаYes НетNo
Возможность вызова машинного кодаAbility to call native code НетNo НетNo ДаYes

SAFE — самый надежный и безопасный режим с соответствующими ограничениями в отношении разрешенной программной модели.SAFE is the most reliable and secure mode with associated restrictions in terms of the allowed programming model. Сборки SAFE получают достаточные разрешения для запуска, выполнения вычислений и доступа к локальной базе данных.SAFE assemblies are given enough permission to run, perform computations, and have access to the local database. Сборки SAFE должны использовать безопасные типы с возможностью проверки этого факта; они также не могут вызывать неуправляемый код.SAFE assemblies need to be verifiably type safe and are not allowed to call unmanaged code.

Режим UNSAFE предназначен для кода с высоким уровнем доверия, который могут создавать только администраторы базы данных.UNSAFE is for highly trusted code that can only be created by database administrators. На этот доверенный код не налагаются ограничения управления доступом для кода, и он может вызывать неуправляемый (машинный) код.This trusted code has no code access security restrictions, and it can call unmanaged (native) code.

Режим EXTERNAL_ACCESS обеспечивает промежуточный уровень безопасности, в котором код может обращаться к ресурсам, внешним по отношению к базе данных, и при этом иметь гарантии надежности уровня SAFE.EXTERNAL_ACCESS provides an intermediate security option, allowing code to access resources external to the database but still having the reliability guarantees of SAFE.

SQL ServerSQL Server использует уровень политики CAS на уровне узла, чтобы установить политику узла, которая предоставляет один из трех наборов разрешений на основе набора разрешений, хранимого в каталогах SQL ServerSQL Server.uses the host-level CAS policy layer to set up a host policy that grants one of the three sets of permissions based on the permission set stored in SQL ServerSQL Server catalogs. Управляемый код, выполняемый внутри базы данных, всегда получает один из этих наборов разрешений доступа для кода.Managed code running inside the database always gets one of these code access permission sets.

Ограничения модели программированияProgramming Model Restrictions

Модель программирования для управляемого кода в SQL ServerSQL Server включает написание функций, процедур и типов, которые обычно не требуют использования общего состояния в нескольких вызовах или общего состояния нескольких пользовательских сеансов.The programming model for managed code in SQL ServerSQL Server involves writing functions, procedures, and types which typically do not require the use of state held across multiple invocations or the sharing of state across multiple user sessions. Кроме того, как было описано выше, наличие общего состояния может привести к критическим исключениям, которые влияют на масштабируемость и надежность приложения.Further, as described earlier, the presence of shared state can cause critical exceptions that impact the scalability and the reliability of the application.

С учетом этих факторов не рекомендуется использовать статические переменные и статические элементы данных классов, используемых в SQL ServerSQL Server.Given these considerations, we discourage the use of static variables and static data members of classes used in SQL ServerSQL Server. Для сборок SAFE и EXTERNAL_ACCESS в SQL ServerSQL Server анализируются метаданные сборки во время выполнения инструкции CREATE ASSEMBLY и отменяется создание таких сборок, если будет обнаружено использование статических элементов данных и переменных.For SAFE and EXTERNAL_ACCESS assemblies, SQL ServerSQL Server examines the metadata of the assembly at CREATE ASSEMBLY time and fails the creation of such assemblies if it finds the use of static data members and variables.

SQL ServerSQL Server запрещает также вызовы к API-интерфейсы .NET Framework, аннотированные SharedState, синхронизации и ExternalProcessMgmt атрибуты защиты ведущего приложения.also disallows calls to .NET Framework APIs that are annotated with the SharedState, Synchronization and ExternalProcessMgmt host protection attributes. Это не позволяет сборкам SAFE и EXTERNAL_ACCESS направлять вызовы к любым API, которые поддерживают общее состояние, выполнение синхронизации и влияют на целостность процесса SQL ServerSQL Server.This prevents SAFE and EXTERNAL_ACCESS assemblies from calling any APIs that enable sharing state, performing synchronization, and affecting the integrity of the SQL ServerSQL Server process. Дополнительные сведения см. в разделе ограничения модели программирования интеграции со средой CLR.For more information, see CLR Integration Programming Model Restrictions.

См. такжеSee Also

Безопасность интеграции со средой CLR CLR Integration Security
Производительность интеграции со средой CLRPerformance of CLR Integration