Общие сведения об интеграции со средой CLR

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

Среда CLR является сердцем платформы Microsoft .NET Framework и предоставляет среду выполнения для всего кода .NET Framework. Код, выполняемый в среде CLR, называется управляемым кодом. Среда CLR предоставляет различные функции и услуги, требуемые для выполнения программы, включая JIT-компиляцию, распределение и управление памятью, соблюдение безопасности типов, обработку исключений, управление потоками и безопасность. Дополнительные сведения см. в пакете .NET Framework SDK.

Если среда CLR размещается в Microsoft SQL Server (что принято называть интеграцией со средой CLR), то появляется возможность разрабатывать в управляемом коде хранимые процедуры, триггеры, определяемые пользователем функции, определяемые пользователем типы и определяемые пользователем статистические функции. Из-за того, что управляемый код перед выполнением производит компиляцию в машинный код, можно достичь значительного увеличения производительности в некоторых сценариях.

В управляемом коде используется управление доступом для кода (CAS) для предотвращения выполнения сборками определенных операций. В SQL Server используется CAS для обеспечения безопасности управляемого кода и предотвращения нарушений безопасности операционной системы или сервера баз данных.

Преимущества интеграции со средой CLR

Язык Transact-SQL специально разработан для непосредственного доступа и манипулирования данными в базе данных. Поскольку Transact-SQL предназначен в первую очередь для доступа к данным и управления ими, он не является полноценным языком программирования. Например, Transact-SQL не поддерживает массивы, коллекции, циклы for-each, сдвиг битов или классы. Безусловно, некоторые из этих конструкций можно моделировать в Transact-SQL, но в управляемом коде обеспечивается их встроенная поддержка. В зависимости от сценария эти средства могут стать убедительной причиной для внедрения в управляемый код определенных функциональных возможностей поддержки базы данных.

Microsoft Visual Basic .NET и Microsoft Visual C# предлагают объектно-ориентированные возможности, например инкапсуляцию, наследование и полиморфизм. Связанный код теперь можно легко организовать в классы и пространства имен. При работе с большими объемами серверного кода это позволяет упростить организацию и сохранение кода.

Управляемый код подходит для реализации вычислений и сложной логики выполнения больше, чем Transact-SQL, и обеспечивает расширенную поддержку многих сложных задач, включая обработку строк и регулярных выражений. С помощью функциональных возможностей, содержащихся в библиотеке .NET Framework, обеспечивается доступ к тысячам предварительно построенных классов и подпрограмм. К ним можно легко получить доступ из любой хранимой процедуры, триггера или определяемой пользователем функции. Базовая библиотека классов (BCL) включает классы, обеспечивающие функциональные возможности управления строками, выполнения сложных математических операций, доступа к файлам, шифрования и т. д.

Примечание

Хотя многие из этих классов могут быть использованы из кода CLR в SQL Server, те из них, которые не подходят для использования на сервере (например, классы для работы с окнами), недоступны. Дополнительные сведения см. в разделе Поддерживаемые библиотеки платформа .NET Framework.

Одним из преимуществ управляемого кода является безопасность типов, или гарантия того, что код обращается к типам только точно определенным, разрешенным способом. Перед выполнением управляемого кода среда CLR проверяет код на безопасность. Например, код проверяется для обеспечения того, что из памяти не будут считываться данные, если они не были предварительно записаны в нее. Среда CLR также гарантирует, что код не использует неуправляемую память.

Интеграция со средой CLR позволяет улучшить производительность. Дополнительные сведения см. в разделе Производительность интеграции со средой CLR.

Предупреждение

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

Выбор между Transact-SQL и управляемым кодом

При записи хранимых процедур, триггеров и определяемых пользователем функций следует принять решение, использовать ли традиционный язык Transact-SQL или язык платформы .NET Framework; например, Visual Basic .NET или Visual C#. Используйте Transact-SQL в тех случаях, когда код в основном выполняет доступ к данным с минимумом или совсем без процедурной логики. Управляемый код следует использовать для функций и процедур, интенсивно использующих ЦП, содержащих сложную логику, или при необходимости использования библиотеки BCL платформы .NET Framework.

Выбор между выполнением на сервере и выполнением на клиенте

Другим фактором при принятии решения о выборе между Transact-SQL или управляемым кодом является требуемое расположение кода на серверном или на клиентском компьютере. Код Transact-SQL, как и управляемый код, можно выполнять на сервере. Это позволяет упростить доступ к данным из кода и воспользоваться ресурсами обработки, имеющимися на сервере. С другой стороны, иногда приходится отказываться от размещения на сервере базы данных таких задач, которые интенсивно используют процессор. Современные клиентские компьютеры чаще всего являются очень мощными, поэтому может возникнуть необходимость воспользоваться их ресурсами обработки, разместив на клиенте максимально возможный объем кода. Управляемый код может выполняться на клиентском компьютере, а Transact-SQL — нет.

Выбор между расширенными хранимыми процедурами и управляемым кодом

Расширенные хранимые процедуры позволяют реализовать возможности, недоступные в хранимых процедурах Transact-SQL. Однако расширенные хранимые процедуры могут нарушить целостность процесса SQL Server, а управляемый код, проверенный на строгую типизацию, — нет. Далее, управление памятью, планирование потоков и волокон, а также службы Synchronization Services более тесно интегрированы между управляемым кодом среды CLR и SQL Server. Интеграция со средой CLR обеспечивает более защищенный по сравнению с расширенными хранимыми процедурами способ создания хранимых процедур при необходимости выполнения задач, недоступных для Transact-SQL. Дополнительные сведения об интеграции со средой CLR и расширенных хранимых процедурах см. в разделе Производительность интеграции со средой CLR.

См. также:

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