
- •Хранимые процедуры Управление процессом компиляции хранимых процедур
- •Управление автоматическим выполнением хранимых процедур
- •Использование индексов
- •Планирование использования индексов
- •Создание индексов средствами t-sql
- •Использование курсоров
- •Динамические курсоры
- •Последовательные курсоры
- •Ключевые курсоры
- •Управление курсорами.
- •Работа с триггерами
- •Пример триггера
- •Система безопасности sql Server
- •Общие правила разграничения доступа
- •Аутентификация и интеграция с доменом Windows
- •Режим аутентификации Wondows
- •Режим аутентификации sql Server
- •Права доступа
- •Компоненты системы безопасности sql Server
- •Создание пользователей
- •Роли приложения
- •Защита данных в sql Server
- •Управление правами доступа к объектам базы данных средствами t-sql
- •Репликация данных
- •Понятие репликации данных
- •Издатель
- •Подписчик
- •Дистрибьютор
- •Механизмы репликации
Последовательные курсоры
Пользователь может выбирать строки только от начала к концу курсора. Последовательный курсор не хранит набор всех строк. Строки считываются из базы данных, как только они выбираются в курсоре. Это позволяет динамически отражать все изменения, вносимые пользователями в базу данных с помощью команд insert, update, delete. В результате в курсоре видно самое последнее состояние данных.
Ключевые курсоры
Курсоры, зависящие от набора ключей, или ключевые курсоры, построены на основе уникальных идентификаторов. Множество всех уникальных идентификаторов строк таблицы базы данных называется набором ключей. При использовании ключевых курсоров сервер блокирует строки исходных таблиц только на время составления набора ключей.
Ключевой курсор представляет собой набор ключей, идентифицирующих строки полного результирующего набора курсора. Набор ключей строится в системной базе данных tempdb.
Так как при использовании ключевых курсоров сохраняется информация только о ключевых полях строк, включённых в полный результирующий набор курсора, ключевые курсоры отражают все изменения, вносимые другими пользователями. Строки, добавленные после открытия ключевого курсора, не будут показаны в курсоре, даже если они удовлетворяют условиям выборки.
Управление курсорами.
При работе с курсорами можно выделить 5 основных операций.
Создание курсора. Мы рассмотрим два варианта синтаксиса создания курсора.
Создание курсора в SQL-92
DECLARE cursor_name [INSENSITIVE][SCROLL] CURSOR
FOR select_statement
[FOR {READ_ONLY | UPDATE[OF column_name[…n]]]}]
cursor_name - имя курсора.
INSENSITIVE – будет созодан статический курсор. Если это ключевое слово не используется, создаётся динамический курсор.
SCROLL – при указании этого ключевого слова, созданный курсор можно будет прокручивать в обоих направлениях, что позволяет использовать любые команды выборки.
select_statement – этот параметр определяет тело запроса select, с помощью которого определяется результирующий набор строк курсора. В запросе SELECT не допускается использование разделов INTO и COMPUTE BY. Если запрос конфликтует с типом курсора, то сервер выполнит неявное преобразование типа курсора в совместимый тип.
FOR READ ONLY – при использовании этого параметра будет создан запрос только для чтения. Никакие модификации данных в этом случае не разрешаются. Курсор только для чтения отличается от статического курсора, хотя они оба не позволяют изменять данные. В качестве курсора только для чтения может быть объявлен динамический курсор, что позволит отображать изменения, сделанные другими пользователями.
FOR UPDATE OF column_name – создание курсора с этим параметром позволяет выполнять в курсоре изменения данных. Если не указан параметр OF column_name, можно изменять все колонки курсора, в противном случае допускается только изменение колонок, явно указанных в списке column_name.
Создание курсора в T-SQL
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FASTFORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR select_statement
[FOR UPDATE [OF column_name[…n]]]
LOCAL – при использовании этого ключевого слова будет создан локальный курсор, видимый только в пределах создавшего этот курсор пакета, триггера, или хранимой процедуры. После закрытия пакета, завершения триггера или хранимой процедуры курсор неявно уничтожается. Чтобы передать содержимое курсора ха пределы создавшей его конструкции необходимо присвоить его параметру OUTPUT.
GLOBAL – создаётся глобальный курсор, который существует до закрытия текущего соединения.
FORWARD ONLY – создаётся последовательный курсор. Выборку данных можно осуществлять последовательно только в направлении от первой строки к последней.
SCPOLL – создаётся прокручиваемый курсор. Обращаться к данным в нём можно в любом порядке и в любом направлении.
STATIC – будет создан статический курсор.
KEYSET – будет создан ключевой курсор.
DYNAMIC – будет создан динамический курсор.
FAST FOREARD – если для курсора READ ONLY использовать этот параметр, то созданный курсор будет оптимизирован для быстрого доступа к данным. Этот параметр не может быть использован совместно с параметрами FORWARD ONLY и OPTIMISTIC.
OPTIMISTIC – в курсоре, созданном с этим параметром запрещается изменение или удаление строк, которые были изменены после открытия курсора. Для отслеживания изменений сервер использует колонку TimeStamp. Если такой колонки в таблице нет, то при открытии курсора сервер будет генерировать контрольную сумму для каждой строки и проверять её при каждой попытке удаления или изменения строки.
TYPE_WARNING – при указании этого параметра сервер будет информировать пользователя о неявном изменении типа курсора, если он не совместим с запросом SELECT.
Открытие курсора.
Считывание данных
FETCH
[[NEXT | PRIOR | FIRST | LAST | ABSOLUTE{@nvar}
| RELATIVE {@nvar }]
FROM]
{{[GLOBAL] cursor_name}
@cursor_variable
FIRST – при указании этого ключевого слова будет возвращена самая первая сорока полного результирующего набора курсора. Текущей строкой становится первая строка.
LAST – возвращается самая первая строка курсора, она же становится текущей строкой.
NEXT – будет возвращена строка, находящаяся в полном результирующем наборе сразу после текущей, эта строка становится текущей. умолчанию коменда FETCH использует именно такой способ выборки строк.
PRIOR – возвращает строку, находящуюся перед текущей.
ABSOLUTE – возвращает строку по её абсолютному порядковому номеру в полном результирующем наборе курсора. Номер строки задавать с помощью константы или как имя переменной, в которой хранится номер строки, при этом переменная должна иметь целочисленный тип данных, при этом можно указывать, как положительное, так и отрицательное значение. При указании положительного значения, строка отсчитывается от начала набора, при указании отрицательного – от конца. Выбранная строка становится текущей. Если указано нулевое значение, то строка не возвращается.
RELATIVE – возвращает строку, находящуюся через n строк после текущей. Если указать отрицательное значение n, то будет возвращена строка, находящаяся на n строк до текущей, при указании нулевого значения, возвратится текущая строка. Возвращённая строка становится текущей.
INTO variable_name – в этой конструкции задаётся список переменных в которые будут сохранены соответствующие значения полей возвращаемой строки. Порядок указания переменных должен соответствовать порядку колонок в курсоре.
Изменение данных с помощью курсора:
UPDATE table_name SET {column_name = {DEFAULT | NULL | expression}}[…n]
WHERE CURRENT OF cursir_name
cursor_name – определяет имя курсора, в котором необходимо выполнить изменения.
Для выполнения изменений с помощью курсора необходимо выполнить команду UPDATE с использованием раздела WHERE. Имя таблицы, в которой будут выполняться изменения указывается с помощью аргумента table_name. За одну операцию могут быть изменены несколько колонок, но все изменяемые колонки должны принадлежать одной таблице.
Удаление данных с помощью курсора.
DELETE table_name
SET {column_name = DEFAULT | Expression}
Закрытие курсора.
CLOSE {{[GLOBAL] cursor_name} | cursor_variable_name}
Освобождение курсора
DEALLOCATE {{[GLOBAL] cursor_name} | @cursor_variable_name}
Закрытие курсора освобождает выделенные для него ресурсы. При закрытии курсора снимаются все блокировки, установленные в процессе работы курсора. Закрытие курсора может применяться только к открытым курсорам.
Закрытый, но не освобождённый курсор может быть повторно открыт. Созданный курсор ещё не является открытым.
Освобождение курсора приводит к удалению курсора, как объекта базы данных. После удаления курсор не может быть открыт. Работа с курсором напоминает работу с таблицей, как и таблицу курсор сначала необходимо создать, только после этого в курсор можно добавлять данные.
Открытие курсора и выборку данных можно сравнить с заполнением таблицы данными.
Закрытие курсора можно представить, как удаление всех данных из таблицы. После удаления всех данных всё ещё остаётся возможность добавить в таблицу новые данные, но после того, как таблица будет удалена, никакие операции с таблицей не допускаются, так как SQL Server не будет воспринимать даже имя таблицы.
Освобождение курсора является своеобразным аналогом удаления таблицы.