Хранимые процедуры и ColdFusion MX
Большинство ColdFusion приложений ориентированы на базы данных. Эффективность и безопасность CF приложений зависит от того, на сколько эффективны и безопасны обращения к базе данных. Достичь этого помогают хранимые процедуры. В оригинальной статье приводятся примеры использования хранимых процедур в Oracle, MS SQL Server и MS Access, но поскольку мне знаком только MS SQL Server и я не могу говорить о том, чего не знаю, то в данной статье речь пойдет только о MS SQL Server.
Что такое хранимые процедуры?
Хранимая процедура - это набор SQL-инструкций, которые под определенным названием хранятся в базе данных в откомпилированном виде, и которые можно использовать в нескольких приложениях.
В хранимых процедурах могут быть не только выражения Select, Insert, Update и Delete, но и инкапсулированный процедурный код. Именно откомпилированные и инкапсулированные процедуры могут предоставлять более эффективный и безопасный доступ к данным.
Каждый раз, когда вы осуществляете запрос к базе данных, база данных проделывает два действия: компилирует выражение запроса, выполняет его. В процессе компиляции происходит отдельный анализ: определение таблиц и связей между ними, определение используемых индексов и когда объединять и фильтровать набор записей. Например посмотрите на Рисунке 1 план обработки выражения:
Рисунок 1. План обработки SQL-выражения.
Этот план выполнения запроса показывает простой запрос, который объединят данные из 5 таблиц, используя внешние объединения (outer join). При вызове такого запроса с помощью тега <cfquery>, он каждый раз будет компилироваться по новому. Хранимая процедура хранится уже в откомпилированном виде, что дает значительный прирост производительности.
Явные преимущества использования хранимых процедур:
- Упрощается CFML код: вместо использования в ваших приложениях больших запросов, достаточно создать запрос к хранимой процедуре.
- Позволяет держать сам SQL запрос в центральном месте - в базе данных: поскольку запрос хранится только в одной хранимой процедуре, то его легче редактировать и оптимизировать.
- Предоставляет большую безопасность: связь между хранимыми процедурами и безопасностью не всегда очевидна. Хранимой процедуре необходимо четко указывать тип входных и выходных параметров, что ограничивает возможные действия по отношению к базе данных.
Если в вашем приложении все запросы к базе данных происходят только с помощью хранимых процедур, то вы можете ограничить доступ к данному источнику данных. Это можно сделать в Административной оболочке ColdFusion сервера. В расширенных свойствах источника данных следует указать в пункте Allowed SQL, что с помощью данного источника данных можно выполнять только хранимые процедуры.
Подготовимся к выполнению практических упражнений
Этот SQL крипт поможет вам создать в своем MS SQL Server'е таблицы с данными, необходимые для выполнения практического упражнения:
Создайте тестовую базу данных, а в ней, с помощью Query Analyzer'а, создайте таблицы с данными, запустив в нем этот скрипт.
Затем в Административной оболочке ColdFusion сервера создайте источник данных для только что созданной базы данных и назовите его 'sqltst'.
Добавляем данные в базу данных с помощью хранимой процедуры
В первом примере мы создам хранимую процедуру, которая будет вставлять новую запись в таблицу 'Books' (Рисунок 2).
Рисунок 2. Таблица 'Books'.
Хранимая процедура будет принимать три параметра, а возвращать один - значение поля BookID только что добавленной записи. Вот код этой хранимой процедуры:
Вы легко можете выполнить эту хранимую процедуру, воспользовавшись Query Analyzer'ом, но нам нужно сделать это с помощью ColdFusion. Следовательно, нужный нам CFML код будет выглядеть так:
Для вызова хранимой процедуры мы используем два CFML тега: <cfstoredproc> и <cfprocparam>. Тег <cfstoredproc> создает запрос к базе данных и как минимум требует два атрибута: procedure - имя используемой процедуры, и datasource - источник данных.
Тег <cfprocparam> используется для того, чтобы передавать значения в хранимую процедуру, а также обозначать переменные, которые будут содержать значения возвращаемых данных.
В приведенном выше примере мы использовали атрибут dbvarname для того, чтобы обозначить параметры по их имени, а не по позиции. Иными словами, если мы хотим передавать параметры в хранимую процедуру в той последовательности как они провозглашаются в самой хранимой процедуре, то атрибут dbvarname использовать не нужно, и наоборот.
Атрибут cfsqltype всегда обязателен и указывает тип передаваемого или получаемого параметра. Если вы хотите передать параметр, равный определенному значению, то это значение следует указать в атрибуте value. А если вам нужно передать параметр, равный значению null, то следует указать атрибут null="yes" и значение атрибута value (если оно указано) будет проигнорировано.
Для выходного параметра мы снова используем тег <cfprocparam>, указав атрибут type="out", а также имя получаемой переменной через атрибут variable. Если параметр одновременно является входным и выходным, то следует указать type="inout". Чтобы узнать больше о тегах <cfstoredproc> и <cfprocparam>, посмотрите документацию по CFML.
Получаем из базы данных набор записей
Хранимые процедуры могут возвращать не только один параметр, но и целый набор записей. Вот пример процедуры, которая принимает один параметр - примерное название книги, и возвращает информацию о тех книгах, в которых встречается указанное название:
CREATE PROCEDURE sp_Search_By_Title (
@arg_Title VARCHAR(255))
as
BEGIN
SELECT
BookID,
Title,
Price,
PublishDate
FROM
Books
WHERE
Title LIKE '%' + @arg_Title + '%';
END;
CFML код, запрашивающий данную процедуру, будет выглядеть так:
На Рисунке 3 вы можете посмотреть результат поиска.
Рисунок 3. Результат поиска, полученный из хранимой процедуры.
Имя возвращаемого набора записей мы указываем в теге <cfprocresult>. Поскольку хранимая процедура может возвращать несколько наборов записей, то, соответственно, мы можем использовать несколько тегов <cfprocresult>, указывая в них разные имена наборов записей и нумеруя их атрибутом resultset в той последовательности, как они возвращаются из процедуры.
Заключение
В этой статье рассмотрены только основные понятия работы с хранимыми процедурами в MS SQL Server. Обратившись к документации по программированию хранимых процедур, вы узнаете, как можно усложнить их, получив взамен больше эффективности и безопасности ваших приложений.
По материалам статьи: Learning Stored Procedure Basics in ColdFusion MX
© 2002-2005 г. Вадим Пушкарев