Cursori gestiti da keyset
Un cursore gestito da keyset è a metà fra un cursore statico e un cursore dinamico per quanto riguarda la sua facoltà di rilevare le modifiche. Come un cursore statico, non sempre rileva le modifiche all'appartenenza e all'ordine del set di risultati. Analogamente a un cursore dinamico, rileva le modifiche ai valori delle righe nel set di risultati (soggetto al livello di isolamento della transazione, come impostato dall'attributo di connessione SQL_ATTR_TXN_ISOLATION).
Quando viene aperto un cursore gestito da keyset, esso salva le chiavi per l'intero set di risultati; ciò consente di correggere l'appartenenza evidente e l'ordine del set di risultati. Man mano che il cursore scorre il set di risultati, usa le chiavi in questo keyset per riprendere i valori di dati correnti per ogni riga. Supponiamo, ad esempio, che un cursore gestito da keyset recuperi una riga e che un'altra applicazione aggiorni in seguito tale riga. Se il cursore recupera la riga, i valori visualizzati sono quelli nuovi perché ha recuperato nuovamente la riga usando la sua chiave. Per questo motivo, i cursori gestiti da keyset rilevano sempre le modifiche apportate da sé stessi e da altri.
Quando il cursore tenta di riprendere una riga eliminata, questa riga viene visualizzata come "hole" nel set di risultati: la chiave per la riga esiste nel keyset, ma la riga non esiste più nel set di risultati. Se i valori della chiave in una riga vengono aggiornati, la riga viene considerata eliminata e quindi inserita, pertanto anche tali righe vengono visualizzate come hole nel set di risultati. Anche se un cursore gestito da keyset può sempre rilevare le righe eliminate da altri, può facoltativamente rimuovere le chiavi per le righe che esso stesso elimina dal keyset. I cursori gestiti da keyset che eseguono questa operazione non possono rilevare le proprie eliminazioni. Quando un determinato cursore gestito da keyset rileva le sue eliminazioni, le segnala tramite l'opzione SQL_STATIC_SENSITIVITY in SQLGetInfo.
Le righe inserite da altri non sono mai visibili a un cursore gestito da keyset perché non esistono chiavi per queste righe nel keyset. Tuttavia, un cursore gestito da keyset può aggiungere facoltativamente le chiavi per le righe inserite nel keyset. I cursori gestiti da keyset che eseguono questa operazione possono rilevare i propri inserimenti. Quando un determinato cursore gestito da keyset rileva i suoi inserimenti, li segnala tramite l'opzione SQL_STATIC_SENSITIVITY in SQLGetInfo.
La matrice di stato della riga specificata dall'attributo dell'istruzione SQL_ATTR_ROW_STATUS_PTR può contenere SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO o SQL_ROW_ERROR per qualsiasi riga. Restituisce SQL_ROW_UPDATED, SQL_ROW_DELETED o SQL_ROW_ADDED per le righe rilevate come aggiornate, eliminate o inserite.
I cursori gestiti da keyset vengono comunemente implementati creando una tabella temporanea contenente le chiavi per ogni riga nel set di risultati. Poiché il cursore deve anche determinare se le righe sono state aggiornate, questa tabella contiene in genere anche una colonna con informazioni sul controllo delle versioni delle righe.
Per scorrere il set di risultati originale, il cursore gestito da keyset apre un cursore statico sulla tabella temporanea. Per riprendere una riga nel set di risultati originale, il cursore riprende prima la chiave appropriata dalla tabella temporanea e poi riprende i valori correnti per la riga. Se vengono utilizzati cursori rettangolari, il cursore deve riprendere più chiavi e righe.