Команды разработчиков SQL Server и .NET Framework пять лет трудились не покладая рук и использовали всевозможные накопленные за эти годы ценные наработки, чтобы явить компьютерному миру нечто новое в области разработки в SQL Server 2005. Новшества сосредоточены в нескольких ключевых областях: разработка объектов баз данных с использованием языка Common Language Runtime (далее CLR), улучшение языка запросов T-SQL, подсистемы, расширяющие возможности разработки приложений, и разработка клиентских приложений.

Объекты базы данных CLR

Возможно, наиболее значимое новшество в SQL Server 2005 — это интеграция CLR с SQL Server, развивающая возможности серверных программных продуктов в нескольких направлениях. Интеграция наделила сервер способностью создавать объекты базы данных, используя современные объектно-ориентированные языки вроде VB.NET и C#. К таким объектам относятся: хранимые процедуры, триггеры, определяемые пользователем функции и определяемые пользователем типы, поддерживающие сложную логику и обращение к внешним системным ресурсам с помощью .NET Framework.

Для создания объектов CLR базы данных нужно написать управляемый код и откомпилировать его в сборку .NET. Microsoft Visual Studio 2005 Professional Edition и более поздние редакции предусматривают новый набор шаблонов для проектов баз данных, предназначенных для помощи в создании объектов.

Поскольку объекты базы данных CLR имеют возможность обращаться к ресурсам за пределами сервера базы данных, компания Microsoft добавила в помощь разработчику новый набор разрешений для обеспечения защиты этих объектов. В табл. 1 суммируются детали этих разрешений. Кроме того, введена функция явного указания включения поддержки CLR (по умолчанию она выключена) с использованием свойства сервера clr enabled.

Новые объекты больше всего подходят для задач, требующих сложной логики. Они могут быть перенесены с уровня данных на уровень бизнес-приложений, что окажется полезным для тысяч существующих процедур в .NET Framework. Лучшее применение хранимых процедур CLR — это замена расширенных хранимых процедур. Ошибки в расширенных хранимых процедурах потенциально могут повлиять на механизм SQL Server, тогда как объекты CLR безопасны и содержатся в .NET CLR. В листинге 1 показана простая хранимая процедура CLR.

Совершенствование T-SQL

Добавление CLR не подразумевает, что компания Microsoft не намерена поддерживать язык T-SQL, который все еще является лучшим для работы с наборами данных. Компания Microsoft произвела множество усовершенствований в T-SQL, включая усовершенствования оператора TOP, поддержку общих табличных выражений (common table expressions, CTE), новые операторы PIVOT и UNPIVOT, дополнение языка Data Definition Language (далее DDL) триггерами и новой структурой для обработки ошибок TRY-CATCH.

Усовершенствованный оператор TOP. SQL Server 2000 был ограничен в использовании постоянных величин в соединении с оператором TOP, а в SQL Server 2005 функция TOP поддерживает использование различных выражений. Теперь операторы INSERT, UPDATE и DELETE также поддерживают оператор TOP. В следующем выражении показан пример, как в новом операторе TOP использовать переменную:

DECLARE @MyLimit INT
SET @MyLimit = 11
SELECT TOP (@MyLimit) CustomerID
FROM Sales.Customer

Поддержка CTE. CTE обеспечивает механизм обработки рекурсивных запросов (вкупе с рядом других механизмов), потому что CTE может обращаться к самой себе. Чтобы избежать последствий неправильно сконструированного рекурсивного запроса, способного привести к чрезмерному расходованию ресурсов системы, SQL Server обеспечивает ограничение на стороне сервера на максимальное количество разрешенных рекурсий; значение по умолчанию составляет 100 уровней. CTE выполняется как часть ключевого выражения WITH и может использоваться в предложениях SELECT, INSERT, UPDATE и DELETE. В листинге 2 показано типовое выражение, использующие синтаксис CTE для перечисления служащих с их должностями и руководителями.

Новые операторы. Новые операторы PIVOT и UNPIVOT наиболее полезны в сценариях OLAP, которые работают скорее с таблицами, чем с реляционными данными. Оператор PIVOT преобразует набор строк в набор столбцов, оператор UNPIVOT, напротив, превращает повернутые столбцы в строки. Пример предложения из листинга 3 показывает, как подсчитать суммы и продукты в пересчете на служащего для трех указанных EmployeeID.

Триггеры DDL. Ранние версии SQL Server позволяют использовать триггеры в предложениях языка Data Manipulation Language (DML), таких как INSERT, UPDATE и DELETE. SQL Server 2005 позволяет размещать DDL-триггеры на такие события, как создание и удаление объектов базы данных (например, таблиц, представлений, хранимых процедур). Можно использовать DDL-триггеры, чтобы наложить ограничения на тип операций DDL, которые могут выполняться над объектом базы данных или посылать уведомление при изменении схемы. DDL-триггеры связывают с предложениями CREATE, ALTER и DROP. Следующий пример демонстрирует, как можно задействовать DDL-триггеры, чтобы защитить таблицу от возможного удаления:

CREATE TRIGGER MyTable
ON DATABASE FOR DROP_TABLE
AS
PRINT 'DROP TABLE is not allowed'
ROLLBACK

Оператор TRY_CATCH. Новое предложение обработки ошибок TRY_CATCH позволяет обрабатывать ошибки, вызванные сбоем транзакции, без потерь контекста самой транзакции. SQL Server 2000 позволяет прервать транзакцию, но не позволяет сохранить ее контекст. Таким образом, полностью восстановить прерванную транзакцию программным путем нельзя. Новая обработка срыва транзакции в TRY_CATCH в SQL Server 2005 позволяет сохранить полный контекст прерванной транзакции через функцию пересоздания транзакции. Ниже приведен пример использования предложения TRY_CATCH:

BEGIN TRY

END TRY
BEGIN CATCH TRAN_ABORT

END CATCH

Новые и усовершенствованные подсистемы

Поддержка языка XML в качестве стандарта — другое важное усовершенствование. SQL Server 2005 обеспечивает такую поддержку через новый XML-тип данных и Web-службы. Другие изменения в подсистемах, участвующих в разработке, обнаруживаются в SQL Server Service Broker и Notification Services.

XML и Web-службы. SQL Server 2005 обеспечивает новый тип унифицированного хранилища для XML и реляционных данных с помощью встроенного типа данных XML. Этот тип данных обеспечивает поддержку запросов на XML и строгую типизацию данных привязкой типа данных XML к описаниям схем XML Schema Definition (XSD). Поддержка XML тесно интегрирована с механизмом реляционной базы данных SQL Server 2005 и обеспечивает поддержку триггеров и репликаций, операций массовой загрузки и индексирования XML-данных, содержащихся в типе данных XML.

Можно использовать тип данных XML как столбец в таблице либо как переменную или параметр в хранимой процедуре. Можно задействовать этот тип для хранения как типизированных, так и нетипизированных данных. Когда данные хранятся в столбце XML и не имеют никакой схемы XSD, они рассматриваются как нетипизированные. При наличии связанной схемы XSD, SQL Server будет проверять эту схему, дабы убедиться, что хранящиеся данные собираются в соответствии с ней. В любом случае SQL Server 2005 проверяет данные, хранящиеся в типе данных XML для проверки того, что документ XML сформирован правильно. Если данные сформированы неправильно, SQL Server сообщит об ошибке и не будет сохранять эти данные. Следующий пример показывает, как создать таблицу, использующую тип данных XML:

CREATE TABLE XmlData(
XmlID int NOT NULL,
XmlData xml NOT NULL)

Тип данных XML поддерживает максимальный размер в 2 Гбайт, как и тип BLOB. Размер данных и их использование могут оказывать заметное влияние на производительность, с которой система сможет обрабатывать запросы к данным XML. Для улучшения производительности выполнения запросов по данным XML, SQL Server 2005 позволяет создавать индексы по столбцам, имеющим тип данных XML (хотя для таблицы должен существовать кластеризованный первичный ключ). Кроме того, оператор OPENXML, который обеспечивает представление по набору строк для документа XML, был доработан с целью поддержки новых типов XML-данных.

T-SQL в SQL Server 2005 также поддерживает подмножество языка запросов XQuery, который основан на стандартном языке запросов XPath и используется для запросов к структурированным или полуструктурированным данным XML. Можно комбинировать язык XQuery с T-SQL и делать запросы к данным XML-типа. Следующий пример избирательно восстанавливает содержимое XML-переменной:

DECLARE @x xml
SET @x = '111
2'
SELECT @x.query('/ROOT/ID2')

Другое важное новое свойство, связанное с XML, - это поддержка протокола HTTP Simple Object Access Protocol (SOAP). Данное свойство позволяет серверу напрямую отвечать на запрос HTTP SOAP, выдаваемый Web-службой без посредничества системы Microsoft IIS. Можно использовать эту встроенную поддержку HTTP SOAP для создания Web-служб, которые выполняются на SQL Server 2005 и могут запускать пакетные файлы T-SQL, хранимые процедуры и определяемые пользователям функции. Как и поддержка CLR, данная возможность из соображений безопасности по умолчанию выключена. Чтобы включить поддержку HTTP, нужно сначала создать конечную точку HTTP, как это сделано в коде листинга 4.

Service Broker. Полностью новая подсистема для разработки приложений Service Broker обеспечивает инфраструктуру для разработки распределенных асинхронных бизнес-приложений. Многие другие высокомасштабируемые приложения — подсистема ввода/вывода, Web-серверы, даже внутренние операции механизма SQL Server — поддерживают асинхронную организацию очереди. Такая поддержка — важное условие для масштабируемости, потому что она позволяет приложению отвечать на большее количество запросов, чем платформа физически способна обработать. Поддержка Service Broker работы с асинхронными очередями встроена непосредственно в механизм SQL Server и полностью транзакционна. Транзакции могут объединять поставленные в очередь события и могут быть подтверждены или отменены. Можно обращаться к Service Broker, используя набор новых операторов T-SQL, которые включают CREATE CONTRACT, CREATE QUEUE, CREATE MESSAGE TYPE, BEGIN DIALOG, SEND и RECEIVE.

Notification Services. Оповещения Notification Services были задуманы как загружаемое из Web дополнение для SQL Server 2000. Разработчики SQL Server 2005 включили эту службу в ядро. Служба оповещений позволяет строить бизнес-приложения с разнообразными уведомлениями, которые поставляются персонально и по расписанию — подобно извещениям на фондовой бирже, новостям по подписке, сообщениям о доставке посылок и ценах на авиабилеты, — на любое устройство. Это свойство программного уровня, которое соединяет источник информации (т. е. событие) и получателя этой информации. Приложения Notification Services состоят из трех основных компонентов: событий, подписок и уведомлений. Приложение отслеживает некоторые предопределенные события и может фильтровать и маршрутизировать информацию о событиях на разнообразные целевые устройства, используя персональный график доставки. Дополнительную информацию о службе извещений можно найти по адресу http://msdn.microsoft.com/sql/sqlwarehouse/ notificationservices/default.aspx.)

Разработка на клиентской стороне с помощью ADO.NET 2.0

SQL Server 2005 обеспечивает важные усовершенствования для кодирования на клиентской стороне посредством нового ADO.NET 2.0. Так как ADO.NET продолжает развиваться, мы наконец увидим свойства, которые отсутствовали в его более ранней версии. Дополнительно ADO.NET 2.0 включает несколько новых свойств, таких как поддержка асинхронных запросов, множественные активные результирующие наборы (multiple active result sets, MARS) и общая модель подключений.

Асинхронные запросы. Поддержка асинхронных запросов, построенная на COM, была реализована в ADO, но отсутствовала в более ранних версиях ADO.NET. Асинхронные запросы позволяют приложениям клиента выполнять запросы без блокировки приложений. Новый асинхронный ADO.NET поддерживается приложениями промежуточного уровня, позволяя приложениям на сервере выполнять многократные запросы к базе данных различными потоками без блокировки потоков. Реализация та же самая, что и в остальных асинхронных операциях в .NET Framework. Требуется запустить асинхронную операцию, используя в начале объектный метод BEGINxxx и в конце — метод ENDxxx. Для проверки состояния завершения команды следует использовать объект IAsyncResult. В листинге 5 показан пример асинхронной поддержки ADO.NET 2.0, которая также будет работать с более ранними версиями SQL Server, включая SQL Server 2000 и SQL Server 7.0.

MARS. Более ранние версии ADO.NET были ограничены одним активным результирующим набором на одно подключение. ADO и OLE DB, основанные на COM, имели свойство запуска дополнительных команд, которое допускало наличие в прикладном процессе многократных результирующих наборов, в действительности же просто скрывалось создание новых подключений для исполнения дополнительных команд. ADO.NET 2.0 поддерживает технологию MARS (которая работает только с SQL Server 2005), позволяя выполнять многократные активные команды по единственному подключению. MARS позволяет открывать соединение к базе данных, запускать первую команду и обрабатывать некоторые результаты, запускать вторую команду и обрабатывать результаты, затем возвращаться к первой команде и обрабатывать еще некоторое количество полученных данных, свободно переключаясь между запущенными командами. Никакой взаимоблокировки между командами нет, и обе они совместно используют единственное соединение с базой данных. Листинг 6 демонстрирует текст кода при использовании MARS.

Обычная модель подключения. Одна из проблем с ADO.NET 1.0 заключалась в необходимости использования особого провайдера для соединения с определенной платформой базы данных. Например, SqlClient может соединяться только с SQL Server, а не с Oracle. Аналогично, OracleClient может соединяться только с системами Oracle, но не с SQL Server. Хотя можно написать тест программы так, чтобы загружать различные провайдеры к базам данных по ходу работы, ADO.NET 2.0 решает эту проблему проще. В него добавлена новая функция Provider Factory, которая может подключить соответствующий провайдер по ходу выполнения. Новые классы Provider Factory находятся в пространстве имен System.Data.Common. Текст кода в листинге 7 демонстрирует пример, как использовать эти классы.

В ADO .NET 2.0.предусмотрено много важных моментов. Например, ADO.NET 2.0 поддерживает все новые типы данных SQL Server 2005, как и новую массовую загрузку данных Bulk Import и отказоустойчивость клиента. Более подробную информацию о новой версии можно найти по адресу http://msdn.microsoft.com/library/en-us/ dnvs05/html/ado2featurematrix.asp.

Привыкайте к лучшему

Все новые средства разработки SQL Server 2005 в одной статье охватить невозможно, мы рассмотрели только верхушку айсберга. Компания Microsoft также добавила в Analysis Services язык запросов XML/A, API управления System Management Objects (SMO) и оболочку написания сценариев SQL Server SQLCMD. Это только несколько примеров. Для получения дополнительной информации об SQL Server 2005 можно изучить сценарии, доступные по адресу http://www.microsoft.com/sql.

Майкл Оти - Старший технический редактор Windows IT Pro и президент компании TECA. С ним можно связаться по адресу: mikeo@teca.com