Управляемые ключевым набором курсоры
Курсор, управляемый набором ключей, находится между статическим и динамическим курсором в его способности обнаруживать изменения. Так же как статический курсор, он не всегда обнаруживает изменения, внесенные в членство и порядок элементов результирующего набора. Как и динамический курсор, он обнаруживает изменения значений строк в результирующем наборе (при условии уровня изоляции транзакции, заданного атрибутом подключения SQL_ATTR_TXN_ISOLATION).
При открытии курсора, управляемого набором ключей, он сохраняет ключи для всего результирующий набор; Это исправляет очевидное членство и порядок результирующих наборов. Когда курсор прокручивает результирующий набор, он использует ключи в этом наборе ключей для получения текущих значений данных для каждой строки. Например, предположим, что курсор, управляемый набором ключей, получает строку, а затем другое приложение обновляет ее. Если курсор получает ссылку на строку, значения, которые она видит, являются новыми, так как она перенаправила строку с помощью ключа. Из-за этого курсоры, управляемые набором ключей, всегда обнаруживают изменения, внесенные самими и другими.
Когда курсор пытается получить удаленную строку, эта строка отображается как "отверстие" в результирующем наборе: ключ для строки существует в наборе ключей, но строка больше не существует в результирующем наборе. Если значения ключей в строке обновляются, то строка считается удаленной и вставленной, поэтому такие строки также отображаются как отверстия в результирующем наборе. Хотя курсор, управляемый набором ключей, всегда может обнаруживать строки, удаленные другими пользователями, при необходимости можно удалить ключи для строк, которые он удаляет из набора ключей. Курсоры, управляемые набором ключей, которые делают это, не могут обнаруживать собственные удаления. Сообщается ли определенный курсор, управляемый набором ключей, через параметр SQL_STATIC_SENSITIVITY в SQLGetInfo.
Строки, вставленные другими пользователями, никогда не видны курсору на основе набора ключей, так как в наборе ключей отсутствуют ключи для этих строк. Однако курсор, управляемый набором ключей, может дополнительно добавить ключи для строк, которые он вставляет в набор ключей. Курсоры на основе набора ключей, которые делают это, могут обнаруживать собственные вставки. Указывает, обнаруживает ли определенный курсор на основе набора ключей собственные вставки с помощью параметра SQL_STATIC_SENSITIVITY в SQLGetInfo.
Массив состояния строки, указанный атрибутом инструкции SQL_ATTR_ROW_STATUS_PTR, может содержать SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO или SQL_ROW_ERROR для любой строки. Он возвращает SQL_ROW_UPDATED, SQL_ROW_DELETED или SQL_ROW_ADDED для строк, которые он обнаруживает как обновленные, удаленные или вставленные.
Курсоры на основе набора ключей обычно реализуются путем создания временной таблицы, содержащей ключи для каждой строки в результирующем наборе. Так как курсор также должен определить, были ли обновлены строки, эта таблица также обычно содержит столбец со сведениями о версиях строк.
Чтобы прокрутить исходный результирующий набор, курсор, управляемый набором ключей, открывает статический курсор во временной таблице. Чтобы получить строку в исходном результирующем наборе, курсор сначала извлекает соответствующий ключ из временной таблицы, а затем извлекает текущие значения для строки. Если используются блоковые курсоры, курсор должен получить несколько ключей и строк.