Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Метод указания AIS

.pdf
Скачиваний:
8
Добавлен:
18.02.2016
Размер:
9.86 Mб
Скачать

2.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос.

КАТУ ИМ СЕЙФУЛЛИНА

К.Т.Н. А.С.

Во всех предыдущих примерахСУБДоператор FETCH использовался для возвращения текущей строки. Синтаксис оператора FETCH также предусматривает ряд ключевых слов для указания другой строки. При использовании этих ключевых слов оператор FETCH будет возвращать заданную строку, и делать ее текущей.

Эти ключевые слова дают вам возможность задавать абсолютную позицию во множестве курсора. Ключевые слова FIRST и LAST возвращают первую и последнюю строки соответственно, в то время как ABSOLUTE n задает строку, отстоящую на n строк от начала (если n положительно) или от конца (если n отрицательно) множества записей курсора. Значение n может быть выражено в виде константы

(3) или в виде переменной (@theRow).

Выберите строки по их абсолютной позиции

1. Введите

171

2.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос.

КАТУ ИМ.С СЕЙФУЛЛИНА

КПомимо.Т.ключевыхН.словОМАРБЕКОВА, дающих возможность извлекать строки по их абсолютной позицииА, оператор.С. FETCH предусматривает три ключевых слова, позволяющих извлекать строки по их позиции

относительно текущей строки. Оператор FETCH NEXT возвращает следующую строку, оператор FETCH PRIOR возвращает предыдущую строку, а оператор FETCH RELATIVE n возвращает строку, отстоящую на n строк отСУБДтекущей. Подобно оператору FETCH ABSOLUTE n, оператор FETCH RELATIVE n может задавать строки, предшествующие текущей, если n отрицательно, и строки, следующие за текущей, если n положительно.

Выберите строки по их относительной позиции

1. Введите

172

2.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос.

Используйте оператор FETCH NEXT для быстродействующего курсора

1. Введите

КАТУ ИМ

К.Т.Н. А.С.

2.Нажмите кнопку Run Query (Выполнить запрос) в панели инструментов анализатора запросов

Query Analyzer. Query Analyzer выполнит запрос.

173

Модификация и удаление строк через курсоры

Если ваш курсор является модифицируемым. Изменение исходных значений во множестве курсора выполняется достаточно просто. Предусмотрена специальная форма фразы WHERE, которая поддерживает модификацию через курсор:

UPDATE таблица_или_представление

SET список_для_модификации

WHERE CURRENT OF курсор_или_переменная

Это называется позиционным обновлением. Transact-SQL также поддерживает позиционное удаление, которое имеет следующую форму записи:

DELETE таблица_или_представление

WHERE CURRENT OF курсор_или_переменная

Выполните позиционное обновление

КАТУ1. Введите ИМ.С.СЕЙФУЛЛИНА

К.Т.Н. А.С.

2.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит запрос. Обратите внимание, что отображаются две панели сетки. Первая создается оператором FETCH и содержит начальное содержимое столбцов. Вторая является результатом выполнения оператора SELECT и содержит значение поля noudost после модификации.

174

Мониторинг курсоров Transact-SQL

Transact-SQL предоставляет две глобальные переменные и функцию, которые помогают вам контролировать работу и состояние вашего курсора. Переменная @@CURSOR_ROWS возвращает количество строк во множестве последнего курсора, открытого в соединении. Значения, возвращаемые @@CURSOR_ROWS, представлены в таблице 1.

Таблица 1. Значения, возвращаемые переменной @@CURSOR_ROWS.

 

 

 

 

 

 

Возвращаемое

 

Описание

 

 

значение

 

 

 

 

 

 

 

 

 

 

-m

 

Курсор заполнен записями не полностью; множество курсора на данный момент

 

 

 

 

содержит m строк.

 

 

 

 

 

-1

 

Курсор является динамическим, и количество строк может варьироваться.

 

 

 

 

 

0

 

Курсор либо не открыт, а последний открытый курсор был закрыт и освобожден,

 

 

 

 

либо курсор содержит нуль строк.

 

 

 

 

 

n

 

Количество строк в курсоре равно n.

 

 

 

 

 

 

Переменная @@FETCH_STATUS возвращает информацию о выполнении последней команды FETCH.

В таблице 2 представлены значения, возвращаемые переменной @@FETCH_STATUS. КАТУТаблица 2. ЗначенияИМ, возвращаемые.переменнойС.СЕЙФУЛЛИНА@@FETCH STATUS.

Возвращаемое значение Описание

0 Оператор FETCH был выполнен успешно.

К.Т.Н. ОМАРБЕКОВА А.С.

-1

Оператор FETCH был выполнен неудачно.

-2

Извлекаемая строка отсутствует.

Наконец, Transact-SQL предоставляет функцию CURSOR_STATUS. Эта функция имеет следующий синтаксис: СУБД

CURSOR_STATUS(тип, курсор или переменная)

Тип может иметь значения 'local', 'global' или 'variable', а курсор_или_переменная – это идентификатор курсора или курсорной переменной, информацию о котором требуется получить. Результаты, возвращаемые функцией CURSOR_STATUS, представлены в таблице 3.

Таблица 3. Значения, возвращаемые функцией CURSOR_STATUS.

Возвращаемое

Описание

значение

1Если функция вызывалась для динамического курсора, множество курсора состоит из нуля, одной или нескольких строк. Если функция вызывалась для другого типа курсора, курсор состоит по меньшей мере из одной строки.

 

 

0

Множество курсора пусто.

 

 

-1

Курсор закрыт.

 

 

-2

Возвращается только для курсорной переменной. Либо курсор, назначенный

 

указанной переменной, закрыт, либо переменной не назначен какой-либо курсор.

 

 

-3

Указанный курсор или курсорная переменная не существует.

 

175

23 Триггеры

Задание

1.Определение триггера

2.Разница между триггерами AFTER и INSTEAD OF.

3.Создать триггер After Insert. Вставить в таблицу kontengent новую строку.

4.Создать триггер Instead Of Delete.Удалить из таблицы строки по условию. Выдать сообщение о количестве удаленных строк

5.Создать триггер Instead Of Update используя функцию UPDATE. Изменить в таблице kontengent записи.

Триггер – это особый вид хранимой процедуры, которую Microsoft SQL Server выполняет автоматически, когда вы модифицируете строку с помощью команд INSERT, UPDATE или DELETE. Мы рассмотрим различные виды триггеров, в том числе триггер INSTEAD OF.

Понятие о триггерах

Преимущество триггерной процедуры состоит в том, что SQL Server автоматически вызывает ее при

КАТУобращении к командеИМ, для которойона .определенаСЕЙФУЛЛИНА. Это повышает устойчивость базы данных к внешним воздействиям (робастность). Вам нет нужды беспокоиться о том, чтобы клиенты базы данных

– пользователи или приложения – разбирались и пользовались всеми зависимостями данных и установленными для них правилами.

КПредположим.Т.Н, в торговой. ОМАРБЕКОВАорганизации существует правило, в соответствии с которым заказАна общую.С. сумму 10000$ или выше требует проверки кредитоспособности. Если Credit Approved является

столбцом таблицы Customer, а заказ добавляется в таблицу Order, вы не сможете использовать проверочное ограничение типа CHECK для реализации правила, не следует возлагать ответственность за его соблюдение на клиентов базы данных. Триггер предоставляет механизм, обеспечивающий исполнение правила внутриСУБДбазы данных.

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

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

Совет. Хотя производительность триггеров обычно не представляет проблемы (в отличие от курсоров), следует всегда применять правила по возможности на самом низком уровне. Не используйте триггеры, если можно применить проверочное ограничение CHECK, а ограничение CHECK не следует использовать, если можно обойтись ограничением UNIQUE.

Триггеры AFTER

SQL Server поддерживает два различных типа триггеров: триггеры AFTER и триггеры INSTEAD OF. Триггеры AFTER вызываются после выполнения команды, которой они назначены, а триггеры INSTEAD OF вызываются вместо команды.

176

Триггеры AFTER вы можете использовать для команд INSERT, UPDATE и DELETE. Триггеры AFTER можно создавать только для таблиц, но не для представлений. Для каждой из этих трех команд могут быть установлены несколько триггеров. С другой стороны, один триггер может быть применен для любой комбинации этих трех команд.

Совет. Если вы создаете несколько триггеров для одной команды, вы можете использовать системную процедуру sp_settriggerorder для указания первого и последнего по порядку триггера, выполняемого для команды.

Триггер AFTER вызывается после того, как выполнены все операции по обработке ограничений низкого уровня, и не будут вызваны в случае нарушения ограничения. Например, если осуществляется попытка вставить строку, которая нарушает ограничение PRIMARY KEY для таблицы, оператор INSERT не будет выполнен до того, как произойдет вызов триггера.

Триггеры INSTEAD OF

Триггеры INSTEAD OF заменяют команду, для которой они объявлены. Подобно триггерам AFTER, вы можете определять триггеры INSTEAD OF для команд INSERT, UPDATE или DELETE. Один триггер может быть применен к нескольким командам.

КАТУОднако, в отличие отИМтриггеров AFTER,вы.можетеСЕЙФУЛЛИНАсоздавать триггеры INSTEAD OF как для таблиц, так и для представлений, но для каждого действия над этой таблицей или представлением может быть

создан только один триггер INSTEAD OF.

Триггеры INSTEAD OF несовместимы с каскадными изменениями связанных данных. Вы не можете

объявить триггер INSTEAD OF DELETE или INSTEAD OF UPDATE для таблицы, внешний ключ Ккоторой.Т.затрагиваетсяН. действиямиОМАРБЕКОВАудаления (DELETE) или модификации (UPDATE). А.С.

Поскольку триггеры INSTEAD OF могут быть объявлены для представлений, они чрезвычайно полезны для получения функциональных возможностей представления, которые не могут быть доступны иным способом. Например, SQL ServerСУБДне дает возможности применить для представления оператор INSERT, содержащий фразу GROUP BY, но позволяет вам определить триггер INSTEAD OF INSERT для представления. Вы можете воспользоваться триггером для вставки записей в таблицы, лежащие в основе представления, тем самым давая знать пользователю, что новая строка была вставлена в представление.

Триггеры "BEFORE"

Триггера BEFORE не существует, но триггер INSTEAD OF может порождать команду, для которой он объявлен, и эта команда будет выдаваться, как если бы триггера INSTEAD OF не было.

Например, если вы хотите проверить некое условие до выполнения команды INSERT, вы можете объявить триггер INSTEAD OF INSERT. Триггер INSTEAD OF будет выполнять проверку, а затем выполнять команду INSERT для таблицы. Оператор INSERT будет выполняться обычным образом, не порождая рекурсивных вызовов триггера INSTEAD OF.

Создание триггеров

SQL Server накладывает ряд ограничений на действия, выполняемые триггерами. Вы не можете создавать (командой CREATE), изменять (командой ALTER) или удалять (командой DROP) базу

177

данных с использованием триггера; вы не можете восстанавливать базу данных или файл журнала; и вы не можете выполнять определенные операции, которые изменяют конфигурацию SQL Server.

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

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

Использование команды CREATE TRIGGER

Как и любые другие объекты базы данных, триггер определяется с помощью соответствующей формы оператора CREATE. Базовый синтаксис оператора создания триггера следующий:

CREATE TRIGGER имя_триггера

ON таблица_или_представление тип_триггера, список_команд

КАТУAS ИМ.С.СЕЙФУЛЛИНА

операторы SQL

Имя_триггера должно удовлетворять правилам, принятым для идентификаторов.

Таблица или представление может быть именем представления, только если тип_триггера есть КINSTEAD.Т.OF,Нпоскольку. ОМАРБЕКОВАтолько этот тип триггера вы можете определять для представленийА. Триггеры.С. не могут быть созданы для временных таблиц или системных таблиц, но они могут ссылаться на

временные таблицы.

Тип_триггера должен бытьСУБДвыражен одним из ключевых слов AFTER, FOR или INSTEAD OF, в то время как список_команд может быть любой комбинацией команд INSERT, UPDATE или DELETE. Если вы указываете более одной команды, их следует отделять запятыми.

Операторы_SQL, следующие за ключевым словом AS, определяют действия, выполняемые триггером. Здесь имеется аналогия с хранимыми процедурами, за исключением того, что триггеры не имеют параметров.

Перед тем как приступить к рассмотрению триггеров необходимо создать таблицу

TriggerMessages со столбцами TriggerName, MessageText.

Создайте триггер AFTER

1. Введите

178

2.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст триггер.

3.Нажмите кнопку New Query (Новый запрос) в панели инструментов анализатора запросов

Query Analyzer. Query Analyzer откроет новое окно Query (Запрос).

4.Введите сценарий TestAfterUpdate

КАТУ ИМ СЕЙФУЛЛИНА

К.Т.Н. А.С.

5.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.

Создайте триггер INSTEAD OF

179

1. Введите сценарий insteadOf

2.Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer создаст триггер.

КАТУ3. Перейдите к окнуИМQuery (Запрос), содержащему.СЕЙФУЛЛИНАсценарий TestAfterUpdate.

4. Нажмите кнопку Execute Query (Выполнить запрос) в панели инструментов анализатора запросов Query Analyzer. Query Analyzer выполнит сценарий и отобразит результат.

К.Т.Н. А.С.

Использование функции UPDATE

SQL Server предоставляет специальную функцию, UPDATE, которая может быть использована в триггере для определения, подвергся ли изменению определенный столбец в строке. Функция UPDATE имеет следующий синтаксис:

UPDATE (имя_столбца)

Функция UPDATE будет возвращать TRUE, если значения данных для указанного столбца были изменены командой INSERT или командой UPDATE.

Используйте функцию UPDATE

180