Понятие хранимой процедуры

advertisement
Лекция 5. Вспомогательные объекты базы данных
В лекции рассматриваются часто используемые объекты в базах
данных: хранимые процедуры и представления. Демонстрируется создание и
управление этими объектами при помощи команд SQL.
Цель: сформировать понятие о назначении хранимых процедур и
представлений.
Понятие хранимой процедуры
Хранимая процедура (Stored procedure) – это именованный набор
операторов Transact-SQL, хранящийся на сервере.
Организация взаимодействия между клиентом и сервером с помощью
хранимых процедур предполагает следующее: клиент по известному имени
вызывает блок команд, хранящийся на сервере базы данных, сервер
выполняет этот блок команд и возвращает клиенту результат. Таким образом,
использование хранимых процедур снижает сетевой трафик и сокращает
число запросов клиентов, т.к. вместо пересылки по сети нескольких
операторов передается лишь имя вызываемой процедуры.
Хранимые процедуры являются самостоятельными объектами базы
данных, к которым можно разрешать или запрещать доступ командами
GRANT и DENY. Например, выполнение следующей команды запретит
выполнение команд хранимой процедуры hello для пользователя mng:
DENY exec ON hello TO mng.
Хранимые процедуры схожи с процедурами других языков
программирования и позволяют:
 включать различные операторы и вызывать другие хранимые
процедуры;
 принимать входные параметры и возвращать значения в виде
выходных параметров.
MS SQL Server поддерживает следующие виды хранимых процедур:
 системные процедуры – хранятся в системной базе данных master,
их имена начинаются с символов sp_. Используются для решения
специализированных системных задач: администрирования, безопасности и
др.;
1
 пользовательские процедуры – создаются, хранятся и выполняются
пользователями в контексте только той базы данных, для которой были
созданы;
 временные процедуры – доступны только в активном соединении,
после закрытия соединения удаляются автоматически. Имена таких процедур
должны начинаться с символа #.
Для работы с хранимыми процедурами предназначены системные
хранимые процедуры:
 sp_helptext ИмяПроцедуры – выводит код указанной хранимой
процедуры;
 sp_help ИмяПроцедуры – выводит список параметров и их типов
данных для указанной процедуры;
 sp_stored_procedures – возвращает список сохраненных процедур
текущей базы данных.
Как и большинство объектов MS SQL Server хранимая процедура
может быть создана с помощью средств Transact-SQL или с применением
графического интерфейса Management Studio.
При создании хранимой процедуры необходимо учитывать следующие
особенности:
 процедура может содержать неограниченно количество операторов,
кроме операторов создания следующих объектов: процедуры, представления,
правила, умолчания;
 создание процедуры может выполнить пользователь роли sysadmin,
db_owner или db_ddladmin, а также имеющий право на выполнение команды
CREATE PROC;
 количество параметров не должно превышать 2100.
Создание процедуры средствами Transact-SQL
Создание хранимой процедуры заключается в выполнении следующей
команды:
CREATE PROCEDURE|PROC <sproc name>
[<parameter name> [<schema>.]<data type> [VARYING]
[= <default value>] [OUT[PUT]] [READONLY]
[, n...]
[WITH
2
RECOMPILE| ENCRYPTION | [EXECUTE AS { CALLER|SELF|OWNER|’<user
name>’}]
[FOR REPLICATION]
AS
<code> | EXTERNAL NAME <assembly name>.<assembly class>.<method>
 Имя процедуры должно удовлетворять правилам именования
объектов MS SQL Server;
 parameter name определяет имя параметра (должно начинаться с
символа @), который будет использоваться для передачи входных или
выходных данных (при указании ключевого слова OUTPUT);
 data type указывает, к какому типу данных должны относиться
значения параметра;
 default value – позволяет определить значение по умолчанию, если
при вызове процедуры параметр был не указан;
 опция READONLY создает параметр доступный только для чтения,
если параметр имеет тип table, то указание READONLY обязательно;
 режим WITH ENCRYPTION запрещает дальнейший просмотр кода
создаваемой хранимой процедуры, шифруя его;
 режим RECOMPILE указывает, что сервер не кэширует план
исполнения процедуры, и процедура компилируется только во время
выполнения.
После ключевого слова AS следуют или команды Transact-SQL,
которые и составляют тело процедуры, или прописывается метод из
указанной сборки .Net Framework.
Пример создания хранимой процедуры с шифрованием:
CREATE PROCEDURE HumanResources.uspEncryptThis
WITH ENCRYPTION
AS
SELECT BusinessEntityID, JobTitle, NationalIDNumber,
VacationHours, SickLeaveHours
FROM HumanResources.Employee;
Чтобы убедиться, что исходный текст процедуры недоступен, можно
выполнить следующий код:
EXEC sp_helptext 'HumanResources.uspEncryptThis';
Результатом выполнения будет сообщение:
3
The text for object 'HumanResources.uspEncryptThis' is encrypted
(Текст объекта 'HumanResources.uspEncryptThis' зашифрован).
Выполнение процедуры
Хранимая процедура может быть выполнена с помощью оператора
EXECUTE:
EXEC[UTE]
[@СтатусВозврата =] ИмяПроцедуры
[ [@параметр=] {Значение | Выражение} [OUTPUT] ] [,...]
При использовании выходного параметра, его необходимо описать с
использование ключевого слова OUTPUT при создании процедуры, а также
использовать это слово и при указании соответствующего параметра при
вызове процедуры. В противном случае процедура не передает выходное
значение.
Параметр @СтатусВозврата используется для получения значения
кода возврата из хранимой процедуры, выполненного с помощью оператора
RETURN
Статус.
Пользователю
рекомендовано
использовать
положительные значения статуса.
Управление хранимыми процедурами
Изменение
Для изменения существующей процедуры используется оператор
ALTER PROC, параметры этой команды аналогичны параметрам команды
создания процедуры.
Переименование
Для этого необходимо
хранимую процедуру:
использовать
специальную
системную
sp_rename ‘ИмяОбъекта’ ‘НовоеИмяОбъекта’.
Удаление
Для удаления
Transact-SQL:
хранимой
процедуры
DROP PROC ИмяПроцедуры.
4
используется
команда
Представления
Представление (View) является еще одним объектом, составляющим
логическую структуру любой базы данных. Представление для конечных
пользователей выглядит как таблица, однако при этом не содержит данных, а
лишь представляет их. Физически же представляемые данные расположены в
различных таблицах базы данных.
Представление реализуется в виде сохраненного запроса, на основе
которого и производится выборка из различных таблиц базы данных.
Представления обладают следующими преимуществами:
 обеспечивают конфиденциальность информации, т.к. позволяют
отобразить только необходимую информацию, скрывая определенные поля;
 упрощают представление данных, т.к. пользователь работает с
представлением как с единой таблицей, которая создана на основе выборки
данных из нескольких таблиц;
 управляют правами доступа к данным, например, вместо того чтобы
предоставлять права на выполнение запросов к определенным полям таблиц,
проще разрешить выполнение запросов через представление.
MS SQL Server предоставляет различные способы создания
представлений: с помощью средств Transact-SQL и в утилите
администрирования Management Studio.
Создание представлений с помощью Transact-SQL
Для создания представления используется команда CREATE VIEW,
правом ее выполнения обладают члены ролей sysadmin, db_owner,
db_dlladmin:
CREATE VIEW ИмяПредставления [(поле [,...n])]
[WITH ENCRYPTION]
AS
ЗапросВыборки
При указании ИмяПредставления необходимо придерживаться ранее
определенных правил именования объектов, также это имя не должно
совпадать с именем уже существующей таблицы в базе данных. Параметр
WITH ENCRYPTION определяет шифрование кода запроса и гарантирует, что
пользователи не смогут просмотреть и использовать его.
ЗапросВыборки представляет собой оператор SELECT, параметры
которого и определяют содержимое представления. Имена полей
5
представления задаются либо с помощью псевдонимов в операторе выборки,
либо указываются в параметре поле.
Например, создадим представление, содержащее лишь такую
информацию о сотрудниках компании AdventureWorks, как: должность и
логин сотрудника, дата рождения.
CREATE VIEW InfoEmployees ([Номер], [Фамилия], [Дата рождения])
AS
SELECT BusinessEntityID, JobTitle + '(' + LoginID + ')',
CONVERT (char(10), BirthDate, 104)
FROM HumanResources.Employee
Для просмотра содержимого проекции выполняется следующий
запрос:
SELECT * FROM InfoEmployees
С помощью данного представления ограничен доступ к некоторым
полям исходной таблицы Employee, в этом случае говорят, что на таблицу
наложен вертикальный фильтр, т.е. ограничен доступ к части полей таблицы
без защиты на уровне столбцов.
Если в коде запроса выборки определено условие отбора записей, то
говорят, что на таблицу наложен горизонтальный фильтр. Например,
следующее представление обеспечивает доступ к информации о
производителях, имеющих онлайн-службы для заказа товара:
CREATE VIEW OnlineVendors
AS
SELECT [Name]
FROM Purchasing.Vendor
WHERE PurchasingWebServiceURL IS NOT NULL
В запросе выборки может быть указана команда SELECT любой
сложности, однако при этом запрещается использовать раздела ORDER BY,
который в дальнейшем можно применить при выборке данных из созданного
представления. Также рекомендуется создавать представления только на
основе таблиц, для которых выполнено внутреннее соединение.
Например, создадим представление, отображающее
стоимость каждого заказа с указанием заказчика и его номера:
CREATE VIEW InfoOrders
6
суммарную
AS
SELECT FirstName + ' ' + LastName as [Название компании],
SalesOrderHeader.SalesOrderID as [Номер заказа],
Convert (money, sum(UnitPrice*OrderQty*(1UnitPriceDiscount)),0) as [Итог]
FROM (Person.Contact INNER JOIN Sales.SalesOrderHeader
ON Contact.ContactID=SalesOrderHeader.ContactID)
INNER JOIN Sales.SalesOrderDetail
ON SalesOrderHeader.SalesOrderID=SalesOrderDetail.SalesOrderID
GROUP BY SalesOrderHeader.SalesOrderID, FirstName + ' ' +
LastName
Следует помнить, что использование представлений не способствует
производительности. Обращение к представлению вызывает выполнение его
внутреннего кода, таким образом, в лучшем случае представления НЕ снизят
производительность БД.
Управление представлениями
Созданное представление может быть изменено выполнением команды
ALTER VIEW, имеющей аналогичный синтаксис команде CREATE VIEW.
Для удаления представления необходимо выполнить команду:
DROP VIEW ИмяПредставления
Для получения информации о представлении используется хранимая
процедура: sp_help ИмяПредставления, которая отображает список полей
представления с описанием их свойств. Для отображения кода, с помощью
которого создано представление, можно воспользоваться хранимой
процедурой: sp_helptext ИмяПредставления.
Список объектов, от которых зависит представление, может быть
получен выполнением хранимой процедуры: sp_depends ИмяПредставления.
Краткие итоги. Рассмотрены хранимые процедуры и представления, а
также основные команды SQL для создания, использования и управления
этими объектами.
7
Download