Курсоры, управляемые набором ключей (компонент Database Engine)
Членство и порядок строк в курсоре, управляемом набором ключей, являются фиксированными при открытии курсора. Такие курсоры управляются с помощью набора уникальных идентификаторов — ключей. Ключи создаются из набора столбцов, который уникально идентифицирует строки результирующего набора. Набор ключей — это набор ключевых значений всех строк, попадающих под действие инструкции SELECT на момент открытия курсора. Набор ключей, управляющий курсором, создается в базе данных tempdb при открытии курсора.
Изменения в значениях столбцов, не входящих в ключевой набор (внесенные владельцем курсора или другими пользователями), становятся видны при прокрутке курсора пользователем. Чтобы вставка в базу данных извне курсора была видна внутри него, нужно закрыть курсор и открыть его заново. Вставка, сделанная курсором с помощью такой функции API, как ODBC SQLSetPos, видна в конце курсора. При попытке получить строку, удаленную после открытия курсора, функция @@FETCH_STATUS возвращает состояние «строка отсутствует». Обновление ключевого столбца действует аналогично удалению старого значения ключа с последующей вставкой нового значения. Если обновление не было выполнено с помощью курсора, то новое ключевое значение не будет видимо. Оно будет видимо в конце курсора, если обновление было выполнено курсором или с помощью такой функции API, как SQLSetPos, или с помощью предложения WHERE CURRENT OF языка Transact-SQL, и при этом инструкция SELECT не содержала условия JOIN в предложении FROM. Новое ключевое значение не будет видимо, если вставка содержала удаленную таблицу в предложении FROM. При попытке получить старое ключевое значение возвращается состояние выборки «строка отсутствует», как в случае с удаленной строкой.
Примечание |
---|
При объявлении курсора, управляемого набором ключей, для удаленной таблицы, вычисляемые столбцы индексировать нельзя. Кроме того, для уникальных ключей такой удаленной таблицы нельзя создать еще один индекс. |