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çã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çã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. |