Partilhar via


Cursores dinâmicos (Mecanismo de Banco de Dados)

Cursores dinâmicos são o oposto de cursores estáticos. Cursores dinâmicos refletem todas as alterações feitas nas linhas de seu conjunto de resultados ao rolar pelo cursor. Os valores de dados, a ordem e a associação das linhas do conjunto de resultados podem ser alterados em cada busca. Todas as instruções UPDATE, INSERT e DELETE feitas por todos os usuários são visíveis pelo cursor. As atualizações são visíveis imediatamente se forem feitas por meio do cursor usando uma função de API como SQLSetPos ou a cláusula Transact-SQL WHERE CURRENT OF. As atualizações feitas fora do cursor não são visíveis até serem confirmadas, a menos que o nível de isolamento da transação do cursor esteja definido para ler não confirmadas.

Planos de cursor dinâmicos nunca usam índices espaciais.

ObservaçãoObservação

Se o plano de execução escolhido para execução de uma consulta para um cursor dinâmico estiver usando um exame heap e as condições forem tais que um bloqueio de página ou de tabela seja adquirido, a exclusão de uma linha pode resultar na desalocação de toda a página. Nesse caso, os marcadores usados pelos cursores dinâmicos para posicionamento podem se tornar inválidos e uma busca subseqüente a partir do cursor pode falhar com o erro 16931. As soluções possíveis incluem a criação de um índice clusterizado na tabela usando um tipo de cursor diferente ou avaliando se é possível evitar bloqueios em nível de tabela ou de página.

ObservaçãoObservação

No SQL Server, atualizações na tabela de trabalho de cursor dinâmico estão sempre no lugar. Isto é, mesmo que as colunas de chave sejam alteradas como parte da atualização, a linha atual será atualizada. No SQL Server 2000, a linha atual era marcada como excluída (como seria para cursores de conjunto de chaves que não estão no lugar), mas a linha não foi inserida no final da tabela de trabalho (como era para cursores de conjunto de chaves). O resultado era que a atualização do cursor não localizava a linha e relatava-a como ausente. O SQL Server mantém a tabela de trabalho do cursor em sincronização e a atualização pode localizar a linha porque ela possui as novas chaves.