Поделиться через


Динамические курсоры (компонент Database Engine)

Динамические курсоры - это противоположность статических курсоров. Динамические курсоры отражают все изменения строк в результирующем наборе при прокрутке курсора. Значения типа данных, порядок и членство строк в результирующем наборе могут меняться для каждой выборки. Все инструкции UPDATE, INSERT и DELETE, выполняемые пользователями, видимы посредством курсора. Обновление видимы сразу, если они сделаны посредством курсора с помощью либо API-функции (например SQLSetPos), либо предложения WHERE CURRENT OF Transact-SQL. Обновления, сделанные вне курсора, не видны до момента фиксации, если только уровень изоляции транзакций с курсорами не имеет значение READ UNCOMMITTED.

ms189099.note(ru-ru,SQL.90).gifПримечание.
Если план выполнения, выбранный для применения запроса к динамическому курсору, использует просмотр кучи и условия таковы, что запрашивается блокировка страницы или таблицы, удаление строки может привести к изъятию всей страницы. В этом случае маркеры, используемые динамическими курсорами для позиционирования, могут стать недопустимыми, и последующая выборка из курсора может завершиться с ошибкой 16931. Возможные решения: создать кластеризованный индекс для таблицы, использовать другой тип курсора или оценить, есть ли возможность не допустить блокировки на уровне страниц и таблиц.
ms189099.note(ru-ru,SQL.90).gifПримечание.
В SQL Server 2005 вместо этого всегда выполняется обновление рабочих таблиц динамического курсора. То есть даже если ключевые столбцы изменяются как часть обновления, текущая строка обновляется. В SQL Server 2000 текущая строка помечалась как удаленная (как это было бы в случае отсутствующих курсоров наборов ключей), но не вставлялась в конец рабочей таблицы (как это происходило в случае курсоров наборов ключей). В результате при выполнении обновления курсора не удавалось найти строку, и она считалась отсутствующей. SQL Server 2005 поддерживает синхронизацию рабочей таблицы курсора, и при выполнении обновления удается находить строку, поскольку она имеет новые ключи.