Partilhar via


Keyset-Driven Cursores

Um cursor controlado por conjunto de teclas situa-se entre um cursor estático e um cursor dinâmico na sua capacidade de detetar alterações. Tal como um cursor estático, nem sempre deteta alterações na pertença e ordem do conjunto de resultados. Como um cursor dinâmico, realmente deteta alterações nos valores das linhas no conjunto de resultados (sujeito ao nível de isolamento da transação, definido pelo atributo de conexão SQL_ATTR_TXN_ISOLATION).

Quando um cursor controlado por conjunto de chaves é aberto, ele guarda as chaves para todo o conjunto de resultados; isto corrige a aparente pertença e ordem do conjunto de resultados. À medida que o cursor percorre o conjunto de resultados, utiliza as teclas deste conjunto para recuperar os valores atuais de cada linha. Por exemplo, suponha que um cursor orientado por keyset obtém uma linha e outra aplicação atualiza essa linha. Se o cursor recuperar a linha, os valores que vê são os novos porque recuperou a linha usando a sua chave. Por causa disso, os cursores orientados pelo conjunto de teclas detetam sempre alterações feitas por eles próprios e por outros.

Quando o cursor tenta recuperar uma linha que foi eliminada, essa linha aparece como um "buraco" no conjunto de resultados: A chave da linha existe no conjunto de chaves, mas a linha já não existe no conjunto de resultados. Se os valores-chave numa linha forem atualizados, a linha é considerada eliminada e depois inserida, pelo que tais linhas também aparecem como lacunas no conjunto de resultados. Embora um cursor orientado a conjunto de chaves possa sempre detetar linhas eliminadas por outros, pode, opcionalmente, remover as chaves das linhas que elimina do próprio conjunto de chaves. Os cursores orientados por keysets que fazem isto não conseguem detetar as suas próprias eliminações. Se um cursor orientado por keyset específico deteta as suas próprias eliminações é reportada através da opção SQL_STATIC_SENSITIVITY no SQLGetInfo.

As linhas inseridas por outros nunca são visíveis para um cursor controlado pelo conjunto de chaves porque não existem chaves para essas linhas no conjunto de chaves. No entanto, um cursor orientado por conjunto de teclas pode, opcionalmente, adicionar ao conjunto de teclas as chaves das linhas que ele próprio insere. Os cursores orientados por keysets que fazem isto conseguem detetar os seus próprios inserts. Se um cursor orientado por conjunto de chaves deteta as suas próprias inserções, isso é indicado através da opção SQL_STATIC_SENSITIVITY no SQLGetInfo.

O array de estado da linha especificado pelo atributo da instrução SQL_ATTR_ROW_STATUS_PTR pode conter SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO ou SQL_ROW_ERROR para qualquer linha. Devolve SQL_ROW_UPDATED, SQL_ROW_DELETED ou SQL_ROW_ADDED para as linhas que deteta como atualizadas, eliminadas ou inseridas.

Os cursores orientados por conjuntos de chaves são normalmente implementados criando uma tabela temporária que contém as chaves de cada linha do conjunto de resultados. Como o cursor também tem de determinar se as linhas foram atualizadas, esta tabela também contém frequentemente uma coluna com informação de versão de linhas.

Para percorrer o conjunto de resultados original, o cursor orientado pelo conjunto de teclas 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 depois recupera os valores atuais da linha. Se forem usados cursores de bloco, o cursor deve recuperar várias chaves e linhas.