Condividi tramite


Cursori dinamici (Motore di database)

I cursori dinamici sono l'opposto dei cursori statici. Quando si scorre un cursore dinamico vengono visualizzate tutte le modifiche apportate alle righe del set di risultati corrispondente. I valori di dati, l'ordine e l'appartenenza delle righe del set di risultati possono variare a ogni operazione di recupero. I risultati delle istruzioni UPDATE, INSERT e DELETE eseguite da tutti gli utenti sono visibili nel cursore. Gli aggiornamenti sono visibili immediatamente se eseguiti nel cursore tramite una funzione API quale SQLSetPos o la clausola WHERE CURRENT OF Transact-SQL. Gli aggiornamenti eseguiti all'esterno del cursore risultano visibili solo dopo l'operazione di commit, a meno che il livello di isolamento della transazione non sia impostato su read uncommitted.

I piani dinamici del cursore non utilizzano mai indici spaziali.

Nota

Se il piano di esecuzione scelto per eseguire una query per un cursore dinamico utilizza la scansione di un heap e le condizioni sono tali che è stato acquisito un blocco di pagina pagina o di tabella, l'eliminazione di una riga può determinare la deallocazione dell'intera pagina. In tal caso, gli indicatori utilizzati dai cursori dinamici per il posizionamento possono diventare invalidi e un successivo FETCH dal cursore può genere l'errore 16931. Tra le possibili soluzioni, la creazione di un indice cluster sulla tabella, utilizzando un diverso tipo di cursore, oppure valutando se sia possibile impedire i blocchi di pagina e a livello di tabella.

Nota

In SQL Server gli aggiornamenti della tabella di lavoro del cursore dinamico sono sempre sul posto, ovvero, anche se le colonne chiave vengono modificate come parte dell'aggiornamento, la riga corrente viene aggiornata. In SQL Server 2000 la riga corrente è stata contrassegnata come eliminata (come sarebbe avvenuto per i cursori keyset non sul posto), ma la riga non è stata inserita alla fine della tabella di lavoro (come per cursori keyset). Di conseguenza, l'aggiornamento del cursore non è stato in grado di individuare la riga e l'ha segnalata come mancante. SQL Server mantiene sincronizzata la tabella di lavoro del cursore e l'aggiornamento è in grado di individuare la riga in quanto include le nuove chiavi.