Общие сведения об интеграции со средой CLR
Область применения: SQL Server Управляемый экземпляр SQL Azure
Среда CLR является сердцем платформы Microsoft .NET Framework и предоставляет среду выполнения для всего кода .NET Framework. Код, который выполняется в среде CLR, называется управляемым кодом. Среда CLR предоставляет различные функции и услуги, требуемые для выполнения программы, включая JIT-компиляцию, распределение и управление памятью, соблюдение безопасности типов, обработку исключений, управление потоками и безопасность. Дополнительные сведения см. в руководстве по разработке платформа .NET Framework.
Примечание.
Дополнительные сведения об использовании нового .NET с расширениями языка SQL Server см. в статье "Как вызвать среду выполнения .NET в расширениях языка SQL Server".
С помощью среды CLR, размещенной в SQL Server (называемой интеграцией CLR), вы можете создавать хранимые процедуры, триггеры, определяемые пользователем функции, определяемые пользователем типы и определяемые пользователем агрегаты в управляемом коде. Так как управляемый код компилируется в машинный код перед выполнением, вы можете добиться значительного увеличения производительности в некоторых сценариях.
Управление доступом для кода
В SQL Server 2016 (13.x) и более ранних версиях безопасность доступа к коду (CAS) не позволило сборкам выполнять определенные операции.
Среда CLR использует управление доступом для кода (CAS) в .NET Framework, которое больше не поддерживается в качестве границы безопасности. Сборка СРЕДЫ CLR, созданная с PERMISSION_SET = SAFE
возможностью доступа к ресурсам внешней системы, вызову неуправляемого кода и получению привилегий sysadmin. В SQL Server 2017 (14.x) и более поздних версиях sp_configure
параметр, clr strict security, повышает безопасность сборок СРЕДЫ CLR. clr strict security
включен по умолчанию и рассматривает сборки SAFE
и EXTERNAL_ACCESS
, как если бы они были помечены UNSAFE
. Параметр clr strict security
можно отключить для обратной совместимости, но не рекомендуется.
Рекомендуется подписать все сборки сертификатом или асимметричным ключом с соответствующим именем входа, предоставленным UNSAFE ASSEMBLY
в master
базе данных. Администраторы SQL Server также могут добавлять сборки в список сборок, которым должен доверять ядро СУБД. Дополнительные сведения см. в разделе sys.sp_add_trusted_assembly.
Преимущества интеграции СРЕДЫ CLR
Transact-SQL предназначен для прямого доступа к данным и манипуляции в базе данных. Хотя Transact-SQL преуспевает в доступе к данным и управлении, это не полнофункциональный язык программирования. Например, Transact-SQL не поддерживает массивы, коллекции, циклы для каждого цикла, битовую смену или классы. Хотя некоторые из этих конструкций можно имитировать в Transact-SQL, управляемый код имеет встроенную поддержку этих конструкций. В зависимости от сценария эти средства могут стать убедительной причиной для внедрения в управляемый код определенных функциональных возможностей поддержки базы данных.
Visual Basic и C# предлагают объектно ориентированные возможности, такие как инкапсуляция, наследование и полиморфизм. Связанный код теперь можно легко организовать в классы и пространства имен. При работе с большим количеством кода сервера эти возможности позволяют более легко упорядочивать и поддерживать код.
Управляемый код лучше подходит, чем Transact-SQL для вычислений и сложной логики выполнения, и предоставляет обширную поддержку для многих сложных задач, включая обработку строк и регулярные выражения. Благодаря функциональным возможностям, найденным в библиотеке платформа .NET Framework, у вас есть доступ к тысячам предварительно созданных классов и подпрограмм. К этим классам можно легко обращаться из любой хранимой процедуры, триггера или определяемой пользователем функции. Библиотека базовых классов (BCL) включает классы, которые предоставляют функциональные возможности для обработки строк, расширенных математических операций, доступа к файлам, шифрования и т. д.
Примечание.
Хотя многие из этих классов доступны в коде СРЕДЫ CLR в SQL Server, они не подходят для использования на стороне сервера (например, классов окон), недоступны. Дополнительные сведения см. в статье "Поддерживаемые библиотеки платформа .NET Framework".
Одним из преимуществ управляемого кода является безопасность типов, или гарантия того, что код обращается к типам только точно определенным, разрешенным способом. Перед выполнением управляемого кода среда CLR проверяет код на безопасность. Например, код проверяется, чтобы не было прочитано памяти, которая не была записана ранее. Среда CLR также может помочь убедиться, что код не управляет неуправляемой памятью.
Интеграция со средой CLR позволяет улучшить производительность. Дополнительные сведения см. в разделе "Производительность архитектуры интеграции СРЕДЫ CLR".
Выбор между Transact-SQL и управляемым кодом
При написании хранимых процедур, триггеров и определяемых пользователем функций необходимо решить, следует ли использовать традиционный язык Transact-SQL или язык платформа .NET Framework, например Visual Basic или C#. Используйте Transact-SQL, если код в основном выполняет доступ к данным с небольшим или без процедурной логики. Управляемый код следует использовать для функций и процедур, интенсивно использующих ЦП, содержащих сложную логику, или при необходимости использования библиотеки BCL платформы .NET Framework.
Выбор между выполнением на сервере и выполнением в клиенте
Другой фактор в решении о том, следует ли использовать Transact-SQL или управляемый код, заключается в том, где должен находиться код, серверный компьютер или клиентский компьютер. На сервере можно запускать как Transact-SQL, так и управляемый код. Это позволяет упростить доступ к данным из кода и воспользоваться ресурсами обработки, имеющимися на сервере. С другой стороны, может потребоваться избежать размещения интенсивных задач процессора на сервере базы данных. Большинство клиентских компьютеров сегодня мощны, и вы можете воспользоваться этой мощностью обработки, поместив максимально возможный код на клиент. Управляемый код может выполняться на клиентском компьютере, а Transact-SQL не может.
Выбор между расширенными хранимыми процедурами и управляемым кодом
Расширенные хранимые процедуры можно создать для выполнения функциональных возможностей с помощью хранимых процедур Transact-SQL. Однако расширенные хранимые процедуры могут компрометировать целостность процесса SQL Server, а управляемый код, проверенный как типобезопасный, не может. Кроме того, управление памятью, планирование потоков и волокон и службы синхронизации более глубоко интегрированы между управляемым кодом среды CLR и SQL Server. Интеграция СРЕДЫ CLR обеспечивает более безопасный способ, чем расширенные хранимые процедуры для записи хранимых процедур, необходимых для выполнения задач в Transact-SQL. Дополнительные сведения об интеграции среды CLR и расширенных хранимых процедурах см. в разделе "Производительность архитектуры интеграции СРЕДЫ CLR".