Sdílet prostřednictvím


Keyset-Driven kurzory

Kurzor řízený klávesovou sadou leží mezi statickým a dynamickým kurzorem ve své schopnosti detekovat změny. Stejně jako statický kurzor nedetekuje vždy změny členství a pořadí sady výsledků. Podobně jako dynamický kurzor detekuje změny hodnot řádků ve výsledné sadě (v závislosti na úrovni izolace transakce, jak je nastaveno atributem připojení SQL_ATTR_TXN_ISOLATION).

Při otevření kurzoru řízeného pomocí sady klíčů uloží klíče pro celou sadu výsledků; tím se opraví zjevné členství a pořadí sady výsledků. Když se kurzor prochází sadou výsledků, používá klíče v této sadě klíčů k načtení aktuálních datových hodnot pro každý řádek. Předpokládejme například, že kurzor řízený množinou klíčů načte řádek a jiná aplikace pak tento řádek aktualizuje. Pokud kurzor znovu načte řádek pomocí jeho klíče, zobrazí se nové hodnoty. Z tohoto důvodu kurzory řízené sadou klíčů vždy detekují změny provedené sami a ostatními.

Když se kurzor pokusí načíst řádek, který byl odstraněn, zobrazí se tento řádek jako "díra" v sadě výsledků: Klíč pro řádek existuje v sadě klíčů, ale řádek již ve výsledné sadě neexistuje. Pokud se hodnoty klíče v řádku aktualizují, považuje se řádek za odstraněný a vložený, takže tyto řádky se také zobrazí jako díry v sadě výsledků. I když kurzor řízený sadou klíčů může vždy rozpoznat řádky odstraněné jinými uživateli, může volitelně odebrat klíče pro řádky, které odstraní ze sady klíčů. Kurzory řízené sadou klíčových hodnot, které takto fungují, nemůžou rozpoznat vlastní mazání. Zda konkrétní kurzor řízený množinou klíčů detekuje svá vlastní odstranění, je uvedeno prostřednictvím volby SQL_STATIC_SENSITIVITY v SQLGetInfo.

Řádky vložené jinými uživateli se nikdy nezobrazují kurzorem řízeným pomocí sady klíčů, protože v sadě klíčů neexistují žádné klíče. Kurzor řízený sadou klíčů ale může volitelně přidat klíče pro řádky, které vloží do sady klíčů. Kurzory řízené sadou klíčů, které toto umožňují, můžou detekovat vlastní vkládání. Rozpoznání, jestli konkrétní kurzor řízený sadou klíčů detekuje vlastní vložení, je uvedeno prostřednictvím možnosti SQL_STATIC_SENSITIVITY v SQLGetInfo.

Pole stavu řádku určené atributem příkazu SQL_ATTR_ROW_STATUS_PTR může obsahovat SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO nebo SQL_ROW_ERROR pro libovolný řádek. Vrátí SQL_ROW_UPDATED, SQL_ROW_DELETED nebo SQL_ROW_ADDED řádků, které zjistí jako aktualizované, odstraněné nebo vložené.

Kurzory řízené sadou klíčů se běžně implementují vytvořením dočasné tabulky, která obsahuje klíče pro každý řádek v sadě výsledků. Protože kurzor musí také určit, zda byly řádky aktualizovány, tato tabulka také často obsahuje sloupec s informacemi o správě verzí řádků.

Pokud se chcete posouvat nad původní sadou výsledků, otevře kurzor řízený klávesovou sadou statický kurzor nad dočasnou tabulkou. Pokud chcete načíst řádek v původní sadě výsledků, kurzor nejprve načte příslušný klíč z dočasné tabulky a potom načte aktuální hodnoty pro řádek. Pokud se používají blokové kurzory, musí kurzor načíst více kláves a řádků.