Cursores controlados por conjunto de chaves
O cursor controlado por conjunto de chaves fica entre um cursor dinâmico e um cursor estático em sua capacidade de detectar alterações. Como um cursor estático, ele nem sempre detecta alterações à subscrição e à ordem do conjunto de resultados. Como um cursor dinâmico, ele detecta alterações nos valores das linhas no conjunto de resultados (sujeito ao nível de isolamento da transação, conforme definido pelo atributo de conexão SQL_ATTR_TXN_ISOLATION).
Quando um cursor controlado por conjunto de chaves é aberto, ele salva as teclas para todo o conjunto de resultados. Isso corrige a subscrição aparente e a ordem do conjunto de resultados. À medida que o cursor rola pelo conjunto de resultados, ele usa as chaves nesse conjunto de chaves para recuperar os valores de dados atuais para cada linha. Por exemplo, suponha que um cursor controlado por conjunto de chaves busque uma linha e outro aplicativo então atualize a linha. Se o cursor efetuar fetch da linha novamente, os valores que ele vê serão os novos porque ele efetuou novo fetch da linha usando sua chave. Assim, os cursores acionados por conjunto de chaves sempre detectam alterações feitas por eles mesmos e por outros.
Quando o cursor tenta recuperar uma linha excluída, essa linha aparece como um "espaço" no conjunto de resultados: a chave para a linha existe no conjunto de chaves, mas a linha não existe mais no conjunto de resultados. Se os valores de chave em uma linha forem atualizados, a linha será considerada excluída e inserida, ou seja, essas linhas também aparecerão como buracos no conjunto de resultados. Embora um cursor controlado por conjunto de chaves sempre possa detectar linhas excluídas por outros, ele pode, opcionalmente, remover as chaves das linhas que ele próprio exclui do conjunto de chaves. Cursores controlados por conjunto de chaves que fazem isso não podem detectar as próprias exclusões. Se um determinado cursor controlado por conjunto de chaves detectar suas próprias exclusões, isso será relatado por meio da opção SQL_STATIC_SENSITIVITY em SQLGetInfo.
As linhas inseridas por outras pessoas nunca ficam visíveis para um cursor controlado por conjunto de chaves porque não existem chaves para essas linhas no conjunto de chaves. Porém, um cursor controlado por conjunto de chaves pode, opcionalmente, adicionar as chaves para as linhas que ele mesmo insere no conjunto de chaves. Cursores controlados por conjunto de chaves que fazem isso podem detectar as próprias inserções. Se um determinado cursor controlado por conjunto de chaves detectar suas próprias inserções, isso será relatado por meio da opção SQL_STATIC_SENSITIVITY em SQLGetInfo.
A matriz de status da linha especificada pelo atributo de instrução SQL_ATTR_ROW_STATUS_PTR pode conter SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO ou SQL_ROW_ERROR para qualquer linha. Ela retorna SQL_ROW_UPDATED, SQL_ROW_DELETED ou SQL_ROW_ADDED para linhas que detecta como atualizadas, excluídas ou inseridas.
Os cursores controlados por conjunto de chaves normalmente são implementados criando uma tabela temporária que contém as chaves para cada linha no conjunto de resultados. Como o cursor também deve determinar se as linhas foram atualizadas, essa tabela também geralmente contém uma coluna com informações de controle de versão de linha.
Para rolar no conjunto de resultados original, o cursor controlado por conjunto de chaves abre um cursor estático sobre a tabela temporária. Para recuperar uma linha no conjunto de resultados original, o cursor primeiro recupera a chave apropriada da tabela temporária e recupera os valores atuais para a linha. Se forem usados cursores em bloco, o cursor deverá recuperar várias chaves e linhas.