Comparteix via


Cursores controlados por conjunto de claves

Un cursor controlado por conjuntos de claves se encuentra entre un cursor estático y dinámico en su capacidad de detectar cambios. Al igual que un cursor estático, no siempre detecta cambios en la pertenencia y el orden del conjunto de resultados. Al igual que un cursor dinámico, detecta cambios en los valores de las filas del conjunto de resultados (sujeto al nivel de aislamiento de la transacción, tal como establece el atributo de conexión SQL_ATTR_TXN_ISOLATION).

Cuando se abre un cursor controlado por conjuntos de claves, guarda las claves para todo el conjunto de resultados; esto corrige la pertenencia y el orden aparentes del conjunto de resultados. A medida que el cursor se desplaza por el conjunto de resultados, usa las claves de este conjunto de claves para recuperar los valores de datos actuales de cada fila. Por ejemplo, supongamos que un cursor controlado por conjuntos de claves captura una fila y otra aplicación actualiza esa fila. Si el cursor vuelve a capturar la fila, los valores que ve son los nuevos porque ha vuelto a capturar la fila mediante su clave. Debido a esto, los cursores controlados por conjuntos de claves siempre detectan los cambios realizados por sí mismos y otros.

Cuando el cursor intenta recuperar una fila que se ha eliminado, esta fila aparece como un "agujero" en el conjunto de resultados: la clave de la fila existe en el conjunto de claves, pero la fila ya no existe en el conjunto de resultados. Si se actualizan los valores de clave de una fila, la fila se considera que se ha eliminado y, a continuación, se inserta, por lo que estas filas también aparecen como agujeros en el conjunto de resultados. Aunque un cursor basado en conjuntos de claves siempre puede detectar filas eliminadas por otros usuarios, opcionalmente puede quitar las claves de las filas que él mismo elimina del conjunto de claves. Los cursores controlados por conjuntos de claves que hacen esto no pueden detectar sus propias eliminaciones. Si un cursor determinado controlado por conjuntos de claves detecta sus propias eliminaciones se notifica a través de la opción SQL_STATIC_SENSITIVITY en SQLGetInfo.

Las filas insertadas por otros usuarios nunca son visibles para un cursor controlado por conjuntos de claves porque no existen claves para estas filas en el conjunto de claves. Sin embargo, un cursor controlado por conjuntos de claves puede agregar opcionalmente las claves para las filas que inserta en el conjunto de claves. Los cursores controlados por conjuntos de claves que realizan esto pueden detectar sus propias inserciones. Si un cursor determinado controlado por conjuntos de claves detecta sus propias inserciones se notifica a través de la opción SQL_STATIC_SENSITIVITY en SQLGetInfo.

La matriz de estado de fila especificada por el atributo de instrucción SQL_ATTR_ROW_STATUS_PTR puede contener SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO o SQL_ROW_ERROR para cualquier fila. Devuelve SQL_ROW_UPDATED, SQL_ROW_DELETED o SQL_ROW_ADDED para las filas que detecta como actualizadas, eliminadas o insertadas.

Los cursores controlados por conjuntos de claves se suelen implementar mediante la creación de una tabla temporal que contiene las claves de cada fila del conjunto de resultados. Dado que el cursor también debe determinar si se han actualizado las filas, esta tabla también suele contener una columna con información de control de versiones de fila.

Para desplazarse por el conjunto de resultados original, el cursor controlado por conjunto de claves abre un cursor estático sobre la tabla temporal. Para recuperar una fila del conjunto de resultados original, el cursor recupera primero la clave adecuada de la tabla temporal y, a continuación, recupera los valores actuales de la fila. Si se usan cursores de bloque, el cursor debe recuperar varias claves y filas.