鍵集驅動游標介於靜態游標與動態游標之間,能偵測變更。 與靜態游標類似,它並不總是能偵測結果集成員和順序的變化。 類似動態游標,它會偵測結果集中列值的變動(受交易隔離層級的限制,該隔離層由 SQL_ATTR_TXN_ISOLATION 連線屬性設定)。
當開啟鍵集驅動游標時,會儲存整個結果集的鍵;這會固定結果集的表觀成員關係與順序。 當游標在結果集中滾動時,會利用該 鍵集 中的鍵來取得每一列目前的資料值。 例如,假設一個由鍵集驅動的游標取得一列,然後另一個應用程式更新該列。 如果游標重新取得該列,它看到的值就是新的,因為它是用鍵重新取得該列的。 因此,鍵集驅動的游標總是能偵測到自己或他人所做的變更。
當游標嘗試檢索已刪除的列時,該列會以「洞」形式出現在結果集中:該列的鍵存在於鍵集中,但該列已不存在於結果集中。 若某列的鍵值被更新,該列被視為已被刪除後再插入,因此這些列也會在結果集中出現為空洞。 雖然鍵組驅動游標總能偵測他人刪除的列,但它可以選擇性地移除自己刪除的列的鍵。 使用鍵集驅動的游標無法偵測自己的刪除。 特定鍵集驅動游標是否偵測到自身刪除,則透過 SQLGetInfo 的SQL_STATIC_SENSITIVITY選項報告。
由他人插入的列在鍵集驅動游標中永遠不會被看見,因為這些列的鍵在鍵集中不存在。 然而,鍵集驅動游標可以選擇性地將其自行插入的列的鍵新增至鍵集。 鍵集驅動的游標可以偵測到自己執行的插入操作。 特定鍵集驅動游標是否偵測到自身插入,會透過 SQLGetInfo 的SQL_STATIC_SENSITIVITY選項回報。
由 SQL_ATTR_ROW_STATUS_PTR 陳述句屬性指定的列狀態陣列可以包含任何列的 SQL_ROW_SUCCESS、SQL_ROW_SUCCESS_WITH_INFO 或 SQL_ROW_ERROR。 它會回傳 SQL_ROW_UPDATED、SQL_ROW_DELETED 或 SQL_ROW_ADDED,表示偵測到的列是否已更新、已刪除或已插入。
鍵集驅動游標通常透過建立一個暫存資料表來實作,該表包含結果集中每一列的鍵。 由於游標也必須判斷列是否已更新,此表通常也會包含列版本資訊的欄位。
要滾動至原始結果集,鍵集驅動游標會開啟暫存資料表上的靜態游標。 要取得原始結果集中的某一列,游標先從暫存資料表取得相應的鍵,然後取得該列目前的值。 若使用區塊游標,游標必須取得多個鍵與多個列。