Określanie, jak zmiany są rozpropagowane dla transakcji artykułów

replikacja transakcyjnej pozwala określić, jak zmiana danych jest przekazywana od Wydawca do subskrybentów.Dla każdej tabela opublikowana można określić jedną z następujących czterech metod, że każda operacja (INSERT, UPDATE lub DELETE) powinny być przenoszone na subskrybent:

  • Określ replikacja transakcyjnej powinno się za pomocą skryptu i następnie wywołać procedura przechowywana propagowanie zmian do subskrybentów (ustawienie domyślne).

  • Określa, że zmiany powinny być przenoszone za pomocą instrukcja INSERT, UPDATE lub DELETE (wartość domyślna dla nie-SQL Server Subskrybenci).

  • Określić używane niestandardowe procedura przechowywana.

  • Umożliwia określenie tej akcja nie należy wykonać w dowolnym subskrybent.Transakcji tego typu nie są replikowane.

Domyślnie replikacja transakcyjnej propaguje zmiany subskrybent zestaw procedur przechowywanych, które są zainstalowane na każdym subskrybent.Wstawiania, aktualizacji lub usuwania występuje w tabela Wydawca, operacja jest tłumaczona na wywołanie procedura przechowywana przez subskrybent.Procedura przechowywana akceptuje parametry, które są mapowane do kolumn w tabela, umożliwiając tych kolumn ma być zmieniony przez subskrybent.

Aby zestaw metoda propagacji danych zmienia się na artykuły transakcyjne

Domyślnych i niestandardowych procedur przechowywanych

Trzy procedury replikacja tworzy domyślnie dla każdego artykuł tabela są:

  • sp_MSins_<nazwa_tabeli>, który obsługuje wstawia.

  • sp_MSupd_<nazwa_tabeli>, który obsługuje aktualizacje.

  • sp_MSdel_<nazwa_tabeli>, który obsługuje usuwa.

The <tablename> used in the procedure depends on how the artykuł was added to the publikacja and whether the baza danych subskrypcja contains a tabela of the same name with a different owner.

Dowolne z tych procedur można zastąpić procedurą niestandardowej określonej podczas dodawania artykuł na publikacja w sieci.Niestandardowe procedury są używane, jeśli aplikacja wymaga logiki niestandardowej, takich jak Wstawianie danych do tabela programu inspekcji po zaktualizowaniu wiersza przy subskrybent.Aby uzyskać więcej informacji na temat określania niestandardowych procedur przechowywanych zapoznaj się ze sposobem tematach wymienionych powyżej.

Jeśli określisz procedur replikacja domyślnych lub niestandardowych procedur, należy także określić Składnia wywołania dla każdej procedury (replikacja wybiera ustawienia domyślne, jeżeli skorzystać z procedur domyślne).Składnia wywołania określa strukturę parametry przekazywane do procedury oraz jaka informacja jest wysyłana do subskrybent w przypadku każdej zmiany danych.Aby uzyskać więcej informacji zobacz sekcję "Call składnia dla procedury przechowywane" w tym temacie.

Procedury przechowywane zagadnień związanych z korzystaniem z niestandardowego

Przy użyciu niestandardowych procedur przechowywanych, należy pamiętać o następujących zagadnień:

  • Logika musi obsługiwać w przechowywanej procedurze; Microsoft nie zapewnia pomocy technicznej dla logiki niestandardowej.

  • W celu uniknięcia konfliktów z transakcjami, używane przez replikację, transakcji jawnej nie należy używać w niestandardowych procedur.

  • Schematu subskrybent jest zwykle taka sama, jak w schemacie przez wydawcę, ale także może być podzbiór schematu Wydawca, jeśli używana jest filtrowanie kolumn.Jednak Chcąc przekształcić schematu jako danych zostanie przeniesiona ten schemat na subskrybent nie jest podzbiorem schematu Wydawca, SQL Server 2008 Integration Services (SSIS) (SSIS) jest zalecanym rozwiązaniem. Aby uzyskać więcej informacji zobacz SQL Server Integration Services.

  • Jeśli wprowadzisz zmiany schematu tabela opublikowane, niestandardowych procedur musi być generowany ponownie.Aby uzyskać więcej informacji zobacz Ponowne generowanie niestandardowych transakcyjne procedury odbicie zmiany schematu.

  • Jeśli używasz wartość większą niż 1 -SubscriptionStreams parametr agenta dystrybucji, należy się upewnić, że aktualizacje do kolumny klucz podstawowy są powiodło się.Na przykład:

    update ... set pk = 2 where pk = 1 -- update 1
    update ... set pk = 3 where pk = 2 -- update 2
    

    Jeśli Agent dystrybucji używa więcej niż jedno połączenie, te dwie aktualizacje mogą być replikowane za pośrednictwem innych połączeń.Jeśli najpierw stosowany jest aktualizacja 1, istnieje problem, po zastosowaniu aktualizacji 2 najpierw przywrócone zostaną 0 wierszy wpływa ponieważ aktualizacja 1 nie ma jeszcze wystąpił.Ta sytuacja jest obsługiwany w procedurach domyślne przez zwiększenie błąd, jeśli nie wierszy mają być uwzględnione w aktualizacji:

    if @@rowcount = 0
        if @@microsoftversion>0x07320000
            exec sys.sp_MSreplraiserror 20598
    

    Podnoszenie błędu wymusza Agent dystrybucji, aby ponowić próbę aktualizacji za pośrednictwem jednego połączenia powiedzie się.Niestandardowe procedury przechowywane musi zawierać logiki podobne.

Wywołanie składni procedur przechowywanych

Możliwych jest pięć opcji dla używanych do wywoływania procedur stosowanych przy replikacja transakcyjnej składni:

  • Wywołaj składni.Można użyć do wstawia, aktualizacji i usuwania.Domyślnie replikacja używa następującej składni wstawia i usuwa.

  • Składnia SCALL.Można używać tylko aktualizacje.Domyślnie replikacja używa następującej składni w przypadku aktualizacji.

  • Składnia MCALL.Można używać tylko aktualizacje.

  • Składnia XCALL.Może służyć do aktualizacji i usuwania.

  • VCALL.Używana dla subskrypcji mogą być aktualizowane.Tylko do użytku wewnętrznego.

Każda metoda różni się z ilości danych, które są propagowane do subskrybent.Na przykład SCALL przekazuje wartości tylko dla kolumn, które rzeczywiście dotyczy aktualizacji.XCALL, natomiast wymaga wszystkie kolumna (niezależnie od tego, czy dotyczy aktualizacji lub nie) i stare dane wartości dla każdej kolumna.W wielu przypadkach SCALL jest odpowiednie aktualizacje, ale jeśli aplikacja wymaga wszystkich wartości danych podczas aktualizacji, XCALL pozwala na to.

Składnia polecenia CALL

  • INSERT procedur przechowywanych
    Procedury przechowywane obsługi instrukcji INSERT zostanie przekazany wstawianych wartości dla wszystkich kolumn:

    c1, c2, c3,... cn
    
  • UPDATE procedur przechowywanych
    Procedury przechowywane obsługi instrukcji UPDATE zostanie przekazany zaktualizowane wartości wszystkich kolumn zdefiniowanych w artykuł, a następnie oryginalne wartości dla kolumny klucz podstawowy (nie jest podejmowana próba określenia kolumn, które zostały zmienione.):

    c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn
    
  • DELETE procedur przechowywanych
    Procedury przechowywane obsługi instrukcji DELETE zostanie przekazany wartości dla kolumny klucz podstawowy:

    pkc1, pkc2, pkc3,... pkcn
    

Składnia SCALL

  • UPDATE procedur przechowywanych
    Procedury przechowywane obsługi instrukcji UPDATE będą przekazywane tylko dla tych kolumn, które uległy zmianie, następuje oryginalne wartości dla kolumny klucz podstawowy, a po nim (maskę bitową, zaktualizowane wartościbinary(n)) parametr, który wskazuje zmienione kolumny. W poniższym przykładzie kolumna 2 (c 2) nie zmienił się:

    c1, , c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
    

Składnia MCALL

  • UPDATE procedur przechowywanych
    Procedury przechowywane obsługi instrukcji UPDATE zostanie przekazany zaktualizowane wartości wszystkich kolumn zdefiniowanych w artykuł, następuje oryginalne wartości dla kolumny klucz podstawowy, a po nim (maski bitowejbinary(n)) parametr, który wskazuje zmienione kolumny:

    c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
    

Składnia XCALL

  • UPDATE procedur przechowywanych
    Procedury przechowywane obsługi instrukcji UPDATE zostanie przekazany oryginalnych wartości (przed obrazu) dla wszystkich kolumn zdefiniowanych w artykuł, a następnie zaktualizowane wartości (obraz po) dla wszystkich kolumn zdefiniowanych w artykuł:

    old-c1, old-c2, old-c3,... old-cn, c1, c2, c3,... cn,
    
  • DELETE procedur przechowywanych
    Procedury przechowywane obsługi instrukcji DELETE zostanie przekazany oryginał (przed obrazu) wartości dla wszystkich kolumn zdefiniowanych w artykule:

    old-c1, old-c2, old-c3,... old-cn
    

    Uwaga

    Podczas korzystania z XCALL, przed wartości obrazu tekst and obraz kolumn oczekuje się mieć wartości NULL.

Przykłady

Poniższe procedury są procedury domyślne dla Tabela dostawcy (AdventureWorks) w Adventure Works Przykładowa baza danych.

--INSERT procedure using CALL syntax
create procedure [sp_MSins_PurchasingVendor] 
  @c1 int,@c2 nvarchar(15),@c3 nvarchar(50),@c4 tinyint,@c5 bit,@c6 bit,@c7 nvarchar(1024),@c8 datetime
as 
begin 
insert into [Purchasing].[Vendor]( 
 [VendorID]
,[AccountNumber]
,[Name]
,[CreditRating]
,[PreferredVendorStatus]
,[ActiveFlag]
,[PurchasingWebServiceURL]
,[ModifiedDate]
 )
values ( 
 @c1
,@c2
,@c3
,@c4
,@c5
,@c6
,@c7
,@c8
 ) 
end
go


--UPDATE procedure using SCALL syntax
create procedure [sp_MSupd_PurchasingVendor] 
 @c1 int = null,@c2 nvarchar(15) = null,@c3 nvarchar(50) = null,@c4 tinyint = null,@c5 bit = null,@c6 bit = null,@c7 nvarchar(1024) = null,@c8 datetime = null,@pkc1 int
,@bitmap binary(2)
as
begin
update [Purchasing].[Vendor] set 
 [AccountNumber] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [AccountNumber] end
,[Name] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Name] end
,[CreditRating] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [CreditRating] end
,[PreferredVendorStatus] = case substring(@bitmap,1,1) & 16 when 16 then @c5 else [PreferredVendorStatus] end
,[ActiveFlag] = case substring(@bitmap,1,1) & 32 when 32 then @c6 else [ActiveFlag] end
,[PurchasingWebServiceURL] = case substring(@bitmap,1,1) & 64 when 64 then @c7 else [PurchasingWebServiceURL] end
,[ModifiedDate] = case substring(@bitmap,1,1) & 128 when 128 then @c8 else [ModifiedDate] end
where [VendorID] = @pkc1
if @@rowcount = 0
    if @@microsoftversion>0x07320000
        exec sp_MSreplraiserror 20598
end
go


--DELETE procedure using CALL syntax
create procedure [sp_MSdel_PurchasingVendor] 
  @pkc1 int
as 
begin 
delete [Purchasing].[Vendor]
where [VendorID] = @pkc1
if @@rowcount = 0
    if @@microsoftversion>0x07320000
        exec sp_MSreplraiserror 20598
end 
go