Megosztás:


Adatok módosítása

A következőkre vonatkozik:SQL ServerAzure SQL Managed Instance

A módosítási adatok táblaértékű függvényekkel (TVF-ekkel) módosíthatók az adatrögzítés felhasználói számára. Ezeknek a függvényeknek a lekérdezéseihez két paraméterre van szükség a visszaadott eredményhalmaz fejlesztésekor figyelembe vehető naplóütemezési számok (LSN-ek) tartományának meghatározásához. Az intervallumot kötve lévő felső és alsó LSN-értékek is belefoglaltnak tekintendők az intervallumba.

Több függvény is rendelkezésre áll, amelyek segítenek meghatározni a TVF lekérdezéséhez használható megfelelő LSN-értékeket. A sys.fn_cdc_get_min_lsn függvény a rögzítési példány érvényességi időközéhez társított legkisebb LSN-t adja vissza. Az érvényességi időköz az az időintervallum, amelyre vonatkozóan a változásadatok jelenleg elérhetők a rögzítési példányokhoz. A sys.fn_cdc_get_max_lsn függvény az érvényességi intervallum legnagyobb LSN-ét adja vissza. A sys.fn_cdc_map_time_to_lsn és sys.fn_cdc_map_lsn_to_time függvények segítenek az LSN-értékek hagyományos idővonalon való elhelyezésében.

Mivel a módosítási adatrögzítés zárt lekérdezési időközöket használ, időnként létre kell hozni a következő LSN-értéket egy sorozatban, hogy a módosítások ne ismétlődjenek egymást követő lekérdezési ablakokban. A sys.fn_cdc_increment_lsn és sys.fn_cdc_decrement_lsn függvények akkor hasznosak, ha növekményes módosításra van szükség egy LSN-értékhez.

LSN-határok ellenőrzése

Javasoljuk, hogy a TVF-lekérdezésekben a használat előtt használandó LSN-határokat érvényesítse. A rögzítési példány érvényességi időtartamán kívül eső null végpontok vagy végpontok hibát kényszerítenek egy változásadat-rögzítési TVF-re.

A rendszer például az alábbi hibát adja vissza a lekérdezés minden módosításához, ha a lekérdezési időköz meghatározására használt paraméter érvénytelen, vagy nem teljes tartományba esik, vagy a sorszűrő beállítás érvénytelen.

Msg 313, Level 16, State 3, Line 1

An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ...

A nettó módosítási lekérdezéshez visszaadott hiba a következő:

Msg 313, Level 16, State 3, Line 1

An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_net_changes_ ...

Megjegyzés:

Felismerték, hogy az Msg 313 üzenete félrevezető, és nem adja meg a hiba tényleges okát. Ez a kínos használat abból ered, hogy nem lehet explicit hibát generálni a TVF-ben. Ennek ellenére a felismerhető, ha pontatlan hiba visszaadásának értéke inkább egy üres eredmény visszaadása volt előnyösebb. Az üres eredményhalmaz nem különböztethető meg egy érvényes lekérdezéstől, amely nem ad vissza módosításokat.

Az engedélyezési hibák az összes módosítás lekérdezésekor a következő módon ad vissza hibákat:

Msg 229, Level 14, State 5, Line 1

The SELECT permission was denied on the object 'fn_cdc_get_all_changes_...', database 'MyDB', schema 'cdc'.

Ugyanez igaz a nettó módosítások lekérdezésekor is:

Msg 229, Level 14, State 5, Line 1

The SELECT permission was denied on the object fn_cdc_get_net_changes_...', database 'MyDB', schema 'cdc'.

Az SQL Server Management Studióban tekintse meg a NET-módosítások számbavétele a TRY CATCH használatával című sablont, amely bemutatja, hogyan háríthatja el ezeket az ismert TVF-hibákat, és hogyan ad vissza több értelmes információt a hibáról.

Jótanács

A változásadat-rögzítési sablonok az SQL Server Management Studióban való megkereséséhez a Nézetmenüben válassza a Sablonkezelőt, bontsa ki az SQL Server-sablonokat , majd bontsa ki az Adatrögzítés módosítása mappát.

Lekérdezési függvények

A nyomon követett forrástábla jellemzőitől és a rögzítési példány konfigurálásának módjától függően a rendszer létrehoz egy vagy két TVF-et a változásadatok lekérdezéséhez.

  • A függvény cdc.fn_cdc_get_all_changes_<capture_instance> a megadott intervallumban bekövetkezett összes módosítást adja vissza. Ez a függvény mindig létrejön. A tételek mindig rendezve jelennek meg, először a változás tranzakciós véglegesítési LSN-ével, majd egy olyan értékkel, amely a módosítást a tranzakción belül rendezi. A kiválasztott sorszűrő beállítástól függően a rendszer vagy az utolsó sort adja vissza a frissítéskor (a sorszűrő "mind" lehetőség), vagy az új és a régi értékeket is a frissítéskor adja vissza (a sorszűrő beállítás "minden frissítés régi").

  • A függvény cdc.fn_cdc_get_net_changes_<capture_instance> akkor jön létre, ha a paraméter @supports_net_changes a forrástábla engedélyezésekor van beállítva 1 .

    Megjegyzés:

    Ez a beállítás csak akkor támogatott, ha a forrástábla egy meghatározott elsődleges kulccsal rendelkezik, vagy ha a paramétert @index_name egy egyedi index azonosítására használták.

    A netchanges függvény módosított forrástáblasoronként egy módosítást ad vissza. Ha a megadott intervallumban több módosítás van naplózva a sorhoz, az oszlopértékek a sor végső tartalmát tükrözik. A célkörnyezet frissítéséhez szükséges művelet helyes azonosításához a TVF-nek figyelembe kell vennie a sor kezdeti műveletét az intervallum alatt és a sor utolsó műveletét is. Ha az "all" sorszűrő beállítás meg van adva, a nettó változási lekérdezés által visszaadott műveletek beszúrás, törlés vagy frissítés (új értékek) lesznek. Ez a beállítás mindig null értékként adja vissza a frissítési maszkot, mert az összesítő maszk kiszámításához költségek tartoznak. Ha egy sor összes módosítását tükröző összesítő maszkra van szüksége, használja az "összes maszkkal" lehetőséget. Ha az alsóbb rétegbeli feldolgozáshoz nem szükséges megkülönböztetni a beszúrásokat és a frissítéseket, használja az "összes az egyesítéssel" lehetőséget. Ebben az esetben a művelet értéke csak két értéket vesz fel: 1-et a törléshez, 5-öt pedig egy olyan művelethez, amely lehet beszúrás vagy frissítés. Ez a beállítás kiküszöböli a további feldolgozást annak megállapításához, hogy a származtatott művelet beszúrásnak vagy frissítésnek kell-e lennie, és javíthatja a lekérdezés teljesítményét, ha ez a különbség nem szükséges.

A lekérdezési függvényből visszaadott frissítési maszk egy kompakt ábrázolás, amely a változási adatok sorában módosított összes oszlopot azonosítja. Ez az információ általában csak a rögzített oszlopok egy kis részhalmazához szükséges. A függvények az alkalmazások által közvetlenül használható formában segítenek kinyerni az információkat a maszkból. A függvény sys.fn_cdc_get_column_ordinal egy adott rögzítési példány nevesített oszlopának sorszámát adja vissza, míg a sys.fn_cdc_is_bit_set függvény a megadott maszkban lévő bit paritását adja vissza a függvényhívásban átadott sorszám alapján. Ez a két függvény együttesen lehetővé teszi a frissítési maszkból származó információk hatékony kinyerését és visszaadését a módosítási adatok kérésével. Az SQL Server Management Studióban az Enumerate Net Changes Using All With Mask (Összes maszk használata ) című sablonból megtudhatja, hogyan használják ezeket a függvényeket.

Lekérdezési függvény forgatókönyvei

Az alábbi szakaszok a változásadat-rögzítési adatok lekérdezésének gyakori forgatókönyveit ismertetik a lekérdezési függvények cdc.fn_cdc_get_all_changes_<capture_instance> és cdc.fn_cdc_get_net_changes_<capture_instance>a .

Lekérdezés a rögzítési példány érvényességi időtartamán belüli összes módosításhoz

A legegyértelmesebb változásadatokra vonatkozó kérés az, amely egy rögzítési példány érvényességi időközében adja vissza az összes aktuális változási adatot. A kérés elvégzéséhez először határozza meg az érvényességi időköz alsó és felső LSN-határait. Ezután ezekkel az értékekkel azonosíthatja a paramétereket @from_lsn , és @to_lsn továbbíthatja a lekérdezési függvénynek cdc.fn_cdc_get_all_changes_<capture_instance> vagy cdc.fn_cdc_get_net_changes_<capture_instance>a . A sys.fn_cdc_get_min_lsn függvény használatával szerezze be az alsó határt, a felső kötést pedig sys.fn_cdc_get_max_lsn . Az SQL Server Management Studióban tekintse meg a mintakód érvényes tartományának összes módosításának felsorolását a lekérdezési függvény cdc.fn_cdc_get_all_changes_<capture_instance>használatával az összes aktuális érvényes módosítás lekérdezéséhez. Az SQL Server Management Studióban az Érvényes tartomány nettó változásainak számbavétele sablonban talál hasonló példát a függvény cdc.fn_cdc_get_net_changes_<capture_instance>használatára.

Az összes új módosítás lekérdezése az utolsó módosításkészlet óta

A tipikus alkalmazások esetében a változásadatok lekérdezése folyamatban van, és rendszeres kéréseket hajt végre az utolsó kérés óta történt összes módosításra vonatkozóan. Ilyen lekérdezések esetén az sys.fn_cdc_increment_lsn függvénnyel az aktuális lekérdezés alsó határát az előző lekérdezés felső határából származtathatja. Ez a módszer biztosítja, hogy ne ismétlődnek sorok, mert a lekérdezési időköz mindig zárt intervallumként van kezelve, ahol mindkét végpont szerepel az intervallumban. Ezután a sys.fn_cdc_get_max_lsn függvénnyel szerezze be az új kérelemintervallum csúcspontját. Az SQL Server Management Studióban tekintse meg az Enumerate All Changes Since Previous Request for sample code sablont, amely szisztematikusan áthelyezi a lekérdezési ablakot, hogy beolvassa az összes módosítást az utolsó kérés óta.

Az összes új módosítás lekérdezése mostanáig

A lekérdezési függvény által visszaadott módosításokra jellemző korlátozás, hogy csak azokat a módosításokat tartalmazza, amelyek az előző kérés között történtek az aktuális dátumig és időpontig. Ehhez a lekérdezéshez alkalmazza a függvényt sys.fn_cdc_increment_lsn az @from_lsn előző kérelemben használt értékre az alsó határ meghatározásához. Mivel az időintervallum felső határa adott időpontként van kifejezve, azt LSN-értékké kell konvertálni, mielőtt egy lekérdezési függvény használná. Ahhoz, hogy a dátum/idő érték megfelelő LSN-értékké konvertálható legyen, győződjön meg arról, hogy a rögzítési folyamat feldolgozta a megadott felső korláton keresztül véglegesített összes módosítást. Erre azért van szükség, hogy az összes megfelelő módosítást propagálja a változástáblába. Ennek egyik módja egy olyan várakozási ciklus felépítése, amely rendszeres időközönként ellenőrzi, hogy az adatbázis-módosítási táblákhoz rögzített jelenlegi maximális véglegesítési idő meghaladja-e a kérési időköz kívánt befejezési idejét.

Miután a késleltetési ciklus ellenőrizte, hogy a rögzítési folyamat már feldolgozta-e az összes vonatkozó naplóbejegyzést, használja a sys.fn_cdc_map_time_to_lsn függvényt az új, LSN-értékként kifejezett csúcspont meghatározásához. Annak érdekében, hogy a megadott idő alatt véglegesített összes bejegyzés lekérhető legyen, hívja meg a függvényt sys.fn_cdc_map_time_to_lsn, és használja a "legnagyobb kisebb vagy egyenlő" lehetőséget.

Megjegyzés:

Inaktivitási időszakokban a rendszer hozzáad egy próbabejegyzést a táblához cdc.lsn_time_mapping annak jelzésére, hogy a rögzítési folyamat egy adott véglegesítési időpontig feldolgozta a módosításokat. Ez megakadályozza, hogy megjelenjen, hogy a rögzítési folyamat lemaradt, ha egyszerűen nincsenek legutóbbi módosítások a folyamatban.

Az Enumerate All Change Up Until Now sablon bemutatja, hogyan használható az előző stratégia a változásadatok lekérdezésére.

Véglegesítési idő hozzáadása az összes módosítás eredményhalmazához

Az adatbázis-módosítási táblában társított bejegyzéssel rendelkező tranzakciók véglegesítési ideje a cdc.lsn_time_mapping táblában érhető el. Ha egy táblabejegyzés start_lsn értékével cdc.lsn_time_mapping egy kérelemben visszaadott __$start_lsn értéket összekapcsolja, a tran_end_time és a módosítási adatok is visszaadhatók, hogy a módosítást a tranzakció véglegesítési időpontjával együtt a forrásnál bélyegezze. A sablon véglegesítési idő hozzáfűzése az összes módosítás eredményhalmazához bemutatja, hogyan lehet ezt az illesztés végrehajtását elvégezni.

Adatmódosítás összekapcsolása más adatokkal ugyanabból a tranzakcióból

Időnként hasznos lehet a változásadatok összekapcsolása a tranzakcióval kapcsolatos egyéb adatokkal, amikor a tranzakciót a forrásnál véglegesítették. A tran_begin_lsn táblázat cdc.lsn_time_mapping oszlopa az ilyen illesztéshez szükséges információkat tartalmazza. A forrás frissítésekor a rendszer dinamikus nézetéből származó database_transaction_begin_lsn értékét sys.dm_tran_database_transactions menteni kell, a módosítási adatokhoz csatlakoztatandó egyéb adatokkal együtt. A függvény fn_convertnumericlsntobinary használatával hasonlítsa össze az értékeket és tran_begin_lsn az database_transaction_begin_lsn értékeket. A függvény létrehozásához szükséges kód a Függvény létrehozása fn_convertnumericlsntobinarysablonban érhető el. A "Return All Changes with a Given" (Minden módosítás visszaadása adotttran_begin_lsn) sablon bemutatja, hogyan lehet befolyásolni az illesztéseket.

Lekérdezés DateTime Burkolófüggvények használatával

A változásadatok lekérdezésének tipikus alkalmazási forgatókönyve a változásadatok rendszeres kérése a dátum/idő értékek által határolt csúsztatási ablak használatával. Ebben a fogyasztói osztályban a változásadat-rögzítés biztosítja a tárolt eljárást sys.sp_cdc_generate_wrapper_function , amely szkripteket hoz létre egyéni burkolófüggvények létrehozásához a módosítási adatrögzítési lekérdezési függvényekhez. Ezek az egyéni burkolók lehetővé teszik, hogy a lekérdezés időköze dátum/idő párként legyen kifejezve.

A tárolt eljárás hívási beállításai lehetővé teszik a burkolók generálását az összes olyan rögzítési példányhoz, amelyhez a hívó hozzáfér, vagy csak egy adott rögzítési példányhoz. A támogatott lehetőségek közé tartozik az is, hogy megadhatja, hogy a rögzítési időköz felső végpontja nyitva vagy bezárva legyen-e, a rendelkezésre álló rögzített oszlopok közül melyiket kell belefoglalni az eredményhalmazba, és hogy a belefoglalt oszlopok közül melyiknek kell társított frissítésjelzőkkel rendelkeznie. Az eljárás egy két oszlopból álló eredményhalmazt ad vissza: a létrehozott függvény nevét, amely a rögzítési példány nevéből származik, és a burkoló tárolt eljáráshoz tartozó létrehozási utasítást. Az összes módosítási lekérdezést beburkoló függvény mindig létrejön. Ha a paraméter a @supports_net_changes rögzítési példány létrehozásakor lett beállítva, a rendszer létrehozza a nettó módosítási függvényt burkoló függvényt is.

Az alkalmazástervező feladata, hogy meghívja a szkriptgenerálási tárolt eljárást a burkoló által tárolt eljárások létrehozási utasításainak létrehozásához, valamint az eredményként kapott létrehozási szkriptek végrehajtásához a függvények létrehozásához. Ez nem történik meg automatikusan egy rögzítési példány létrehozásakor.

A datetime burkolók a felhasználó tulajdonában vannak, és nem a hívó alapértelmezett sémájában jönnek létre. A létrehozott függvény módosítás nélkül használható a felhasználók többsége számára. A függvény létrehozása előtt azonban mindig alkalmazhat további testreszabást a létrehozott szkriptre.

Az összes módosítási lekérdezést fn_all_changes_ beburkoló függvény nevét a rögzítési példány neve követi. A net changes burkolóhoz használt előtag a .fn_net_changes_ Mindkét függvény három argumentumot vesz fel, ugyanúgy, mint a hozzájuk tartozó változásadat-rögzítési TVF-eket. A burkoló lekérdezési időközét azonban két dátum/idő érték határolja, nem pedig két LSN-érték. Mindkét @row_filter_option függvénycsoport paramétere megegyezik.

A létrehozott burkolófüggvények a következő konvenciót támogatják a változásadat-rögzítési idővonal szisztematikus követésére: Az azt követő intervallum paramétereként várhatóan @end_time az előző intervallum paraméterét kell használni @start_time . A burkoló függvény gondoskodik a datetime értékek LSN-értékekre való leképezéséről, és gondoskodik arról, hogy a konvenciók követése esetén ne vesszenek el vagy ismétlődjenek meg adatok.

A burkolók úgy hozhatók létre, hogy a megadott lekérdezési ablakban egy zárt felső vagy egy nyitott felső kötést támogassanak. Ez azt jelzi, hogy a hívó megadhatja, hogy a kinyerési időköz felső határával egyenlő véglegesítési idővel rendelkező bejegyzések szerepeljenek-e az intervallumon belül. Alapértelmezés szerint a felső korlát is benne van.

Bár a létrehozott lekérdezési TVF-ek meghiúsulnak, ha null értéket ad meg az @from_lsn értékhez vagy az @to_lsn értékhez, a datetime burkoló függvények null érték használatával teszik lehetővé, hogy a datetime burkolók az összes aktuális módosítást visszaadják. Vagyis ha a lekérdezési ablak alsó végpontjaként null értéket ad át a datetime burkolónak, a rendszer a rögzítési példány érvényességi időközének alacsony végpontját használja a lekérdezési TVF-hez alkalmazott mögöttes SELECT utasításban. Hasonlóképpen, ha a lekérdezési ablak felső végpontjaként null értéket ad át, a rendszer a rögzítési példány érvényességi időközének felső végpontját használja a lekérdezési TVF-ből való kiválasztáskor.

A burkolófüggvény által visszaadott eredményhalmaz tartalmazza az összes kért oszlopot, majd egy műveleti oszlopot, amely egy vagy két karakterből áll, hogy azonosítsa a sorhoz társított műveletet. Ha a frissítésjelzőket kérték, azok bitoszlopként jelennek meg a műveleti kód után, a @update_flag_list paraméterben megadott sorrendben. A létrehozott datetime burkolók testreszabásának hívási lehetőségeiről további információt a sys.sp_cdc_generate_wrapper_function (Transact-SQL) című témakörben talál.

A sablon példányosít egy Burkoló TVF-t a frissítési jelzővel , amely bemutatja, hogyan szabhat testre egy létrehozott burkolófüggvényt egy adott oszlop frissítésjelzőjének hozzáfűzéséhez a net changes lekérdezés által visszaadott eredménykészlethez. A séma CDC Burkoló TVF-jeinek példányosítása sablon azt mutatja be, hogyan példányosíthatja a lekérdezési TVF-ek Datetime Burkolóit az adott adatbázisséma forrástábláihoz létrehozott összes rögzítési példányhoz.

Ha például egy dátum/idő burkoló használatával kérdezi le a változásadatokat, az SQL Server Management Studióban tekintse meg a Sablon Get Net Changes using Burr with Update Flags (Nettó módosítások lekérése a burkolóval frissítésjelzőkkel) című témakört. Ez a sablon bemutatja, hogyan kérdezhetők le a burkolófüggvények nettó változásai, ha a burkoló a frissítésjelzők visszaadására van konfigurálva. A "mind maszkkal" sorszűrő beállításra van szükség ahhoz, hogy a mögöttes lekérdezési függvény egy nem null értékű frissítési maszkot adjon vissza a frissítéshez. A rendszer null értékeket ad át az alsó és a felső dátum/idő intervallum határa számára, hogy jelezhesse a függvénynek, hogy az alacsony végpontot és a rögzítési példány érvényességi időközének magas végpontját használja az alapul szolgáló LSN-alapú lekérdezés végrehajtásakor. A lekérdezés egy sort ad vissza egy forrássor minden módosításához, amely a rögzítési példány érvényes tartományán belül történt.

A DateTime Burkolófüggvények használatával válthat a rögzítési példányok között

Az adatrögzítés módosítása legfeljebb két rögzítési példányt támogat egyetlen nyomon követett forrástáblához. Ennek a funkciónak a fő funkciója a több rögzítési példány közötti átmenet elhelyezése, amikor az adatdefiníció nyelve (DDL) a forrástáblára változik, kibővíti a nyomon követéshez elérhető oszlopok készletét. Amikor új rögzítési példányra vált, az alapul szolgáló lekérdezési függvények nevének változásaival szembeni magasabb alkalmazásszintek védelmének egyik módja egy burkolófüggvény használata az alapul szolgáló hívás burkolásához. Ezután győződjön meg arról, hogy a burkolófüggvény neve változatlan marad. A kapcsoló használatakor a régi burkolófüggvény elvethető, és létrejön egy új, ugyanazzal a névvel rendelkező függvény, amely az új lekérdezési függvényekre hivatkozik. Ha először módosítja a létrehozott szkriptet egy azonos nevű burkolófüggvény létrehozásához, a magasabb alkalmazásrétegek befolyásolása nélkül átválthat egy új rögzítési példányra.