Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Po zainicjowaniu publikacji lub subskrypcji scal replikacja śledzi i wylicza wszystkie zmiany danych w opublikowanych tabelach. Zmiany są śledzone za pomocą wyzwalaczy (które replikacja tworzy dla każdej opublikowanej tabeli) i tabel systemowych w bazach danych publikacji i subskrypcji. Te tabele systemu replikacji są wypełniane metadanymi, które wskazują, które zmiany należy propagować. Gdy agent scalania jest uruchamiany podczas synchronizacji, zmiany są wyliczane przez agenta, a następnie stosowane do wydawcy i subskrybenta w razie potrzeby.
Śledzenie zmian
Do śledzenia zmian we wszystkich opublikowanych tabelach, replikacja scalania używa następujących wyzwalaczy i tabel systemowych.
-
MSmerge_ins_<GUID>: wstaw wyzwalacz (wartość GUID dla tego wyzwalacza i innych wyzwalaczy pochodzi z elementusysmergearticles) -
MSmerge_upd_<GUID>: wyzwalacz aktualizacji -
MSmerge_del_<GUID>: wyzwalacz usuwania MSmerge_contentsMSmerge_tombstoneMSmerge_genhistory
Replikacja scalania używa następujących dodatkowych tabel systemowych do śledzenia zmian w filtrowanych tabelach:
MSmerge_partition_groupsMSmerge_current_partition_mappingsMSmerge_past_partition_mappings
Uwaga / Notatka
Wymienione tabele systemowe są używane przez wszystkie publikacje scalane i subskrypcje w bazie danych; na przykład jeśli masz więcej niż jedną publikację w bazie danych publikacji, MSmerge_contents zawiera wiersze z artykułów we wszystkich publikacjach.
Śledzenie zmian dla niefiltrowanych tabel
Tabele systemowe
Tabele systemowe używane dla tabel niefiltrowanych i filtrowanych zawierają następujące metadane:
MSmerge_contentszawiera jeden wiersz dla każdego wiersza wstawionego lub zaktualizowanego w opublikowanej tabeli w bazie danych.MSmerge_tombstonezawiera jeden wiersz dla każdego wiersza usuniętego z opublikowanej tabeli w bazie danych.MSmerge_genhistoryzawiera jeden wiersz dla każdej generacji. Generacja to kolekcja zmian dostarczanych do wydawcy lub subskrybenta. Generacje są zamykane przy każdym uruchomieniu agenta scalania; kolejne zmiany w bazie danych są dodawane do co najmniej jednej otwartej generacji.
Proces śledzenia zmian
Następujący proces śledzenia zmian jest używany dla wszystkich niefiltrowanych tabel:
Gdy następuje wstawienie lub aktualizacja w opublikowanej tabeli, wyzwalacz
MSmerge_ins_<GUID>lubMSmerge_upd_<GUID>jest aktywowany, a wiersz jest wstawiany do tabeli systemowejMSmerge_contents. KolumnarowguidtabeliMSmerge_contentszawiera identyfikator GUID wstawionego lub zaktualizowanego wiersza, co oznacza, że przy następnej synchronizacji odpowiedni wiersz w tabeli użytkownika powinien zostać wysłany do Wydawcy lub subskrybentów. Jeśli kolejne aktualizacje wystąpią w wierszu w tabeli użytkownika, wiersz wMSmerge_contentstabeli zostanie zaktualizowany, aby odzwierciedlić ten stan.Kiedy nastąpi usunięcie w opublikowanej tabeli, wyzwalany jest wyzwalacz
MSmerge_del_<GUID>, a wiersz jest wstawiany do tabeli systemowejMSmerge_tombstone. KolumnarowguidzMSmerge_tombstonezawiera identyfikator GUID dla usuniętego wiersza, co oznacza, że przy następnej synchronizacji polecenie usunięcia powinno zostać wysłane do Wydawcy lub Subskrybentów dla odpowiedniego usuniętego wiersza w tabeli użytkownika. Jeśli usunięty wiersz jest przywoływany wMSmerge_contents(ponieważ został wstawiony lub zaktualizowany od ostatniej synchronizacji), wiersz zostanie usunięty zMSmerge_contents.
Śledzenie zmian dla filtrowanych tabel
Tabele systemowe
Oprócz tabel systemowych opisanych w poprzedniej sekcji trzy tabele w bazie danych publikacji zawierają metadane do śledzenia zmian w filtrowanych tabelach:
MSmerge_partition_groupszawiera jeden wiersz dla każdej partycji zdefiniowanej w publikacji. Partycje mogą być następujące:Jawnie zdefiniowano za pomocą
sp_addmergepartition, lub na stronie Partycje danych w oknie dialogowym Właściwości publikacji.Utworzono automatycznie, gdy subskrybent synchronizuje się, jeśli subskrybent wymaga partycji, która nie ma jeszcze wpisu w pliku
MSmerge_partition_groups.
MSmerge_current_partition_mappingszawiera jeden wiersz dla każdej unikatowej kombinacji wierszy w elementachMSmerge_contentsiMSmerge_partition_groups. Jeśli na przykład wiersz w tabeli użytkownika należy do dwóch partycji, a wiersz zostanie zaktualizowany, jeden wiersz zostanie wstawiony wMSmerge_contentscelu odzwierciedlenia aktualizacji, a dwa wiersze zostaną wstawione doMSmerge_current_partition_mappingselementu , aby wskazać, że zaktualizowany wiersz należy do dwóch partycji.MSmerge_past_partition_mappingszawiera jeden wiersz dla każdego wiersza, który nie należy już do danej partycji. Wiersz zostanie przeniesiony z partycji, jeśli:Wiersz został usunięty. Jeśli wiersz zostanie usunięty z tabeli użytkownika, wiersz zostanie wstawiony do
MSmerge_tombstoneelementu , a jeden lub więcej wierszy zostanie wstawionych doMSmerge_past_partition_mappingselementu .Wartość w kolumnie używanej do filtrowania uległa zmianie. Jeśli na przykład filtr sparametryzowany jest oparty na stanie, w którym firma ma swoją siedzibę główną, a firma przenosi się, wiersz dla firmy (i powiązane wiersze w innych tabelach) może zostać przeniesiony z partycji danych jednej osoby sprzedażowej do partycji innej osoby sprzedażowej. Jeśli wiersz zostanie zaktualizowany w taki sposób, że nie należy już do partycji, zostanie wstawiony lub zaktualizowany w
MSmerge_contents, a jeden lub więcej wierszy zostanie wstawionych doMSmerge_past_partition_mappings.
Uwaga / Notatka
Jeśli używane są partycje nienakładające się z jedną subskrypcją na partycję (wartość 3 dla parametru @partition_optionssp_addmergearticle), tabele systemowe MSmerge_current_partition_mappings i MSmerge_past_partition_mappings nie są używane do śledzenia mapowań partycji wierszy, ponieważ każdy wiersz należy tylko do jednej partycji i może być zmieniony tylko w jednym subskrybencie.
Proces śledzenia zmian
Opisany wcześniej proces (w sekcji Śledzenie zmian dla niefiltrowanych tabel) dla niefiltrowanych tabel jest również używany do filtrowania tabel z następującymi dodatkami:
W przypadku wstawienia do opublikowanej tabeli, oprócz aktualizowania lub wstawiania danych do
MSmerge_contents, doMSmerge_current_partition_mappingsjest dodawane mapowanie partycji dla każdej partycji, do której należy wiersz.W przypadku aktualizacji w opublikowanej tabeli, oprócz aktualizacji lub wstawiania danych do
MSmerge_contents, jeśli nie istnieje mapowanie partycji wMSmerge_current_partition_mappingsdla każdej partycji, do której należy wiersz, mapowanie takie zostanie dodane. Jeśli aktualizacja spowodowała przeniesienie wiersza z jednej partycji do innej, wiersz zostanie zaktualizowanyMSmerge_current_partition_mappingsi zostanie dodany do elementuMSmerge_past_partition_mappings.Gdy usunięcie występuje w opublikowanej tabeli, oprócz wiersza wstawionego do
MSmerge_tombstone, wiersz jest usuwany zMSmerge_current_partition_mappings, a wiersz jest dodawany doMSmerge_past_partition_mappings.
Zmiana wyliczenia
Tabele i procedury systemowe
Po uruchomieniu agenta scalania zmiany są wyliczane przy użyciu kilku tabel systemowych i procedur składowanych:
MSmerge_genhistoryzawiera jeden wiersz dla każdej generacji. Generacja to kolekcja zmian dostarczanych do wydawcy lub subskrybenta. Generacje są zamykane przy każdym uruchomieniu agenta scalania; kolejne zmiany w bazie danych są dodawane do co najmniej jednej otwartej generacji.sysmergesubscriptionsZawiera informacje o subskrypcjach, w tym rekord ostatnich generacji zmian, które węzeł wysłał i odebrał. W bazie danych publikacji ta tabela zawiera wiersz wydawcy i jeden wiersz dla każdego subskrybenta. W bazie danych subskrypcji ta tabela zazwyczaj zawiera wiersz dla subskrybenta i wiersz wydawcy.MSmerge_generation_partition_mappingsjest używany tylko w przypadku filtrowanych tabel, rejestrując, czy dana generacja zawiera jakiekolwiek zmiany istotne dla danej partycji. Ta tabela w bazie danych publikacji zawiera jeden wiersz dla każdej unikatowej kombinacji wierszy wMSmerge_genhistoryiMSmerge_partition_groups.sp_MSmakegenerationZamyka wszystkie otwarte generacje na początku procesu wyliczania.sp_MSenumchangesWylicza zmiany dla tabel (kilka powiązanych procedur, które mają nazwy rozpoczynające się odsp_MSenumchanges, są również używane w tym procesie).sp_MSgetmetadataOkreśla, czy zmiana z jednego węzła powinna być stosowana w innym węźle jako wstawianie, aktualizowanie lub usuwanie.
Zmienianie procesu wyliczania
Podczas wyliczania zmian następuje następujący proces:
Systemowa procedura
sp_MSmakegenerationjest wywoływana:W przypadku tabel niefiltrowanych i filtrowanych ta procedura zamyka wszystkie otwarte generacje, do których się odwołuje
MSmerge_genhistory(zamknięte generacje mają wartość1lub2w kolumniegenstatus).W przypadku filtrowanych tabel ta procedura wypełnia tabelę
MSmerge_generation_partition_mappingssystemowa . Jeśli generacja zawiera co najmniej jedną zmianę odpowiednią dla partycji, wiersz zostanie wstawiony do tabeli systemowej. Jeśli generacja nie zawiera żadnych zmian istotnych dla danej partycji, wiersz nie zostanie wstawiony doMSmerge_generation_partition_mappingselementu , a zmiany nie będą wyliczane dla żadnych subskrybentów, którzy otrzymają daną partycję.
Wywoływana jest składowana procedura
sp_MSenumchangesi powiązane procedury. Te procedury wyliczają zmiany, które wystąpiły od czasu ostatniej synchronizacji:Procedury najpierw określają generację, w której rozpoczyna się wyliczenie, na podstawie kolumn
sentgen(wysłana ostatnia generacja) irecgen(odebrana ostatnia generacja) w tabelisysmergesubscriptions.Na przykład podczas określania, które zmiany pokoleń muszą być wyliczane dla danego subskrybenta,
sentgendla subskrybenta (przechowywanego w bazie danych publikacji) irecgendla subskrybenta (przechowywanego w bazie danych subskrypcji) są porównywane. Jeśli wartości są takie same (co oznacza, że ostatnia generacja wysłana z wydawcy została pomyślnie odebrana przez subskrybenta), zmiany są wyliczane począwszy od następnej generacji w elemencieMSmerge_genhistory. Jeśli wartości nie są takie same, dolna z tych dwóch wartości jest używana do zapewnienia wysyłania wszystkich wymaganych zmian.Następnie procedury wyliczają zmiany:
W przypadku niefiltrowanych tabel wszystkie zmiany zawarte w generacjach po wygenerowaniu w
sentgenlubrecgensą wyliczane:MSmerge_genhistoryjest przyłączone doMSmerge_contentsiMSmerge_tombstonew celu określenia, które zmiany muszą zostać wysłane.Dla filtrowanych tabel,
MSmerge_generation_partition_mappingsjest połączony z:MSmerge_current_partition_mappingsiMSmerge_contentsorazMSmerge_past_partition_mappingsiMSmerge_tombstonew celu określenia, które zmiany są istotne dla partycji odbieranej przez subskrybenta.
Procedura przechowywana
sp_MSgetmetadatajest wywoływana w celu określenia, czy zmiana powinna zostać zastosowana jako wstawianie, aktualizacja lub usunięcie. W tym momencie wykonywane są wykrywanie konfliktów i ich rozwiązywanie; Aby uzyskać więcej informacji, zobacz Jak replikacja scalająca wykrywa i rozwiązuje konflikty.
Treści powiązane
- Scal replikację
- MSmerge_contents (Transact-SQL)
- MSmerge_current_partition_mappings
- MSmerge_generation_partition_mappings (Transact-SQL)
- MSmerge_genhistory (Transact-SQL)
- MSmerge_partition_groups (Transact-SQL)
- MSmerge_past_partition_mappings (Transact-SQL)
- MSmerge_tombstone (Transact-SQL)
- sp_addmergearticle (Transact-SQL)
- sp_addmergepartition (Transact-SQL)
- sysmergearticles (Transact-SQL)
- sysmergesubscriptions (Transact-SQL)
- Połączenie filtrów
- Filtry sparametryzowane — sparametryzowane filtry wierszy