Keysetgesteuerte Cursor (Datenbankmodul)
Die Mitgliedschaft und Reihenfolge der Zeilen in einem keysetgesteuerten Cursor werden beim Öffnen des Cursors festgelegt. Keysetgesteuerte Cursor werden von einer Reihe von eindeutigen Bezeichnern (Schlüssel) gesteuert, die als das Keyset bezeichnet werden. Die Schlüssel werden anhand einer Reihe von Spalten erstellt, die die Zeilen im Resultset eindeutig identifizieren. Das Keyset ist die Menge der Schlüsselwerte aus allen Zeilen, die zum Zeitpunkt des Öffnens des Cursors die Kriterien der SELECT-Anweisung erfüllten. Das Keyset eines keysetgesteuerten Cursors wird in tempdb erstellt, wenn der Cursor geöffnet wird.
Änderungen an Datenwerten in Spalten, die nicht Teil des Keysets sind (ausgeführt durch den Besitzer des Cursors oder durch Commitvorgänge anderer Benutzer), werden dann sichtbar, wenn der Benutzer durch den Cursor scrollt. Einfügungen, die außerhalb des Cursors an der Datenbank ausgeführt werden, sind nur dann im Cursor sichtbar, wenn der Cursor geschlossen und erneut geöffnet wird. Einfügungen, die über den Cursor mithilfe einer API-Funktion ausgeführt werden, wie z. B. die SQLSetPos von ODBC, sind am Ende des Cursors sichtbar. @@FETCH_STATUS gibt zurück, dass die gewünschte Zeile nicht vorhanden ist, wenn der Versuch unternommen wird, eine Zeile abzurufen, die nach dem Öffnen des Cursors gelöscht wurde. Eine Aktualisierung an einer Schlüsselspalte ist vergleichbar mit dem Löschen des alten Schlüsselwerts, gefolgt vom Einfügen des neuen Schlüsselwerts. Der neue Schlüsselwert ist nicht sichtbar, wenn die Aktualisierung nicht über den Cursor erfolgte. Der Schlüsselwert ist hingegen am Ende des Cursors sichtbar, wenn die Aktualisierung über den Cursor mithilfe einer API-Funktion, wie z. B. SQLSetPos oder der WHERE CURRENT OF-Klausel von Transact-SQL, ausgeführt wurde und die SELECT-Anweisung keine JOIN-Bedingung in der FROM-Klausel enthielt. Der neue Schlüsselwert ist nicht sichtbar, wenn die Einfügung eine Remotetabelle in der FROM-Klausel enthielt. Versuche, den alten Schlüsselwert abzurufen, führen zu demselben auf eine fehlende Zeile hinweisenden Abrufstatus wie der Zugriff auf eine gelöschten Zeile.
Hinweis |
---|
Ein Index für berechnete Spalten kann nicht verwendet werden, wenn ein keysetgesteuerter Cursor für eine Remotetabelle deklariert wird. Sie können einen anderen Index erstellen, um die eindeutigen Schlüssel für diese Remotetabelle bereitzustellen. |