Открыть сервис

CLR-процедуры

CLR-процедуры (англ. Common Language Runtime procedures) — это хранимые процедуры в системах управления базами данных (СУБД), написанные на любом языке программирования, поддерживающем платформу .NET Framework (например, C#, Visual Basic .NET, F#), и выполняемые в среде исполнения Common Language Runtime (CLR). В отличие от традиционных хранимых процедур на языке Transact-SQL (T-SQL), которые интерпретируются и выполняются непосредственно ядром СУБД, CLR-процедуры компилируются в управляемый код (MSIL) и исполняются внутри процесса СУБД в изолированной среде CLR. Основной СУБД, поддерживающей CLR-процедуры, является Microsoft SQL Server (начиная с версии 2005), а также Azure SQL Database и некоторые другие реляционные СУБД, интегрированные с платформой .NET.

История

Появление CLR-процедур связано с развитием интеграции платформы .NET Framework в экосистему Microsoft SQL Server. До версии 2005 года единственным способом создания хранимых процедур, функций и триггеров был язык T-SQL, который, несмотря на свою мощь для работы с реляционными данными, имел ограничения в области сложных вычислений, обработки строк, работы с файловой системой, регулярными выражениями и другими задачами, выходящими за рамки чисто реляционной логики.

В 2002 году Microsoft анонсировала проект Yukon (кодовое имя SQL Server 2005), в котором была предусмотрена возможность размещения CLR-сборок внутри базы данных. Это позволило разработчикам использовать богатую библиотеку классов .NET Framework и знакомые языки программирования для создания серверной логики. Первая версия SQL Server 2005 (выпущена в ноябре 2005 года) включала полноценную поддержку CLR-интеграции. С тех пор эта функциональность развивалась: в последующих версиях (2008, 2008 R2, 2012, 2014, 2016, 2017, 2019, 2022) улучшалась производительность, безопасность и управляемость CLR-объектов.

Архитектура и принцип работы

CLR-процедуры выполняются в контексте процесса SQL Server (sqlservr.exe). Для этого внутри процесса запускается хост CLR, который управляет загрузкой, выполнением и выгрузкой сборок. Процесс взаимодействия включает несколько этапов:

  1. Создание сборки: Разработчик пишет код на C# или другом .NET-языке, компилирует его в библиотеку DLL (сборку .NET). Сборка содержит классы с методами, которые будут вызываться как хранимые процедуры.
  2. Регистрация сборки в SQL Server: Сборка загружается в базу данных с помощью команды CREATE ASSEMBLY. При этом SQL Server проверяет подпись сборки (если она подписана) и определяет уровень безопасности.
  3. Создание процедуры: С помощью команды CREATE PROCEDURE создаётся объект базы данных, который ссылается на метод в зарегистрированной сборке. Указывается имя сборки, имя класса и имя метода.
  4. Выполнение: При вызове CLR-процедуры (например, через EXEC или из приложения) SQL Server передаёт управление хосту CLR. Хост загружает соответствующую сборку (если она ещё не загружена), создаёт экземпляр класса и вызывает указанный метод. Код выполняется в управляемой среде с доступом к контексту соединения, транзакциям и другим объектам SQL Server.
  5. Возврат результатов: Метод может возвращать результирующие наборы (через объект SqlContext.Pipe.Send()), скалярные значения или выходные параметры.

Уровни безопасности (Permission Set)

При регистрации сборки указывается один из трёх уровней разрешений, определяющих, какие действия может выполнять код:

Преимущества и недостатки

Преимущества

Недостатки

Применение

CLR-процедуры применяются в следующих сценариях:

Пример

Ниже приведён упрощённый пример создания CLR-процедуры на C#, которая возвращает сумму двух целых чисел.

Код на C# (библиотека классов):

```csharp using System.Data.SqlTypes; using Microsoft.SqlServer.Server;

public class StoredProcedures { [SqlProcedure] public static SqlInt32 AddNumbers(SqlInt32 a, SqlInt32 b) { return a + b; } } ```

Регистрация и создание процедуры в SQL Server:

```sql -- 1. Включить интеграцию с CLR (если отключена) EXEC sp_configure 'clr enabled', 1; RECONFIGURE;

-- 2. Создать сборку из DLL CREATE ASSEMBLY MyClrAssembly FROM 'C:\Path\To\MyAssembly.dll' WITH PERMISSION_SET = SAFE;

-- 3. Создать хранимую процедуру, ссылающуюся на метод CREATE PROCEDURE AddNumbers @a INT, @b INT AS EXTERNAL NAME MyClrAssembly.StoredProcedures.AddNumbers;

-- 4. Вызов процедуры EXEC AddNumbers 5, 7; -- Результат: 12 ```

Критика и ограничения

Несмотря на преимущества, CLR-интеграция подвергается критике по нескольким причинам. Во-первых, она увеличивает сложность администрирования базы данных, требуя от администраторов понимания .NET-среды. Во-вторых, неправильное использование (особенно с уровнем UNSAFE) может привести к серьёзным проблемам с производительностью и стабильностью сервера. В-третьих, с развитием самого T-SQL (появление функций работы с JSON, оконных функций, улучшенной обработки строк) многие задачи, ранее решавшиеся только через CLR, теперь могут быть реализованы на чистом T-SQL. В связи с этим в некоторых сообществах и организациях рекомендуется по возможности избегать CLR-процедур и отдавать предпочтение нативным средствам СУБД.

Источники

  1. Microsoft Docs. "CLR Integration in SQL Server".
  2. Microsoft Docs. "CREATE ASSEMBLY (Transact-SQL)".
  3. Microsoft Docs. "CREATE PROCEDURE (Transact-SQL)".
  4. MSDN Magazine. "CLR Integration in SQL Server 2005".
  5. Itzik Ben-Gan, Dejan Sarka, Roger Wolter. "Inside Microsoft SQL Server 2005: T-SQL Querying".

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →