Программирование >>  Программирование баз данных 

1 ... 109 110 111 [ 112 ] 113 114 115 ... 346


-- Выполнение команды EXEC {©Invar)

На этот раз полученные результаты больше напоминают ожидаемые:

The Value Is Gustavo

Обратите внимание на то, как используются два подряд идущих символа кавычек для указания на то, что они фактически не отмечают конец строки, а служат для обозначения символа кавычки.

Итак, приведенный пример показывает, что используются две разные области определения переменных, связь между которыми отсутствует. К сожалению, отсутствует также способ передачи информации между внутренней и внешней областями определения без использования внешнего механизма, такого как временная таблица. Но следует учитывать, что если будет решено применить временную таблицу для обеспечения связи между областями определения, то любая временная таблица, созданная в области определения оператора EXEC, будет существовать только на протяжении времени выполнения этого оператора EXEC.

С данной особенностью временных таблиц, существующих лишь в течение времени выполнения процедуры EXEC, нам придется снова столкнуться, когда речь пойдет о триггерах и хранимых процедурах.

Небольшое исключение из правила

В ходе выполнения оператора EXEC устанавливаются значения некоторых системных переменных, с которыми можно ознакомиться по завершении этого выполнения. В частности, по-прежнему остается возможность воспользоваться значением системной переменной ©©ROWCOUNT. Рассмотрим еще один небольшой пример: USE AdventureWorks

EXEC{SELECT * FROM Sales.Customer)

SELECT The Rowcount is + CAST{©©ROWCOUNT as varchar)

Выполнение этого примера приводит к получению следующей строки (после вывода результирующего набора): The Rowcount is 19185

Контекст защиты и оператор exec

Из того, что некоторому пользователю предоставляется право вызывать на выполнение хранимую процедуру, следует также, что этот пользователь получает право осуществлять действия, предусмотренные в хранимой процедуре. Например, предположим, что в базе данных имеется хранимая процедура, позволяющая получить списки всех служащих, принятых на работу в течение последнего года. Пользователь, имеющий право вызывать на выполнение хранимую процедуру, может сделать такой вызов (и получить результаты), даже, например, не имея прав непосредственного доступа к таблицам, используемым в самой хранимой процедуре, допустим, к таблице



HumanResources . Employee. Это действительно удобно по причинам, которые будут описаны позже, в главе 11.

Разработчики обычно предполагают, что такие же подразумеваемые права остаются действительными и по отношению к оператору EXEC, но подобное происходит не всегда. Действительно, по умолчанию любая ссылка на объект, применяемая в операторе EXEC, раскрывается в контексте заш;иты текупцего пользователя. Таким образом, предположим, что некоторому пользователю предоставлено право вызывать на вьшолнение процедуру spNewEmployee и получать тем самым данные о служаш;их, принятьгх: на работу, но у него нет прав доступа к таблице Employee. Если получение результатов в процедуре spNewEmployee обеспечивается путем вьшолнения простого оператора SELECT, то проблемы не возникают. А если в процедуре spNewEmployee для вьшолнения оператора SELECT используется оператор EXEC, то попытка выполнить оператор EXEC окончится неудачей, так как пользователь не имеет права применять оператор SELECT для доступа к таблице Employee.

К счастью, это ограничение можно обойти. Ниже в данной книге приведены конкретные сведения о том, как решить эту задачу применительно к хранимым процедурам, функциям и триггерам. Автор решил затронуть данную тему в настояпцем разделе именно потому, что в нем рассматривается оператор EXEC (а этот оператор может быть вызван на вьшолнение в сценариях, но не только в хранимых процедурах и в других исполняемых программных объектах). Информация о том, как можно явно определить права, с учетом которых должно происходить вьшолнение профаммных объектов, будет приведена ниже в данной книге, при обсуждении компилированных объектов.

Контекст запдиты, в котором оператор EXEC выполняется в хранимой процедуре, пользовательской функции или триггере, можно переопределить, используя конструкцию EXECUTE AS в хранимой процедуре, функции или триггере. Конструкция EXECUTE AS будет рассматриваться более подробно при описании хранимых процедур, функций и триггеров циже в настоящей книге.

Использование функций для конкатенации строк, передаваемых в оператор exec

Фактически указанная проблема, касающаяся запрещения использования функций для конкатенации строк непосредственно в вызове оператора EXEC, может быть решена проще всего, поскольку для этого можно применить достаточно несложное решение. Указанную проблему можно сформулировать иными словами так, что не допускается вызывать какую-либо функцию для обработки строки, указанной в качестве параметра оператора EXEC. В качестве примера рассмотрим следующий оператор: USE AdventureWorks

-- Это - неработоспособный сценарий DECLARE ©NumberOfLetters int SET ©NumberOfLetters = 3

EXEC (SELECT LEFT (LastName, + CAST (©NumberOf Letters AS varchar) + ) AS FilingName

FROM Person.Contact)

-- A этот вполне работоспособен DECLARE ©NumberOfLetters AS int SET ©NumberOfLetters = 3



DECLARE @str AS varchar(255)

SET @str = SELECT LEFT(LastName, + CAST(@NumberOfLetters AS varchar) + ) AS

FilingName FROM Person.Contact

EXEC(@str)

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

Msg 102, Level 15, State 1, Line б Incorrect syntax near CAST.

Ho выполнение второго вызова оператора EXEC завершается успешно, поскольку в этот оператор передается уже полностью сформированная строка: FilingName

Ach Abe

Zhe Ни

(19972 row(s) affected)

Оператор exec и пользовательские функции

Вообще говоря, операторы EXEC нельзя применять в пользовательских функциях. Точнее, категорически запрещается применять операторы EXEC для вызова на выполнение динамического кода SQL в пользовательских функциях (но в некоторых случаях допускается применение операторов EXEC для вызова на выполнение хранимых процедур).

Операторы управления ходом выполнения

Операторы управления ходом выполнения являются неотъемлемым атрибутом любого современного процедурного языка программирования. Трудно себе представить, как можно было бы без помощи таких операторов управлять последовательностью выполнения различных фрагментов кода с учетом условий.

Настоящая книга рассчитана на читателей с достаточно высоким уровнем подготовки в области программирования и языка SQL, поэтому изложение данной темы будет довольно кратким; тем не менее, приведенное описание представляет собой полный обзор рассматриваемой проблематики.

В языке T-SQL предусмотрена большая часть программных средств управления ходом выполнения программы, включая перечисленные ниже.

Оператор IF. . . ELSE.

Оператор GOTO.

Оператор WHILE.

Оператор WAITFOR.

Оператор TRY/CATCH.

Кроме того, в языке T-SQL предусмотрен оператор CASE (аналогичный операторам SELECT CASE, DO CASE и SWITCH/BREAK в других языках), но он не обеспечивает такого же уровня управления программой, как операторы других языков.



1 ... 109 110 111 [ 112 ] 113 114 115 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика