Keysetgesteuerte Cursor

Ein keysetgesteuerter Cursor liegt zwischen einem statischen und einem dynamischen Cursor in seiner Fähigkeit, Änderungen zu erkennen. Wie ein statischer Cursor ermittelt er nicht immer Änderungen an der Mitgliedschaft und Reihenfolge des Resultsets. Wie ein dynamischer Cursor erkennt er Änderungen an den Werten von Zeilen im Resultset (vorbehaltlich der Isolationsebene der Transaktion, wie durch das SQL_ATTR_TXN_ISOLATION-Verbindungsattribute festgelegt).

Wenn ein keysetgesteuerter Cursor geöffnet wird, speichert er die Schlüssel für das gesamte Resultset. dadurch wird die scheinbare Mitgliedschaft und Reihenfolge des Resultsets behoben. Während der Cursor durch das Resultset scrollt, verwendet er die Schlüssel in diesem Keyset , um die aktuellen Datenwerte für jede Zeile abzurufen. Angenommen, ein keysetgesteuerter Cursor ruft eine Zeile ab und eine andere Anwendung aktualisiert diese Zeile. Wenn der Cursor die Zeile zurückweet, sind die werte, die er sieht, die neuen, da er die Zeile mithilfe der Taste zurückgibt. Aus diesem Gründen erkennen die keysetgesteuerten Cursor immer Änderungen, die von sich selbst und anderen vorgenommen wurden.

Wenn der Cursor versucht, eine gelöschte Zeile abzurufen, wird diese Zeile als "Loch" im Resultset angezeigt: Der Schlüssel für die Zeile ist in der Keyset vorhanden, aber die Zeile ist nicht mehr im Resultset vorhanden. Wenn die Schlüsselwerte in einer Zeile aktualisiert werden, wird die Zeile als gelöscht erachtet und dann eingefügt, sodass solche Zeilen auch als Löcher im Resultset angezeigt werden. Während ein keysetgesteuerter Cursor zeilen, die von anderen Personen gelöscht werden, immer erkennen kann, kann er optional die Tasten für Zeilen entfernen, die er selbst aus dem Keyset löscht. Keysetgesteuerte Cursor, die dies tun, können ihre eigenen Löschdaten nicht erkennen. Gibt an, ob ein bestimmter keysetgesteuerter Cursor seine eigenen Löschdaten erkennt, wird über die Option SQL_STATIC_SENSITIVITY in SQLGetInfo gemeldet.

Zeilen, die von anderen Personen eingefügt werden, sind niemals für einen keysetgesteuerten Cursor sichtbar, da keine Tasten für diese Zeilen im Keyset vorhanden sind. Ein keysetgesteuerter Cursor kann jedoch optional die Tasten für Zeilen hinzufügen, die er selbst in das Keyset einfügt. Keysetgesteuerte Cursor, die dies tun, können ihre eigenen Einfügungen erkennen. Gibt an, ob ein bestimmter keysetgesteuerter Cursor seine eigenen Einfügungen erkennt, wird über die Option SQL_STATIC_SENSITIVITY in SQLGetInfo gemeldet.

Das durch das attribut der SQL_ATTR_ROW_STATUS_PTR-Anweisung angegebene Zeilenstatusarray kann SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO oder SQL_ROW_ERROR für jede Zeile enthalten. Sie gibt SQL_ROW_UPDATED, SQL_ROW_DELETED oder SQL_ROW_ADDED für Zeilen zurück, die sie als aktualisiert, gelöscht oder eingefügt erkennt.

Keysetgesteuerte Cursor werden häufig implementiert, indem eine temporäre Tabelle erstellt wird, die die Schlüssel für jede Zeile im Resultset enthält. Da der Cursor auch bestimmen muss, ob Zeilen aktualisiert wurden, enthält diese Tabelle häufig auch eine Spalte mit Zeilenversionsinformationen.

Um über das ursprüngliche Resultset zu scrollen, öffnet der keysetgesteuerte Cursor einen statischen Cursor über der temporären Tabelle. Um eine Zeile im ursprünglichen Resultset abzurufen, ruft der Cursor zuerst den entsprechenden Schlüssel aus der temporären Tabelle ab und ruft dann die aktuellen Werte für die Zeile ab. Wenn Blockcursor verwendet werden, muss der Cursor mehrere Tasten und Zeilen abrufen.