Udostępnij za pośrednictwem


Zmiana danych

Zmień dane są udostępniane zmienić konsumentów przechwytywania danych przez tabela-wycenione funkcje (TVFs).Wszystkie kwerendy z tych funkcji wymaga dwa parametry do definiowania zakres z dziennika sekwencji numerów (LSNs), które są uwzględniane podczas tworzenia zestaw wyników zwróconych.Zarówno górną i dolną LSN wartości, które powiązane interwału są uważane za zawarte w przedziale.

Niektóre funkcje są dostarczane określić odpowiednie wartości LSN do użytku w TVF kwerend.Funkcja sys.fn_cdc_get_min_lsn zwraca najmniejszą LSN, skojarzony z okres ważności wystąpienie przechwytywania.Okres ważności jest czas interwał, dla których zmiana danych jest obecnie dostępne dla jego wystąpień przechwytywania.Funkcja sys.fn_cdc_get_max_lsn zwraca największą LSN okres ważności.Funkcje sys.fn_cdc_map_time_to_lsn i sys.fn_cdc_map_lsn_to_time są dostępne umieścić LSN wartości na osi czasu konwencjonalnych.Ponieważ zmiana przechwytywania danych używa kwerendy zamkniętych interwały, czasami konieczne jest do generowania następna wartość LSN w sekwencji zapewniające zmiany nie są duplikowane w systemie windows kolejne kwerendy.Funkcje sys.fn_cdc_increment_lsn i sys.fn_cdc_decrement_lsn są przydatne, gdy wymagane jest przyrostowe dostosowania wartości LSN.

Sprawdzanie poprawności granice LSN

Zaleca się, aby sprawdzanie poprawności granic LSN, które mają być używane w kwerendzie TVF przed ich użyciem.Punkty końcowe null lub punktów końcowych, leżące poza okres ważności wystąpienie przechwytywania wymusi błędów zwracanych przez zmianę przechwytywania danych TVF.

Na przykład następujący błąd jest zwracany dla kwerendy dla wszystkich zmian, gdy parametr, który jest używany do definiowania interwał kwerendy jest nieprawidłowy lub jest spoza zakres lub opcja wiersz filtru jest nieprawidłowa.

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_ ...

Zwrócony odpowiedniego dla net changes kwerenda jest następujący:

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_ ...

Ostrzeżenie

Uznaje się, że wiadomość dla Msg 313 jest mylące i nie przekazuj rzeczywistą przyczyną awarii.To obciążenie nieodpowiednich wynika z niezdolność do podniesienia jawny błąd w TVF.Jednakże wartość zwracać błąd rozpoznawalne, jeżeli nieścisłe, został uznany za lepiej po prostu zwracanie wyników puste.Zestaw wyników puste nie byłoby odróżnialne od prawidłowej kwerendy zwracać żadnych zmian.

Awarie autoryzacji będzie zwracać błędy podczas badania wszystkie zmiany jak pokazano:

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'.

To samo dotyczy podczas badania obroty netto:

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'.

Zobacz szablon Enumerate Net Changes Using TRY CATCH do demonstracji sposobu przechwycić te znane błędy TVF i zwrócić więcej istotnych informacji o awarii.

Ostrzeżenie

Zlokalizować zmiana szablony przechwytywania danych w programie SQL Server Management Studio na widoku menu, kliknij Eksplorator szablonów, rozwiń Szablonów serwera SQL , a następnie rozwiń Zmienić przechwytywania danych folder.

Funkcje kwerendy

W zależności od charakterystyki źródło tabela śledzone i sposób, w którym skonfigurowano jego wystąpienie przechwytywania, jeden lub dwa TVFs dla kwerend Zmień dane są generowane.

  • Funkcja cdc.fn_cdc_get_all_changes_<capture_instance> zwraca wszystkie zmiany, które wystąpił dla określonego interwału.Ta funkcja zawsze jest generowany.Wpisy są zawsze zwracane posortowane, najpierw przez zlecania zatwierdzanie LSN zmiany, a następnie przez wartość, która Sekwencje zmiany w obrębie zatwierdzanie.W zależności od wybranego wiersza filtru opcja Wiersz końcowy jest zwracana aktualizacji (wiersz filtru opcja "wszystkie") lub zwracanych wartości nowych i starych aktualizacji (opcja wiersz filtru "Aktualizuj wszystkie stare" ").

  • Funkcja cdc.fn_cdc_get_net_changes_<capture_instance> jest generowany, gdy parametr @ supports_net_changes jest ustawiona na 1, gdy źródło tabela jest włączona.

    Ostrzeżenie

    Ta opcja jest obsługiwana tylko źródło tabela ma zdefiniowany klucz podstawowy lub, jeśli parametr @ index_name został użyty do identyfikacji indeks unikatowy.

    The netchanges function returns one change per modified source table row.Więcej niż jednej zmiany jest rejestrowany w przedziale wiersza kolumna wartości odzwierciedlają końcową zawartość wiersza.Prawidłowo zidentyfikować operacji, która jest konieczna aktualizacja miejsce docelowe środowiska, TVF należy wziąć pod uwagę zarówno początkowej operacji w wierszu w przedziale, jak i ostatniej operacji w wierszu.Podczas filtrowania wierszy opcji 'all' określono, operacje, które są zwracane przez net changes kwerendy będą albo być insert, delete lub update (nowe wartości).Opcja zawsze zwraca maskę aktualizacji jako null, ponieważ koszty związane z computing wartość zagregowana maski.Jeśli maska wartość zagregowana, który odzwierciedla wszystkie zmiany do wiersza, używaj "wszystkie maski" Opcja.Jeśli przetwarzanie niższego rzędu nie wymagają, INSERT i Update należy odróżnić, użyj "z scalania" Opcja.W tym przypadek wartość operacji zajmie tylko na dwóch wartości: 1 Usuń i 5 dla operacji, która może być insert lub update.Ta opcja eliminuje dodatkowego przetwarzania potrzebne do określenia, czy operacja pochodnych powinna być insert lub update i może poprawić wydajność kwerendy tego zróżnicowania nie jest konieczne.

Maska aktualizacji zwrócone z funkcja kwerendy jest reprezentacja compact identyfikuje wszystkie kolumny, zmienionych w wierszu Zmień dane.Informacja ta jest zazwyczaj tylko wymagane dla podzbiór kolumn przechwycone.Funkcje są dostępne w wyodrębnianie informacji z maski w formularzu, który jest bardziej bezpośrednio używany przez aplikacje.Funkcja sys.fn_cdc_get_column_ordinal zwraca porządkowym nazwane kolumna dla wystąpienie danej przechwytywania, dlatego funkcja sys.fn_cdc_is_bit_set zwraca parzystości bit w podanej maski opartej na porządkowych, który został przekazany w wywołaniu funkcji.Razem te dwie funkcje umożliwiają informacji z maski aktualizacji do skutecznej ekstrahowane i zwrócił się z wnioskiem o zmianę danych.Zobacz szablon Enumerate Net Changes Using All With Mask do demonstracji sposobu użycia tych funkcji.

Scenariusze funkcji kwerendy

W poniższych sekcjach opisano typowe scenariusze kwerendy zmiana danych przechwytywania danych przy użyciu funkcji kwerendy cdc.fn_cdc_get_all_changes_<capture_instance> i cdc.fn_cdc_get_net_changes_<capture_instance>.

Podczas badania wszystkie zmiany okresu ważności wystąpienia przechwytywania

Najprostszą żądanie zmiany danych jest zwraca wszystkie bieżące zmiany w okres ważności wystąpienie przechwytywania danych.Aby to żądanie, należy najpierw określić dolnymi i górnymi granicami LSN okres ważności.Następnie należy użyć tych wartości do identyfikacji parametrów @ from_lsn i @ to_lsn przekazany do funkcja kwerendy cdc.fn_cdc_get_all_changes_<capture_instance> lub cdc.fn_cdc_get_net_changes_<capture_instance>.Użyj funkcja sys.fn_cdc_get_min_lsn uzyskać dolna granica i sys.fn_cdc_get_max_lsn uzyskać górną granicą.Zobacz szablon Enumerate All Changes for the Valid Range Przykładowy kod dla wszystkich bieżących zmian ważne przy użyciu funkcja kwerendy kwerendy cdc.fn_cdc_get_all_changes_<capture_instance>.Zobacz szablon Enumerate Net Changes for the Valid Range podobny przykład użycia funkcja cdc.fn_cdc_get_net_changes_<capture_instance>.

Wykonywanie kwerend dla wszystkich nowych zmian od czasu ostatniego zestaw zmian

Dla typowych aplikacji Zmień dane kwerendy będzie trwającego procesu dokonywania żądań okresowych wszystkie zmiany, które wystąpiły od ostatniego żądania.Takie kwerend, można użyć funkcja sys.fn_cdc_increment_lsn do uzyskania dolną granicą bieżącej kwerendy z górną granicą poprzedniej kwerendy.Metoda ta zapewnia, że żadne wiersze są powtarzane, ponieważ interwał kwerendy jest zawsze traktowane jako przedział zamknięty gdy oba punkty końcowe są uwzględnione w danym okresie.Następnie należy użyć funkcja sys.fn_cdc_get_max_lsn się uzyskać wysoką końcową nowy interwał żądania.Zobacz szablon Enumerate All Changes Since Previous Request Przykładowy kod systematycznie przenieść okno kwerendy, aby uzyskać wszystkie zmiany od ostatniego żądania.

Wykonywanie kwerend dla wszystkich nowych zmian aż teraz

Typowe ograniczenia, które znajduje się na zmiany, zwracana przez funkcja kwerendy jest uwzględnienie zmian, które miały miejsce między poprzedniego żądania do bieżącej data i czas.Dla tej kwerendy, należy zastosować funkcja sys.fn_cdc_increment_lsn do @ from_lsn wartości użytej w poprzednim żądaniu do określenia dolną granicą.Ponieważ górnej związany na czas interwał jest wyrażony jako konkretny punkt w czas, muszą zostać przekonwertowane na wartość LSN przed użyciem funkcji kwerendy.Przed odpowiedniej wartości LSN można przekonwertować wartości datetime, należy się upewnić, że proces przechwytywania przetworzył wszystkie zmiany, które zostały zatwierdzone przez określonej górnej granicy.Jest to wymagane do zapewnienia dostosowywanego zmiany zostały rozpropagowane tabela Zmiana.Jednym ze sposobów jest struktura pętli oczekiwania, który okresowo sprawdza, jeśli bieżący lsn zatwierdzanie maksymalną zarejestrowane do tabela bazy danych zmiany przekracza pożądanego celu czas interwału żądania.

Po Opóźnienie pętli weryfikuje proces przechwytywania przetworzył już wszystkie wpisy dziennika odpowiednie, należy użyć funkcja sys.fn_cdc_map_time_to_lsn do określenia nowych końcową wysoki, wyrażona jako wartość LSN.W celu zapewnienia, że pobierane są wszystkie wpisy, które zostały zatwierdzone przez określony czas, należy wywołać funkcja sys.fn_cdc_map_time_to_lsni użyj opcji "największą mniejsze niż lub równe".

Ostrzeżenie

W okresach bezczynności fikcyjny wpis jest dodawane do tabela cdc.lsn_time_mapping do oznaczenia fakt, że proces przechwytywania ma przetworzenia zmiany do zatwierdzenia danego czas.To zapobiega wyświetlaniu spada proces przechwytywania związanego, gdy są po prostu nie ostatnich zmian do procesu.

Szablon Enumerate All Changes Up Until Now przedstawiono sposób użycia strategii poprzedniej kwerendy w celu zmiany danych.

Dodanie czasu zatwierdzenia do wszystkich wyników zmiany zestawu

Czas zatwierdzanie każdej zatwierdzanie skojarzony wpis w bazie danych zmian jest dostępne w tabela cdc.lsn_time_mapping.Sprzęgając __$start_lsn zwracana wartość w żądaniu, wszystkie zmiany z start_lsn wartość cdc.lsn_time_mapping wpis w tabela, można zwrócić tran_end_time wraz z danymi zmiana stempla Zmień czas zatwierdzanie zatwierdzanie u źródło.Szablon Append Commit Time to All Changes Result Set przedstawiono sposób wykonywania łączyć.

Dołączanie do zmiany danych z innymi danymi z tej samej transakcji

Niekiedy warto dołączyć Zmień dane z innych informacji zebranych o transakcji, gdy została zatwierdzona na źródło. tran_begin_lsn kolumna w tabela cdc.lsn_time_mapping zawiera informacje potrzebne do wykonania takiego łączyć.Gdy wystąpi aktualizacji źródło, wartość dla database_transaction_begin_lsn z widoku dynamicznego systemu sys.dm_tran_database_transactions musi być zapisany wraz z innymi informacjami z Zmień dane.Użyj funkcja fn_convertnumericlsntobinary do porównywania database_transaction_begin_lsn i tran_begin_lsn wartości.Kod w celu utworzenia tej funkcja jest dostępnych w szablonie Create Function fn_convertnumericlsntobinary.Szablon Return All Changes with a Given tran_begin_lsn ilustruje sposób skutek łączyć.

Badanie przy użyciu funkcji Datetime otoki

Scenariusz Typowa aplikacja dla kwerend zmiana danych jest okresowo żądania zmiany danych przy użyciu okna wysuwane poprowadzoną wartości datetime.Dla tej klasy odbiorców przechwytywania danych zmian zawiera procedura składowana sys.sp_cdc_generate_wrapper_function , generuje skrypty tworzenia otoki niestandardowych funkcji dla funkcji kwerendy przechwytywania danych zmian.Te niestandardowe otok umożliwiają interwał kwerendy wyrażone jako parę datetime.

Opcje telefonicznej dla procedura składowana umożliwiają otok ma być generowana dla wszystkich przechwytywania wystąpienies, że obiekt wywołujący ma dostęp do lub określonego przechwytywania wystąpienie.Obsługiwane opcje obejmują także możliwość określenia, czy wysoką końcową interwału przechwytywania powinny być otwarte lub zamknięte, które dostępnych kolumn przechwyconych powinny być uwzględnione zestaw wyników i które uwzględnionych kolumn należy skojarzony flagi aktualizacji.Procedura zwraca zestaw wyników zawierający dwie kolumny: Nazwa funkcja wygenerowane z przechwytywania derivable wystąpienie nazwę i instrukcja create otoka procedura składowana.Funkcja oblewania wszystkie zmiany kwerendy zawsze jest generowany.Jeśli @ supports_net_changes został parametr zestaw podczas tworzenia instancji przechwytywania, generowany jest również funkcja oblewania Funkcja Obroty netto.

Jest odpowiedzialny za projektanta aplikacji do wywołania procedura składowana generowanie skryptu wygenerować instrukcje tworzenia otoki przechowywane procedury i do wykonać wynikowy tworzyć skrypty służące do tworzenia funkcje.To nie nastąpi automatycznie podczas przechwytywania wystąpienie jest tworzony.

DATETIME otok będące własnością użytkownika i nie są tworzone w domyślnego schematu wywołującego.Funkcja generowane jest odpowiednia bez modyfikacji dla większości użytkowników.Jednakże dalsze dostosowania można zawsze dotyczą wygenerowany skrypt przed do tworzenia funkcja.

Nazwę funkcja, aby otoczyć wszystkie zmiany, kwerenda jest fn_all_changes_ następuje nazwa wystąpienie przechwytywania.Prefiks używany dla otoki obroty netto jest fn_net_changes_.Obie funkcje podjąć trzy argumenty, podobnie jak ich TVFs przechwytywania danych skojarzone zmiany.Jednak interwał kwerendy otoki jest ograniczone przez dwie wartości datetime zamiast niż przez dwie wartości LSN. @ Row_filter_option parametr dla obu zestawów funkcji są takie same.

Funkcje wygenerowanych otoki obsługę systematycznie wykorzystaniem przechodzenia po bitach osi czasu przechwytywania danych zmiana następującej konwencji: Oczekuje się, że @ end_time parametr poprzedniego interwału służyć jako @ start_time parametru Interwał kolejnych.Funkcja otoki opiekuje się mapowanie wartości datetime LSN wartości i zapewnienie, że dane nie zostanie utracony lub powtarzane, jeśli następuje niniejszej Konwencji.

Mogą być generowane otok do obsługi zamkniętej górna granica lub Otwórz górna granica na określone okno kwerendy.Oznacza to, że wywołującego można określić, czy czas zatwierdzanie równa górnej granicy interwału ekstrakcji wpisy mają być uwzględnione w przedziale.Górna granica jest domyślnie włączone.

Podczas generowanej kwerendy TVFs błędów, jeśli podana wartość null dla albo @ from_lsn wartość lub @ to_lsn wartość funkcji datetime otoki użyć wartości null, aby umożliwić otok datetime zwrócić wszystkie bieżące zmiany.Oznacza to, że jeśli null jest przekazywany jako niski końcowego okna kwerendy do otoki datetime, niskie punkt końcowy okres ważności wystąpienie przechwytywania jest używany w instrukcja SELECT podstawowej stosowanej w kwerendzie TVF.Podobnie jeśli null jest przekazywany jako wysoką końcową okna kwerendy, wysoki końcowy okres ważności wystąpienie przechwytywania jest używana podczas wybierania z kwerendy TVF.

Zestaw wyników zwróconych przez funkcja otoki zawiera żądanej kolumna, następuje kolumnie operacji recoded jako jeden lub dwa znaki do identyfikowania operacji, który jest skojarzony z wierszem.Jeśli zażądano aktualizacji flagi pojawiają się jako kolumny bit po kod operacji, w kolejności określonej w @ update_flag_list parametru.Informacje wywołującego opcje dostosowywania otok wygenerowanych datetime, zobacz sys.sp_cdc_generate_wrapper_function (języka Transact-SQL).

Szablon Instantiate a Wrapper TVF With Update Flag pokazuje sposób dostosowywania funkcja wygenerowanych otoki dołączyć flagę aktualizacji dla określonej kolumna zestaw wyników zwrócone przez kwerendę obroty netto.Szablon Instantiate CDC Wrapper TVFs for a Schema przedstawiono sposób tworzenia wystąpienia Datetime Wrappers for the Query TVFs dla wszystkich wystąpień przechwytywania utworzone dla źródło tabel w schemacie bazy danych.

Na przykład używa otoki datetime do kwerendy dla zmiany danych, zobacz szablon Get Net Changes Using Wrapper With Update Flags.Ten szablon ilustruje kwerendę obroty netto z otoką funkcja Gdy otoka jest skonfigurowane do zwracania flagi aktualizacji.Uwaga, że wiersz filtru opcja "wszystkie maski" jest wymagany dla funkcja kwerendy podstawowej do zwrotu nie-null maski aktualizacji na aktualizację.Wartości Null są przekazywane dla obu datetime górnej i dolnej interwał granice do sygnalizowania funkcja służących do punktu końcowego niski i wysoki punkt końcowy okres ważności wystąpienie przechwytywania podczas wykonywania podstawowych LSN podstawie kwerendy.Kwerenda zwraca jeden wiersz dla każdej modyfikacji źródło wiersz, który wystąpił prawidłowego zakres dla wystąpienie przechwytywania.

Za pomocą funkcji Datetime otoki przejścia między wystąpieniami przechwytywania

Zmiana przechwytywania danych obsługuje maksymalnie dwa wystąpienia przechwytywania tabela pojedynczego źródło śledzone.Główne użycie tej funkcji jest przejście między wiele wystąpień przechwytywania po zmianie języka definicji danych (DDL), aby pomieścić źródło tabela rozwiń zestaw dostępnych kolumn śledzenia.Podczas przechodzi do nowego wystąpienie przechwytywania, jednym ze sposobów ochrony wyższych poziomów aplikacji ze zmian w nazwach podstawowe funkcje kwerend jest funkcja otoki oblewania wywołanie podstawowej.Następnie upewnij się, nazwa funkcja otoki pozostaje taka sama.Po przełączniku występuje starej funkcja otoki można upuszczać i odwołania do tego utworzony zostanie nowy plik o tej samej nazwie, nowe funkcje kwerendy.Modyfikując pierwszego wygenerowany skrypt tworzenia otoki funkcja o tej samej nazwie, można wprowadzić przełącznik nowe wystąpienie przechwytywania bez wpływu na wyższych warstw aplikacji.

Zobacz także

Inne zasoby