Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Szolgáltatások váltása a Verzió legördülő listával. További információ a navigációról.
A következőkre vonatkozik: ✅ Azure Data Explorer
A adatbázis-kurzor egy adatbázisszintű objektum, amely lehetővé teszi az adatbázisok többszöri lekérdezését. Akkor is konzisztens eredményeket kaphat, ha data-append vagy data-retention műveletek történnek a lekérdezésekkel párhuzamosan.
Az adatbázis-kurzorok két fontos forgatókönyv kezelésére lettek kialakítva:
Az a lehetőség, hogy ugyanazt a lekérdezést többször megismételje, és ugyanazokat az eredményeket kapja, amennyiben a lekérdezés "ugyanazt az adatkészletet" jelzi.
A "pontosan egyszer" lekérdezés létrehozásának lehetősége. Ez a lekérdezés csak azokat az adatokat "látja", amelyeket egy korábbi lekérdezés nem látott, mert az adatok akkor nem érhetők el. A lekérdezés lehetővé teszi például a tábla összes újonnan érkezett adatának iterálását anélkül, hogy attól tartana, hogy ugyanazt a rekordot kétszer dolgozza fel, vagy véletlenül kihagyja a rekordokat.
Az adatbázis-kurzor a lekérdezés nyelvében stringtípusú skaláris értékként jelenik meg. A tényleges értéket átlátszatlannak kell tekinteni, és az érték mentésén vagy az alábbi kurzorfüggvények használatán kívül semmilyen művelet nem támogatott.
Kurzorfüggvények
A Kusto három függvényt biztosít a fenti két forgatókönyv megvalósításához:
cursor_current(): Ezzel a függvénnyel lekérheti az adatbázis-kurzor aktuális értékét. Ezt az értéket a két másik függvény argumentumaként használhatja.
cursor_after(rhs:string): Ez a speciális függvény olyan táblarekordokon használható, amelyeknél engedélyezve van a IngestionTime szabályzat. Egy
booltípusú skaláris értéket ad vissza, amely azt jelzi, hogy a rekordingestion_time()adatbázis-kurzor értéke arhsadatbázis kurzorértéke után következik-e.cursor_before_or_at(rhs:string): Ez a speciális függvény azon táblarekordokon használható, amelyeknél engedélyezve van a IngestionTime szabályzat. Egy
booltípusú skaláris értéket ad vissza, amely jelzi, hogy a rekordingestion_time()adatbázis-kurzor értéke arhsadatbázis kurzorértéke előtt vagy értékén van-e.
A két speciális függvény (cursor_after és cursor_before_or_at) szintén mellékhatással rendelkezik: Használatukkor a Kusto a lekérdezés eredményhalmazába bocsátja ki az adatbázis-kurzor @ExtendedProperties. A kurzor tulajdonságneve Cursor, értéke pedig egyetlen string.
Például:
{"Cursor" : "636040929866477946"}
Korlátozások
Az adatbázis-kurzorok csak olyan táblákkal használhatók, amelyekhez engedélyezve van a IngestionTime szabályzat. Az ilyen táblák minden rekordja az adatbázis-kurzor azon értékéhez van társítva, amely a rekord betöltésekor volt érvényben. Így a ingestion_time() függvény használható.
Az adatbázis-kurzorobjektum csak akkor rendelkezik értelmezhető értékkel, ha az adatbázis legalább egy olyan táblával rendelkezik, amely IngestionTime szabályzatot definiálni. Ez az érték garantáltan frissíti a betöltési előzmények által szükséges módon az ilyen táblákat, és a lekérdezések futnak, amelyek az ilyen táblákra hivatkoznak. Előfordulhat, hogy más esetekben frissítjük vagy sem.
A betöltési folyamat először véglegesíti az adatokat, hogy az elérhető legyen a lekérdezéshez, és csak ezután rendel hozzá egy tényleges kurzorértéket minden rekordhoz. Előfordulhat, hogy az adatok lekérdezése közvetlenül az adatbázis-kurzor használatával történő betöltése után nem tartalmazza az utolsó hozzáadott rekordokat, mert a kurzor értéke még nincs hozzárendelve. Emellett az adatbázis aktuális kurzorértékének ismételt beolvasása ugyanazt az értéket adja vissza, még akkor is, ha a betöltés a kettő között történt, mert csak a kurzor véglegesítése tudja frissíteni az értékét.
A táblák adatbázis-kurzorok alapján történő lekérdezése csak akkor garantáltan "működik" (pontosan egyszeri garanciát nyújt), ha a rekordok közvetlenül ebbe a táblába vannak betöltve. Ha olyan mértékparancsokat használ, mint például a .move extents vagy .replace extents az adatok táblázatba való áthelyezéséhez, vagy ha .rename tableparancsot használ, akkor a tábla lekérdezése adatbázis-kurzorokkal nem garantált, hogy ne hiányoznak adatok. Ennek az az oka, hogy a rekordok betöltési ideje a kezdeti betöltéskor van hozzárendelve, és nem változik az áthelyezési mértékek művelete során.
Ha a mértékek a céltáblába kerülnek, előfordulhat, hogy a hozzárendelt kurzorérték már feldolgozásra került, és az adatbázis-kurzor következő lekérdezése kihagyja az új rekordokat.
Példák:
A következő példák bemutatják, hogyan lehet pontosan egyszer feldolgozni a rekordokat.
A séma Employees[Name, Salary] tábla esetében az új rekordoknak a táblázatba való betöltésekor történő folyamatos feldolgozásához használja az alábbi eljárást:
// [Once] Enable the IngestionTime policy on table Employees
.set table Employees policy ingestiontime true
// [Once] Get all the data that the Employees table currently holds
Employees | where cursor_after('')
// The query above will return the database cursor value in
// the @ExtendedProperties result set. Lets assume that it returns
// the value '636040929866477946'
// [Many] Get all the data that was added to the Employees table
// since the previous query was run using the previously-returned
// database cursor
Employees | where cursor_after('636040929866477946') // -> 636040929866477950
Employees | where cursor_after('636040929866477950') // -> 636040929866479999
Employees | where cursor_after('636040929866479999') // -> 636040939866479000