Partager via


Curseurs de jeux de clés (moteur de base de données)

L'appartenance et l'ordre des lignes d'un curseur de jeux de clés sont fixés au moment de l'ouverture du curseur. Les curseurs de jeux de clés sont gérés par un ensemble d'identificateurs uniques (clés) appelé jeu de clés. Les clés sont créées à partir d'un ensemble de colonnes qui identifient uniquement les lignes de l'ensemble de résultats. Le jeu de clés est l'ensemble des valeurs des clés de toutes les lignes remplissant les conditions requises par l'instruction SELECT au moment où le curseur a été ouvert. Le jeu de clés d'un curseur de jeux de clés est créé dans tempdb au moment de l'ouverture du curseur.

Les modifications apportées aux valeurs des données figurant dans les colonnes ne faisant pas partie du jeu de clés (effectuées par le propriétaire du curseur ou par d'autres utilisateurs) sont visibles lorsque l'utilisateur parcourt le curseur. Les insertions effectuées dans la base de données en dehors du curseur ne sont pas visibles dans celui-ci à moins de le fermer puis de le rouvrir. Les insertions effectuées via le curseur, à l'aide d'une fonction API, telle que la fonction SQLSetPos ODBC, sont affichées à la fin du curseur. @@FETCH_STATUS retourne un état « row missing » en cas de tentative d'extraction d'une ligne ayant été supprimée après l'ouverture du curseur. La mise à jour d'une colonne de clé équivaut à la suppression d'une ancienne valeur de clé suivie de l'insertion d'une nouvelle valeur de clé. La nouvelle valeur de clé n'est pas visible si la mise à jour n'a pas été effectuée à l'aide du curseur. En revanche, elle est visible à la fin du curseur si la mise à jour a été effectuée à l'aide du curseur, au moyen d'une fonction API, telle que SQLSetPos ou de la clause Transact-SQL WHERE CURRENT OF et que la clause FROM de l'instruction SELECT ne contenait pas de condition JOIN. La nouvelle valeur de clé n'est pas visible si la clause FROM de l'instruction INSERT contenait une table distante. Les tentatives d'extraction de l'ancienne valeur de clé génèrent le même état « row missing » que dans le cas d'une tentative d'extraction de ligne supprimée.

[!REMARQUE]

Un index sur une colonne calculée ne peut être utilisé lors de la déclaration d'un curseur de jeux de clés sur une table distante. Vous pouvez créer un autre index pour fournir les clés uniques pour cette table distante.