Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
W tym temacie opisano, jak utworzyć migawkę dla publikacji scalania z sparametryzowanymi filtrami w SQL Server, używając SQL Server Management Studio, Transact-SQL lub obiektów zarządzania replikacją (RMO).
Gdy sparametryzowane filtry wierszy są używane w publikacjach scalania, replikacja inicjuje każdą subskrypcję z dwuczęściową migawką. Najpierw tworzona jest migawka schematu zawierająca wszystkie obiekty wymagane przez replikację i schemat opublikowanych obiektów, ale nie dane. Następnie każda subskrypcja jest inicjowana za pomocą migawki zawierającej obiekty i schemat z migawki schematu oraz dane należące do partycji subskrypcji. Jeśli więcej niż jedna subskrypcja otrzymuje daną partycję (innymi słowy, otrzymują ten sam schemat i dane), migawka dla tej partycji jest tworzona tylko raz; wiele subskrypcji jest inicjowanych z tej samej migawki. Aby uzyskać więcej informacji na temat sparametryzowanych filtrów wierszy, zobacz Sparametryzowane filtry wierszy.
Publikacje można migawkowo archiwizować z użyciem sparametryzowanych filtrów na jeden z trzech sposobów.
Wstępnie generuj migawki dla każdej partycji. Użycie tej opcji umożliwia kontrolowanie, kiedy są generowane migawki.
Możesz również wybrać opcję odświeżania migawek zgodnie z harmonogramem. Nowi subskrybenci, którzy subskrybują partycję, dla której utworzono migawkę, otrzymają migawkę up-to-date.Zezwalaj subskrybentom na żądanie generowania migawek oraz używanie aplikacji przy pierwszej synchronizacji. Użycie tej opcji umożliwia nowym subskrybentom synchronizację bez konieczności interwencji administratora (agent programu SQL Server musi być uruchomiony w programie Publisher, aby umożliwić wygenerowanie migawki).
Uwaga / Notatka
Jeśli filtrowanie dla co najmniej jednego artykułu w publikacji daje nienakładające się partycje, które są unikatowe dla każdej subskrypcji, metadane są czyszczone przy każdym uruchomieniu agenta scalania. Oznacza to, że migawka podzielona na partycje wygasa szybciej. W przypadku korzystania z tej opcji należy rozważyć umożliwienie subskrybentom inicjowania generowania i dostarczania migawek. Aby uzyskać więcej informacji na temat opcji filtrowania, zobacz Sparametryzowane filtry wierszy.
Ręcznie wygeneruj migawkę dla każdego subskrybenta za pomocą agenta migawek. Subskrybent musi następnie podać lokalizację migawki agentowi scalania, aby mógł on poprawnie pobrać i zastosować tę migawkę.
Uwaga / Notatka
Ta opcja jest obsługiwana dla zachowania zgodności wstecznej i nie pozwala na obsługę udziałów migawek FTP.
Najbardziej elastyczne podejście polega na użyciu kombinacji wstępnie generowanych i żądanych przez subskrybentów opcji migawek: migawki są wstępnie generowane i odświeżane zgodnie z harmonogramem (zwykle poza godzinami szczytu), ale subskrybent może wygenerować własną migawkę, jeśli subskrypcja, która wymaga nowej partycji, zostanie utworzona.
Rozważmy usługę Adventure Works, która ma mobilną siłę roboczą, która dostarcza zapasy do poszczególnych sklepów. Każdy przedstawiciel handlowy otrzymuje subskrypcję powiązaną z ich logowaniem, która pobiera dane dla sklepów, które obsługują. Administrator decyduje się wstępnie wygenerować migawki i odświeżyć je co niedzielę. Czasami nowy użytkownik jest dodawany do systemu i potrzebuje danych dla partycji, dla której migawka nie jest dostępna. Administrator decyduje się również zezwolić na migawki inicjowane przez subskrybenta, aby uniknąć sytuacji, w której subskrybent nie może subskrybować publikacji, ponieważ migawka nie jest jeszcze dostępna. Gdy nowy subskrybent łączy się po raz pierwszy, migawka jest generowana dla określonej partycji i stosowana na subskrybenta (agent programu SQL Server musi być uruchomiony w programie Publisher, aby umożliwić wygenerowanie migawki).
Aby utworzyć migawkę publikacji z filtrami sparametryzowanymi, zobacz Utworzenie migawki dla publikacji scalającej z filtrami sparametryzowanymi.
Ustawienia zabezpieczeń agenta migawek
Agent migawek tworzy migawki na potrzeby każdej partycji. W przypadku wstępnie wygenerowanych migawek oraz migawek żądanych przez subskrybenta, agent działa i nawiązuje połączenia korzystając z poświadczeń określonych podczas tworzenia zadania agenta migawek dla publikacji (zadanie jest tworzone przez Kreatora nowej publikacji lub sp_addpublication_snapshot). Aby zmienić poświadczenia, użyj sp_changedynamicsnapshot_job. Aby uzyskać więcej informacji, zobacz sp_changedynamicsnapshot_job (Transact-SQL).
Rekomendacje
Podczas generowania migawki dla publikacji seryjnej przy użyciu filtrów sparametryzowanych należy najpierw wygenerować standardową (schemat) migawkę zawierającą wszystkie opublikowane dane i metadane subskrybenta dla subskrypcji. Aby uzyskać więcej informacji, zobacz Tworzenie i stosowanie migawki początkowej. Po utworzeniu migawki schematu można wygenerować migawkę zawierającą partycję specyficzną dla subskrybenta danych opublikowanych.
Jeśli filtrowanie dla co najmniej jednego artykułu w publikacji daje nienakładające się partycje, które są unikatowe dla każdej subskrypcji, metadane są czyszczone przy każdym uruchomieniu agenta scalania. Oznacza to, że migawka podzielona na partycje wygasa szybciej. W przypadku korzystania z tej opcji należy rozważyć umożliwienie subskrybentom inicjowania generowania i dostarczania migawek.
Korzystanie z programu SQL Server Management Studio
Wygeneruj migawki partycji na stronie Partycje danych w oknie dialogowym Właściwości publikacji — <publikacja> . Aby uzyskać więcej informacji na temat uzyskiwania dostępu do tego okna dialogowego, zobacz Wyświetlanie i modyfikowanie właściwości publikacji. Możesz zezwolić subskrybentom na inicjowanie generowania i dostarczania migawek i/lub generowanie migawek.
Przed wygenerowaniem migawek dla co najmniej jednej partycji należy wykonać następujące czynności:
Utwórz publikację scalaną za pomocą Kreatora Nowej Publikacji, i określ jeden lub więcej parametryzowanych filtrów wierszy na stronie Dodaj filtr kreatora. Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie sparametryzowanego filtru wierszy dla artykułu scalania.
Wygeneruj migawkę schematu dla publikacji. Domyślnie migawka schematu jest generowana po zakończeniu pracy Kreatora nowej publikacji; Można również wygenerować migawkę schematu z programu SQL Server Management Studio.
Aby wygenerować migawkę schematu
Połącz się z programem Publisher w programie Management Studio, a następnie rozwiń węzeł serwera.
Rozwiń folder Replikacja , a następnie rozwiń folder Publikacje .
Kliknij prawym przyciskiem myszy publikację, dla której chcesz utworzyć migawkę, a następnie kliknij pozycję Wyświetl stan agenta migawki.
W oknie dialogowym Wyświetl stan agenta migawki — <publikacja> kliknij przycisk Start.
Po zakończeniu generowania migawki przez agenta migawek zostanie wyświetlony komunikat, taki jak "[100%] Wygenerowano migawkę 17 artykułów".
Aby umożliwić subskrybentom inicjowanie generowania i wysyłki migawek
Na stronie Partycje danych okna dialogowego Właściwości publikacji — <publikacja> wybierz pozycję Automatycznie zdefiniuj partycję i w razie potrzeby wygeneruj migawkę, gdy nowy subskrybent spróbuje zsynchronizować.
Kliknij przycisk OK.
Aby wygenerować i odświeżyć migawki
Na stronie Partycje danych w oknie dialogowym Właściwości publikacji — <publikacja> kliknij przycisk Dodaj.
Wprowadź wartość dla HOST_NAME() i/lub SUSER_SNAME(), skojarzoną z partycją, dla której chcesz utworzyć migawkę.
Opcjonalnie określ harmonogram odświeżania migawek:
Wybierz Zaplanuj agenta migawki dla tej partycji, aby uruchamiał się o następujących godzinach
Zaakceptuj domyślny harmonogram odświeżania migawek lub kliknij przycisk Zmień , aby określić inny harmonogram.
Kliknij przycisk OK, co spowoduje powrót do okna dialogowego Właściwości publikacji — <publikacja> .
Wybierz partycję w siatce właściwości, a następnie kliknij pozycję Generuj wybrane migawki teraz.
Kliknij przycisk OK.
Korzystanie z Transact-SQL
Za pomocą procedur składowanych i agenta migawek mogą Państwo wykonać następujące czynności:
Zezwalaj subskrybentom na żądanie generowania migawek i aplikacji podczas pierwszej synchronizacji.
Wstępnie generuj migawki dla każdej partycji.
Ręcznie wygeneruj migawkę dla każdego subskrybenta.
Ważne
Jeśli to możliwe, poproś użytkowników o wprowadzenie danych logowania w czasie wykonywania. Jeśli musisz przechowywać poświadczenia w pliku skryptu, musisz zabezpieczyć plik, aby zapobiec nieautoryzowanemu dostępowi.
Aby utworzyć publikację, która umożliwia subskrybentom inicjowanie generowania i dostarczania migawek
W programie Publisher w bazie danych publikacji wykonaj sp_addmergepublication (Transact-SQL). Określ następujące parametry:
Nazwa publikacji dla @publication.
Wartość true dla @allow_subscriber_initiated_snapshot, która umożliwia subskrybentom rozpoczęcie procesu tworzenia migawki.
(Opcjonalnie) Liczba procesów migawek dynamicznych, które mogą być uruchamiane współbieżnie dla @max_concurrent_dynamic_snapshots. Jeśli jest uruchomiona maksymalna liczba procesów, a subskrybent próbuje wygenerować migawkę, proces zostanie umieszczony w kolejce. Domyślnie nie ma limitu liczby współbieżnych procesów.
W programie Publisher wykonaj sp_addpublication_snapshot (Transact-SQL). Określ nazwę publikacji używaną w kroku 1 dla @publication oraz poświadczenia systemu Microsoft Windows, na których działa Agent Migawki Replikacji, dla @job_login i @password. Jeśli agent będzie używać uwierzytelniania programu SQL Server podczas nawiązywania połączenia z programem Publisher, należy również określić wartość 0 dla @publisher_security_mode oraz informacje logowania programu Microsoft SQL Server dla @publisher_login i @publisher_password. Spowoduje to utworzenie zadania agenta migawek dla publikacji. Aby uzyskać więcej informacji na temat generowania początkowej migawki i definiowania niestandardowego harmonogramu agenta migawek, zobacz Tworzenie i stosowanie migawki początkowej.
Ważne
Podczas konfigurowania wydawcy za pomocą zdalnego dystrybutora wartości podane dla wszystkich parametrów, w tym job_login i job_password, są wysyłane do dystrybutora jako zwykły tekst. Przed wykonaniem tej procedury składowanej należy zaszyfrować połączenie między wydawcą a jego zdalnym dystrybutorem. Aby uzyskać więcej informacji, zobacz Włączanie szyfrowanych połączeń z silnikiem bazy danych (SQL Server Configuration Manager).
Wykonaj sp_addmergearticle (Transact-SQL), aby dodać artykuły do publikacji. Ta procedura składowana musi być wykonywana raz dla każdego artykułu w publikacji. W przypadku korzystania z filtrów sparametryzowanych należy określić sparametryzowany filtr wierszy dla co najmniej jednego artykułu przy użyciu parametru @subset_filterclause . Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie sparametryzowanego filtru wierszy dla artykułu scalania.
Jeśli inne artykuły będą filtrowane na podstawie sparametryzowanego filtru wierszy, wykonaj sp_addmergefilter (Transact-SQL), aby zdefiniować relacje sprzężenia lub rekordu logicznego między artykułami. Procedura składowana musi być wykonywana raz dla każdej relacji, która jest definiowana. Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie filtru łączenia między artykułami łączonymi.
Gdy agent scalania żąda migawki w celu zainicjowania subskrybenta, migawka partycji żądanej subskrypcji jest generowana automatycznie.
Aby utworzyć publikację i wstępnie wygenerować lub automatycznie odświeżyć migawki
Wykonaj sp_addmergepublication (Transact-SQL), aby utworzyć publikację. Aby uzyskać więcej informacji, zobacz Tworzenie publikacji.
W programie Publisher wykonaj sp_addpublication_snapshot (Transact-SQL). Określ nazwę publikacji używaną w kroku 1 dla @publication oraz poświadczenia systemu Windows, za pomocą których działa agent migawki, dla @job_login i @password. Jeśli agent będzie używać uwierzytelniania programu SQL Server podczas nawiązywania połączenia z programem Publisher, należy również określić wartość 0 dla @publisher_security_mode oraz informacje logowania programu SQL Server dla @publisher_login i @publisher_password. Spowoduje to utworzenie zadania agenta migawek dla publikacji. Aby uzyskać więcej informacji na temat generowania początkowej migawki i definiowania niestandardowego harmonogramu agenta migawek, zobacz Tworzenie i stosowanie migawki początkowej.
Ważne
Podczas konfigurowania wydawcy za pomocą zdalnego dystrybutora wartości podane dla wszystkich parametrów, w tym job_login i job_password, są wysyłane do dystrybutora jako zwykły tekst. Przed wykonaniem tej procedury składowanej należy zaszyfrować połączenie między wydawcą a jego zdalnym dystrybutorem. Aby uzyskać więcej informacji, zobacz Włączanie szyfrowanych połączeń z silnikiem bazy danych (SQL Server Configuration Manager).
Wykonaj sp_addmergearticle (Transact-SQL), aby dodać artykuły do publikacji. Ta procedura składowana musi być wykonywana raz dla każdego artykułu w publikacji. W przypadku korzystania z filtrów sparametryzowanych należy określić sparametryzowany filtr wierszy dla jednego artykułu przy użyciu parametru @subset_filterclause . Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie sparametryzowanego filtru wierszy dla artykułu scalania.
Jeśli inne artykuły będą filtrowane na podstawie sparametryzowanego filtru wierszy, wykonaj sp_addmergefilter (Transact-SQL), aby zdefiniować relacje sprzężenia lub rekordu logicznego między artykułami. Procedura składowana musi być wykonywana raz dla każdej relacji, która jest definiowana. Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie filtru łączenia między artykułami łączonymi.
W programie Publisher w bazie danych publikacji wykonaj sp_helpmergepublication (Transact-SQL), określając wartość @publication z kroku 1. Zanotuj wartość snapshot_jobid w zestawie wyników.
Przekonwertuj wartość snapshot_jobid uzyskaną w kroku 5 na unikalny identyfikator.
W programie Publisher w bazie danych msdb wykonaj sp_start_job (Transact-SQL), określając przekonwertowaną wartość uzyskaną w kroku 6 dla @job_id.
W programie Publisher w bazie danych publikacji wykonaj sp_addmergepartition (Transact-SQL). Określ nazwę publikacji z kroku 1 dla @publication i wartość użytą do zdefiniowania partycji dla @suser_sname , jeśli SUSER_SNAME (Transact-SQL) jest używana w klauzuli filtru lub dla @host_name , jeśli HOST_NAME (Transact-SQL) jest używana w klauzuli filtru.
W wydawcy w bazie danych publikacji wykonaj sp_adddynamicsnapshot_job (Transact-SQL). Określ nazwę publikacji z kroku 1 dla @publication, wartość @suser_sname lub @host_name z kroku 8 oraz harmonogram zadania. Spowoduje to utworzenie zadania, które generuje sparametryzowaną migawkę dla określonej partycji. Aby uzyskać więcej informacji, zobacz Określanie harmonogramów synchronizacji.
Uwaga / Notatka
To zadanie jest uruchamiane przy użyciu tego samego konta systemu Windows, co początkowe zadanie migawki zdefiniowane w kroku 2. Aby usunąć sparametryzowane zadanie migawki i powiązaną z nią partycję danych, wykonaj sp_dropdynamicsnapshot_job (Transact-SQL).
W programie Publisher w bazie danych publikacji wykonaj sp_helpmergepartition (Transact-SQL), określając wartość @publication z kroku 1 oraz wartość @suser_sname lub @host_name z kroku 8. Zanotuj wartość dynamic_snapshot_jobid w zestawie wyników.
W witrynie Dystrybutor w bazie danych msdb wykonaj sp_start_job (Transact-SQL), określając wartość uzyskaną w kroku 9 dla @job_id. Spowoduje to uruchomienie sparametryzowanego zadania migawki dla partycji.
Powtórz kroki 8–11, aby wygenerować migawkę partycjonowaną dla każdej subskrypcji.
Aby utworzyć publikację i ręcznie utworzyć migawki dla każdej partycji
Wykonaj sp_addmergepublication (Transact-SQL), aby utworzyć publikację. Aby uzyskać więcej informacji, zobacz Tworzenie publikacji.
W programie Publisher wykonaj sp_addpublication_snapshot (Transact-SQL). Określ nazwę publikacji używaną w kroku 1 dla @publication oraz poświadczenia systemu Windows, za pomocą których działa agent migawki, dla @job_login i @password. Jeśli agent będzie używać uwierzytelniania programu SQL Server podczas nawiązywania połączenia z programem Publisher, należy również określić wartość 0 dla @publisher_security_mode oraz informacje logowania programu SQL Server dla @publisher_login i @publisher_password. Spowoduje to utworzenie zadania agenta migawek dla publikacji. Aby uzyskać więcej informacji na temat generowania początkowej migawki i definiowania niestandardowego harmonogramu agenta migawek, zobacz Tworzenie i stosowanie migawki początkowej.
Ważne
Podczas konfigurowania wydawcy za pomocą zdalnego dystrybutora wartości podane dla wszystkich parametrów, w tym job_login i job_password, są wysyłane do dystrybutora jako zwykły tekst. Przed wykonaniem tej procedury składowanej należy zaszyfrować połączenie między wydawcą a jego zdalnym dystrybutorem. Aby uzyskać więcej informacji, zobacz Włączanie szyfrowanych połączeń z silnikiem bazy danych (SQL Server Configuration Manager).
Wykonaj sp_addmergearticle (Transact-SQL), aby dodać artykuły do publikacji. Ta procedura składowana musi być wykonywana raz dla każdego artykułu w publikacji. W przypadku korzystania z filtrów sparametryzowanych należy określić sparametryzowany filtr wierszy dla co najmniej jednego artykułu przy użyciu parametru @subset_filterclause . Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie sparametryzowanego filtru wierszy dla artykułu scalania.
Jeśli inne artykuły będą filtrowane na podstawie sparametryzowanego filtru wierszy, wykonaj sp_addmergefilter (Transact-SQL), aby zdefiniować relacje sprzężenia lub rekordu logicznego między artykułami. Procedura składowana musi być wykonywana raz dla każdej relacji, która jest definiowana. Aby uzyskać więcej informacji, zobacz Definiowanie i modyfikowanie filtru łączenia między artykułami łączonymi.
Uruchom zadanie migawki lub uruchom agenta migawki replikacji z wiersza polecenia, aby wygenerować standardowy schemat migawki i inne pliki. Aby uzyskać więcej informacji, zobacz Tworzenie i stosowanie migawki początkowej.
Uruchom ponownie Agenta Migawki Replikacji z wiersza poleceń, aby wygenerować pliki kopiowania zbiorczego (.bcp), określając lokalizację partycjonowanej migawki dla -DynamicSnapshotLocation oraz jedną lub obie z następujących właściwości, które definiują partycję:
-DynamicFilterHostName — wartość, jeśli jest używana HOST_NAME (Transact-SQL).
-DynamicFilterLogin — wartość, jeśli jest używana SUSER_SNAME (Transact-SQL).
Powtórz krok 6, aby wygenerować podzieloną na części migawkę dla każdej subskrypcji.
Uruchom Agenta Scalania dla każdej subskrypcji, aby zastosować początkową migawkę partycjonowaną u abonentów, określając następujące właściwości:
-Hostname — wartość używana do definiowania partycji, jeśli rzeczywista wartość HOST_NAME jest zastępowana.
-DynamicSnapshotLocation — lokalizacja migawki dynamicznej dla tej partycji.
Uwaga / Notatka
Aby uzyskać więcej informacji na temat programowania agentów replikacji, zobacz Pojęcia dotyczące plików wykonywalnych agenta replikacji.
Przykłady (Transact-SQL)
W tym przykładzie tworzona jest publikacja scalająca z sparametryzowanymi filtrami, w których subskrybenci inicjują tworzenie migawki. Wartości @job_login i @job_password są przekazywane przy użyciu zmiennych skryptowych.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2022];
-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication with Subscriber requested snapshot
-- and using the default agent schedule.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2022.',
@allow_subscriber_initiated_snapshot = N'true',
@publication_compatibility_level = N'90RTM';
-- Create a new snapshot job for the publication, using the default schedule.
-- Pass credentials at runtime using sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains salesperson information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the agent job to generate the full snapshot for the publication.
-- The filtered data snapshot is generated automatically the first time
-- the subscription is synchronized.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
W tym przykładzie utworzono publikację przy użyciu filtru sparametryzowanego, w którym każdy subskrybent ma swoją partycję zdefiniowaną przez wykonanie sp_addmergepartition, a zadanie migawki z filtrem utworzone poprzez wykonanie sp_adddynamicsnapshot_job z przekazaniem informacji o partycjonowaniu. Wartości @job_login i @job_password są przekazywane przy użyciu zmiennych skryptowych.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2022];
-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2022.',
@allow_subscriber_initiated_snapshot = N'false';
-- Create a new snapshot job for the publication, using the
-- default schedule. Pass credentials at runtime using
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(Login),
@job_password = $(password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains customer information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
-- Start the snapshot agent job.
DECLARE @publication AS sysname;
SET @publication = N'AdvWorksSalesPersonMerge';
EXEC sp_startpublication_snapshot
@publication = @publication;
GO
PRINT '*** Waiting for the initial snapshot.';
GO
-- Create a temporary table to store the filtered data snapshot
-- job information.
CREATE TABLE #temp (id int,
job_name sysname,
job_id uniqueidentifier,
dynamic_filter_login sysname NULL,
dynamic_filter_hostname sysname NULL,
dynamic_snapshot_location nvarchar(255),
frequency_type int,
frequency_interval int,
frequency_subday_type int,
frequency_subday_interval int,
frequency_relative_interval int,
frequency_recurrence_factor int,
active_start_date int,
active_end_date int,
active_start_time int,
active_end_time int
)
-- Create each snapshot for a partition
-- The initial snapshot must already be generated.
DECLARE @publication AS sysname;
DECLARE @jobname AS sysname
DECLARE @hostname AS sysname
SET @publication = N'AdvWorksSalesPersonMerge';
SET @hostname = N'adventure-works\Fernando';
WHILE NOT EXISTS(SELECT * FROM sysmergepublications
WHERE [name] = @publication
AND snapshot_ready = 1)
BEGIN
WAITFOR DELAY '00:00:05'
END
-- Create a data partition by overriding HOST_NAME().
EXEC sp_addmergepartition
@publication = @publication,
@host_name = @hostname;
-- Create the filtered data snapshot job, and use the returned
-- information to start the job.
EXEC sp_adddynamicsnapshot_job
@publication = @publication,
@host_name = @hostname;
INSERT INTO #temp (id, job_name, job_id, dynamic_filter_login,
dynamic_filter_hostname, dynamic_snapshot_location,
frequency_type, frequency_interval, frequency_subday_type,
frequency_subday_interval, frequency_relative_interval,
frequency_recurrence_factor, active_start_date, active_end_date,
active_start_time,active_end_time)
EXEC sp_helpdynamicsnapshot_job;
SELECT @jobname = (SELECT DISTINCT job_name FROM #temp WHERE dynamic_filter_hostname = @hostname);
EXEC msdb..sp_start_job @job_name = @jobname;
DROP TABLE #temp;
GO
W tym przykładzie publikacja jest tworzona przy użyciu sparametryzowanego filtru, gdzie każdy subskrybent musi mieć własną partycję danych oraz zadanie migawki z filtrem, które powstaje dzięki podaniu informacji o partycjonowaniu. Subskrybent dostarcza informacje o partycjonowaniu przy użyciu parametrów wiersza polecenia podczas ręcznego uruchamiania agentów replikacji. W tym przykładzie przyjęto założenie, że utworzono również subskrypcję publikacji.
-- To avoid storing the login and password in the script file, the value
-- is passed into SQLCMD as a scripting variable. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Add a new merge publication.
DECLARE @publicationdb AS sysname;
DECLARE @publication AS sysname;
DECLARE @table1 AS sysname;
DECLARE @table2 AS sysname;
DECLARE @filter AS sysname;
DECLARE @schema_hr AS sysname;
DECLARE @schema_sales AS sysname;
SET @publicationdb = N'AdventureWorks2022';
SET @publication = N'AdvWorksSalesPersonMerge';
SET @table1 = N'Employee';
SET @table2 = N'SalesPerson';
SET @filter = N'SalesPerson_Employee';
SET @schema_hr = N'HumanResources';
SET @schema_sales = N'Sales';
USE [AdventureWorks2022];
-- Enable AdventureWorks2022 for merge replication.
EXEC sp_replicationdboption
@dbname = @publicationdb,
@optname = N'merge publish',
@value = N'true';
-- Create new merge publication.
EXEC sp_addmergepublication
@publication = @publication,
@description = N'Merge publication of AdventureWorks2022.',
@allow_subscriber_initiated_snapshot = N'false';
-- Create a new snapshot job for the publication, using the
-- default schedule. Pass credentials at runtime using
-- sqlcmd scripting variables.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = $(Login),
@job_password = $(Password);
-- Add an article for the Employee table,
-- which is horizontally partitioned using
-- a parameterized row filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table1,
@source_owner = @schema_hr,
@source_object = @table1,
@type = N'table',
@description = 'contains employee information',
@subset_filterclause = N'[LoginID] = HOST_NAME()';
-- Add an article for the SalesPerson table,
-- which is partitioned based on a join filter.
EXEC sp_addmergearticle
@publication = @publication,
@article = @table2,
@source_owner = @schema_sales,
@source_object = @table2,
@type = N'table',
@description = 'contains customer information';
-- Add a join filter between the two articles.
EXEC sp_addmergefilter
@publication = @publication,
@article = @table1,
@filtername = @filter,
@join_articlename = @table2,
@join_filterclause = N'[Employee].[BusinessEntityID] = [SalesPerson].[SalesPersonID]',
@join_unique_key = 1,
@filter_type = 1;
GO
REM Line breaks are added to improve readability.
REM In a batch file, commands must be made in a single line.
REM Run the Snapshot agent from the command line to generate the standard snapshot
REM schema and other files.
SET DistPub=%computername%
SET PubDB=AdventureWorks2022
SET PubName=AdvWorksSalesPersonMerge
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %PubName%
-Publisher %DistPub% -Distributor %DistPub% -PublisherDB %PubDB% -ReplicationType 2
-OutputVerboseLevel 1 -DistributorSecurityMode 1
PAUSE
REM Run the Snapshot agent from the command line, this time to generate
REM the bulk copy (.bcp) data for each Subscriber partition.
SET DistPub=%computername%
SET PubDB=AdventureWorks2022
SET PubName=AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
MD %SnapshotDir%
"C:\Program Files\Microsoft SQL Server\120\COM\SNAPSHOT.EXE" -Publication %PubName%
-Publisher %DistPub% -Distributor %DistPub% -PublisherDB %PubDB% -ReplicationType 2
-OutputVerboseLevel 1 -DistributorSecurityMode 1 -DynamicFilterHostName "adventure-works\Fernando"
-DynamicSnapshotLocation %SnapshotDir%
PAUSE
REM Run the Merge Agent for each subscription to apply the partitioned
REM snapshot for each Subscriber.
SET Publisher = %computername%
SET Subscriber = %computername%
SET PubDB = AdventureWorks2022
SET SubDB = AdventureWorks2022Replica
SET PubName = AdvWorksSalesPersonMerge
SET SnapshotDir=\\%DistPub%\repldata\unc\fernando
"C:\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE" -Publisher %Publisher%
-Subscriber %Subscriber% -Distributor %Publisher% -PublisherDB %PubDB%
-SubscriberDB %SubDB% -Publication %PubName% -PublisherSecurityMode 1 -OutputVerboseLevel 3
-Output -SubscriberSecurityMode 1 -SubscriptionType 3 -DistributorSecurityMode 1
-Hostname "adventure-works\Fernando" -DynamicSnapshotLocation %SnapshotDir%
PAUSE
Korzystanie z obiektów zarządzania replikacją (RMO)
Za pomocą obiektów zarządzania replikacją (RMO) można programowo wygenerować partycjonowane migawki w następujący sposób:
Zezwalaj subskrybentom na żądanie generowania migawek i aplikacji podczas pierwszej synchronizacji.
Wstępnie generuj migawki dla każdej partycji.
Ręcznie wygeneruj migawkę dla każdego subskrybenta, uruchamiając agenta migawek.
Uwaga / Notatka
Podczas filtrowania artykułu zwracane są partycje, które są nienakładające się i unikalne dla każdej subskrypcji (określając wartość F:Microsoft.SqlServer.Replication.PartitionOptions.NonOverlappingSingleSubscription dla P:Microsoft.SqlServer.Replication.MergeArticle.PartitionOption podczas tworzenia artykułu scalania), a metadane są czyszczone przy każdym uruchomieniu agenta scalania. Oznacza to, że migawka podzielona na partycje wygasa szybciej. W przypadku korzystania z tej opcji należy rozważyć zezwolenie subskrybentom na żądanie generowania migawek. Aby uzyskać więcej informacji, zobacz sekcję Używanie odpowiednich opcji filtrowania w temacie Sparametryzowane filtry wierszy.
Ważne
Jeśli to możliwe, poproś użytkowników o wprowadzenie danych logowania w czasie wykonywania. Jeśli musisz przechowywać poświadczenia, użyj usług kryptograficznych udostępnianych przez program Microsoft Windows .NET Framework.
Aby utworzyć publikację, która umożliwia subskrybentom inicjowanie generowania i dostarczania migawek
Utwórz połączenie z programem Publisher przy użyciu klasy ServerConnection.
Utwórz wystąpienie klasy ReplicationDatabase dla bazy danych publikacji, ustaw właściwość ConnectionContext na wystąpienie ServerConnection z kroku 1 i wywołaj metodę LoadProperties. Jeśli LoadProperties zwraca wartość false, upewnij się, że baza danych istnieje.
Jeśli EnabledMergePublishing właściwość ma wartość false, ustaw dla niej wartość true i wywołaj metodę CommitPropertyChanges.
Utwórz wystąpienie MergePublication klasy i ustaw następujące właściwości dla tego obiektu:
Wynik ServerConnection z kroku 1 dla ConnectionContext.
Nazwa opublikowanej bazy danych dla elementu DatabaseName.
Nazwa publikacji dla Name.
Maksymalna liczba zadań migawek dynamicznych do uruchomienia dla programu MaxConcurrentDynamicSnapshots. Ponieważ żądania migawek inicjowane przez subskrybenta mogą być wykonywane w dowolnym momencie, ta właściwość ogranicza liczbę zadań agenta migawek, które mogą być uruchamiane jednocześnie, gdy wielu subskrybentów żąda ich partycjonowanej migawki w tym samym czasie. Po uruchomieniu maksymalnej liczby zadań dodatkowe partycjonowane żądania migawek są kolejkowane do momentu ukończenia jednego z uruchomionych zadań.
Użyj operatora bitowego OR (| w języku Visual C# i Or w Visual Basic), aby dodać wartość AllowSubscriberInitiatedSnapshot do Attributes elementu.
Pola Login i PasswordSnapshotGenerationAgentProcessSecurity służą do podania poświadczeń dla konta systemu Microsoft Windows, pod którym uruchamiane jest zadanie agenta migawek.
Uwaga / Notatka
Ustawienie SnapshotGenerationAgentProcessSecurity jest zalecane, gdy publikacja jest tworzona przez członka stałej roli serwera sysadmin . Aby uzyskać więcej informacji, zobacz model zabezpieczeń agenta replikacji .
Wywołaj metodę Create aby utworzyć publikację.
Ważne
Podczas konfigurowania wydawcy za pomocą zdalnego dystrybutora wartości podane dla wszystkich właściwości, w tym SnapshotGenerationAgentProcessSecurity, są wysyłane do Dystrybutora jako zwykły tekst. Przed wywołaniem metody należy zaszyfrować połączenie między wydawcą a jego zdalnym dystrybutorem Create . Aby uzyskać więcej informacji, zobacz Włączanie szyfrowanych połączeń z silnikiem bazy danych (SQL Server Configuration Manager).
MergeArticle Użyj właściwości , aby dodać artykuły do publikacji. FilterClause Określ właściwość dla co najmniej jednego artykułu, który definiuje sparametryzowany filtr. (Opcjonalnie) Utwórz MergeJoinFilter obiekty definiujące filtry sprzężenia między artykułami. Aby uzyskać więcej informacji, zobacz
Define an Article (Definiowanie artykułu).Jeśli wartość SnapshotAgentExists jest false, wywołaj polecenie CreateSnapshotAgent, aby utworzyć początkowe zadanie agenta migawek dla tej publikacji.
Wywołaj metodę StartSnapshotGenerationAgentJob obiektu MergePublication utworzonego w kroku 4. Rozpoczyna to zadanie agenta, które generuje początkową migawkę. Aby uzyskać więcej informacji na temat generowania początkowej migawki i definiowania niestandardowego harmonogramu agenta migawek, zobacz Tworzenie i stosowanie migawki początkowej.
(Opcjonalnie) Sprawdź, czy właściwość ma wartość SnapshotAvailable, aby określić, kiedy początkowa migawka jest gotowa do użycia.
Gdy agent scalania dla subskrybenta łączy się po raz pierwszy, migawka partycjonowana jest generowana automatycznie.
Aby utworzyć publikację i wstępnie wygenerować migawki lub automatycznie je aktualizować.
Użyj instancji klasy MergePublication, aby zdefiniować publikację scalaną. Aby uzyskać więcej informacji, zobacz Tworzenie publikacji.
MergeArticle Użyj właściwości , aby dodać artykuły do publikacji. FilterClause Określ właściwość dla co najmniej jednego artykułu, który definiuje filtr sparametryzowany, i utwórz wszystkie MergeJoinFilter obiekty definiujące filtry sprzężenia między artykułami. Aby uzyskać więcej informacji, zobacz
Define an Article (Definiowanie artykułu).Jeśli wartość SnapshotAgentExists wynosi false, wywołaj CreateSnapshotAgent, aby utworzyć zadanie agenta migawek dla tej publikacji.
Wywołaj metodę StartSnapshotGenerationAgentJob obiektu MergePublication utworzonego w kroku 1. Ta metoda uruchamia zadanie wykonywane przez agenta, które generuje początkową migawkę. Aby uzyskać więcej informacji na temat generowania początkowej migawki i definiowania niestandardowego harmonogramu agenta migawek, zobacz Tworzenie i stosowanie migawki początkowej.
Sprawdź, czy wartość właściwości wynosi SnapshotAvailable, aby określić, kiedy początkowa migawka jest gotowa do użycia.
Utwórz wystąpienie MergePartition klasy i ustaw sparametryzowane kryteria filtrowania dla subskrybenta przy użyciu jednej lub obu następujących właściwości:
Jeśli partycja subskrybenta jest zdefiniowana przez wynik SUSER_SNAME (Transact-SQL), użyj polecenia DynamicFilterLogin.
Jeśli partycja subskrybenta jest zdefiniowana przez wynik HOST_NAME (Transact-SQL) lub przeciążenie tej funkcji, użyj polecenia DynamicFilterHostName.
Utwórz wystąpienie MergeDynamicSnapshotJob klasy i ustaw tę samą właściwość co w kroku 6.
Użyj klasy ReplicationAgentSchedule , aby zdefiniować harmonogram generowania filtrowanej migawki dla partycji subskrybenta.
Za pomocą wystąpienia MergePublication z kroku 1 wywołaj metodę AddMergePartition. MergePartition Przekaż obiekt z kroku 6.
Przy użyciu wystąpienia MergePublication z kroku 1 wywołaj metodę AddMergeDynamicSnapshotJob . MergeDynamicSnapshotJob Przekaż obiekt z kroku 7 i ReplicationAgentSchedule obiekt z kroku 8.
Wywołaj EnumMergeDynamicSnapshotJobs, a następnie zlokalizuj obiekt MergeDynamicSnapshotJob dla nowo dodanego zadania migawki partycjonowanej w zwróconej tablicy.
Pobierz właściwość Name dotyczącą pracy.
Utwórz połączenie z dystrybutorem przy użyciu klasy ServerConnection.
Utwórz wystąpienie klasy Obiektów zarządzania programem SQL Server (SMO), Server przekazując ServerConnection obiekt z kroku 13.
Utwórz wystąpienie Job klasy, przekazując JobServer właściwość Server obiektu z kroku 14 i nazwę zadania z kroku 12.
Wywołaj metodę Start, aby uruchomić partycjonowane zadanie migawki.
Powtórz kroki od 6 do 16 dla każdego subskrybenta.
Aby utworzyć publikację i ręcznie utworzyć migawki dla każdej partycji
Użyj instancji klasy MergePublication, aby zdefiniować publikację scalaną. Aby uzyskać więcej informacji, zobacz Tworzenie publikacji.
Użyj właściwości MergeArticle, aby dodać artykuły do publikacji. Określ właściwość FilterClause dla co najmniej jednego artykułu, który definiuje filtr sparametryzowany, i utwórz wszystkie obiekty MergeJoinFilter, które określają filtry połączeń między artykułami. Aby uzyskać więcej informacji, zobacz
Define an Article (Definiowanie artykułu).Wygeneruj początkową migawkę. Aby uzyskać więcej informacji, zobacz Tworzenie i stosowanie migawki początkowej.
Utwórz wystąpienie klasy SnapshotGenerationAgent i ustaw następujące wymagane właściwości:
Publisher — nazwa wydawcy
PublisherDatabase - nazwa bazy danych publikacji
Publication - nazwa publikacji
Distributor - nazwa dystrybutora
PublisherSecurityMode - wartość Integrated do użycia uwierzytelniania zintegrowanego systemu Windows lub wartość Standard do użycia uwierzytelniania programu SQL Server.
DistributorSecurityMode - wartość Integrated do użycia uwierzytelniania zintegrowanego systemu Windows lub wartość Standard do użycia uwierzytelniania programu SQL Server.
Ustaw wartość Merge dla elementu ReplicationType.
Ustaw co najmniej jedną z następujących właściwości, aby zdefiniować parametry partycjonowania:
Jeśli partycja subskrybenta jest zdefiniowana przez wynik SUSER_SNAME (Transact-SQL), użyj polecenia DynamicFilterLogin.
Jeśli partycja subskrybenta jest zdefiniowana przez wynik HOST_NAME (Transact-SQL) lub przeciążenie tej funkcji, użyj polecenia DynamicFilterHostName.
Wywołaj metodę GenerateSnapshot .
Powtórz kroki od 4 do 7 dla każdego subskrybenta.
Przykłady (RMO)
W tym przykładzie jest tworzona publikacja scalania, która umożliwia subskrybentom zażądanie generowania migawek.
// Set the Publisher, publication database, and publication names.
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
ReplicationDatabase publicationDb;
MergePublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Enable the database for merge publication.
publicationDb = new ReplicationDatabase(publicationDbName, conn);
if (publicationDb.LoadProperties())
{
if (!publicationDb.EnabledMergePublishing)
{
publicationDb.EnabledMergePublishing = true;
}
}
else
{
// Do something here if the database does not exist.
throw new ApplicationException(String.Format(
"The {0} database does not exist on {1}.",
publicationDb, publisherName));
}
// Set the required properties for the merge publication.
publication = new MergePublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True;
// Specify the Windows account under which the Snapshot Agent job runs.
// This account will be used for the local connection to the
// Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin;
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword;
// Explicitly set the security mode for the Publisher connection
// Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = true;
// Enable Subscribers to request snapshot generation and filtering.
publication.Attributes |= PublicationAttributes.AllowSubscriberInitiatedSnapshot;
publication.Attributes |= PublicationAttributes.DynamicFilters;
// Enable pull and push subscriptions.
publication.Attributes |= PublicationAttributes.AllowPull;
publication.Attributes |= PublicationAttributes.AllowPush;
if (!publication.IsExistingObject)
{
// Create the merge publication.
publication.Create();
// Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent();
}
else
{
throw new ApplicationException(String.Format(
"The {0} publication already exists.", publicationName));
}
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"The publication {0} could not be created.", publicationName), ex);
}
finally
{
conn.Disconnect();
}
' Set the Publisher, publication database, and publication names.
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publicationDb As ReplicationDatabase
Dim publication As MergePublication
' Create a connection to the Publisher.
Dim conn As ServerConnection = New ServerConnection(publisherName)
Try
' Connect to the Publisher.
conn.Connect()
' Enable the database for merge publication.
publicationDb = New ReplicationDatabase(publicationDbName, conn)
If publicationDb.LoadProperties() Then
If Not publicationDb.EnabledMergePublishing Then
publicationDb.EnabledMergePublishing = True
End If
Else
' Do something here if the database does not exist.
Throw New ApplicationException(String.Format( _
"The {0} database does not exist on {1}.", _
publicationDb, publisherName))
End If
' Set the required properties for the merge publication.
publication = New MergePublication()
publication.ConnectionContext = conn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' Enable precomputed partitions.
publication.PartitionGroupsOption = PartitionGroupsOption.True
' Specify the Windows account under which the Snapshot Agent job runs.
' This account will be used for the local connection to the
' Distributor and all agent connections that use Windows Authentication.
publication.SnapshotGenerationAgentProcessSecurity.Login = winLogin
publication.SnapshotGenerationAgentProcessSecurity.Password = winPassword
' Explicitly set the security mode for the Publisher connection
' Windows Authentication (the default).
publication.SnapshotGenerationAgentPublisherSecurity.WindowsAuthentication = True
' Enable Subscribers to request snapshot generation and filtering.
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowSubscriberInitiatedSnapshot
publication.Attributes = publication.Attributes Or _
PublicationAttributes.DynamicFilters
' Enable pull and push subscriptions
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPull
publication.Attributes = publication.Attributes Or _
PublicationAttributes.AllowPush
If Not publication.IsExistingObject Then
' Create the merge publication.
publication.Create()
' Create a Snapshot Agent job for the publication.
publication.CreateSnapshotAgent()
Else
Throw New ApplicationException(String.Format( _
"The {0} publication already exists.", publicationName))
End If
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"The publication {0} could not be created.", publicationName), ex)
Finally
conn.Disconnect()
End Try
W tym przykładzie ręcznie utworzono partycję subskrybenta i przefiltrowaną migawkę dla publikacji scalanej z sparametryzowanymi filtrami wierszy.
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string distributorName = publisherInstance;
MergePublication publication;
MergePartition partition;
MergeDynamicSnapshotJob snapshotAgentJob;
ReplicationAgentSchedule schedule;
// Create a connection to the Publisher.
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create a connection to the Distributor to start the Snapshot Agent.
ServerConnection distributorConn = new ServerConnection(distributorName);
try
{
// Connect to the Publisher.
publisherConn.Connect();
// Set the required properties for the publication.
publication = new MergePublication();
publication.ConnectionContext = publisherConn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// If we can't get the properties for this merge publication,
// then throw an application exception.
if (publication.LoadProperties() || publication.SnapshotAvailable)
{
// Set a weekly schedule for the filtered data snapshot.
schedule = new ReplicationAgentSchedule();
schedule.FrequencyType = ScheduleFrequencyType.Weekly;
schedule.FrequencyRecurrenceFactor = 1;
schedule.FrequencyInterval = Convert.ToInt32(0x001);
// Set the value of Hostname that defines the data partition.
partition = new MergePartition();
partition.DynamicFilterHostName = hostname;
snapshotAgentJob = new MergeDynamicSnapshotJob();
snapshotAgentJob.DynamicFilterHostName = hostname;
// Create the partition for the publication with the defined schedule.
publication.AddMergePartition(partition);
publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule);
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication, " +
" or the initial snapshot has not been generated. " +
"Ensure that the publication {0} exists on {1} and " +
"that the Snapshot Agent has run successfully.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(string.Format(
"The partition for '{0}' in the {1} publication could not be created.",
hostname, publicationName), ex);
}
finally
{
publisherConn.Disconnect();
if (distributorConn.IsOpen) distributorConn.Disconnect();
}
' Define the server, database, and publication names
Dim publisherName As String = publisherInstance
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim distributorName As String = publisherInstance
Dim publication As MergePublication
Dim partition As MergePartition
Dim snapshotAgentJob As MergeDynamicSnapshotJob
Dim schedule As ReplicationAgentSchedule
' Create a connection to the Publisher.
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create a connection to the Distributor to start the Snapshot Agent.
Dim distributorConn As ServerConnection = New ServerConnection(distributorName)
Try
' Connect to the Publisher.
publisherConn.Connect()
' Set the required properties for the publication.
publication = New MergePublication()
publication.ConnectionContext = publisherConn
publication.Name = publicationName
publication.DatabaseName = publicationDbName
' If we can't get the properties for this merge publication,
' then throw an application exception.
If (publication.LoadProperties() Or publication.SnapshotAvailable) Then
' Set a weekly schedule for the filtered data snapshot.
schedule = New ReplicationAgentSchedule()
schedule.FrequencyType = ScheduleFrequencyType.Weekly
schedule.FrequencyRecurrenceFactor = 1
schedule.FrequencyInterval = Convert.ToInt32("0x001", 16)
' Set the value of Hostname that defines the data partition.
partition = New MergePartition()
partition.DynamicFilterHostName = hostname
snapshotAgentJob = New MergeDynamicSnapshotJob()
snapshotAgentJob.DynamicFilterHostName = hostname
' Create the partition for the publication with the defined schedule.
publication.AddMergePartition(partition)
publication.AddMergeDynamicSnapshotJob(snapshotAgentJob, schedule)
Else
Throw New ApplicationException(String.Format( _
"Settings could not be retrieved for the publication, " + _
" or the initial snapshot has not been generated. " + _
"Ensure that the publication {0} exists on {1} and " + _
"that the Snapshot Agent has run successfully.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Do error handling here.
Throw New ApplicationException(String.Format( _
"The partition for '{0}' in the {1} publication could not be created.", _
hostname, publicationName), ex)
Finally
publisherConn.Disconnect()
If distributorConn.IsOpen Then
distributorConn.Disconnect()
End If
End Try
W tym przykładzie ręcznie rozpoczyna agenta migawek, aby wygenerować przefiltrowaną migawkę danych dla subskrybenta publikacji scalonej z filtrami wierszy parametryzowanymi.
// Set the Publisher, publication database, and publication names.
string publicationName = "AdvWorksSalesOrdersMerge";
string publicationDbName = "AdventureWorks2022";
string publisherName = publisherInstance;
string distributorName = publisherInstance;
SnapshotGenerationAgent agent;
try
{
// Set the required properties for Snapshot Agent.
agent = new SnapshotGenerationAgent();
agent.Distributor = distributorName;
agent.DistributorSecurityMode = SecurityMode.Integrated;
agent.Publisher = publisherName;
agent.PublisherSecurityMode = SecurityMode.Integrated;
agent.Publication = publicationName;
agent.PublisherDatabase = publicationDbName;
agent.ReplicationType = ReplicationType.Merge;
// Specify the partition information to generate a
// filtered snapshot based on Hostname.
agent.DynamicFilterHostName = hostname;
// Start the agent synchronously.
agent.GenerateSnapshot();
}
catch (Exception ex)
{
// Implement custom application error handling here.
throw new ApplicationException(String.Format(
"A snapshot could not be generated for the {0} publication."
, publicationName), ex);
}
' Set the Publisher, publication database, and publication names.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publicationDbName As String = "AdventureWorks2022"
Dim publisherName As String = publisherInstance
Dim distributorName As String = publisherInstance
Dim agent As SnapshotGenerationAgent
Try
' Set the required properties for Snapshot Agent.
agent = New SnapshotGenerationAgent()
agent.Distributor = distributorName
agent.DistributorSecurityMode = SecurityMode.Integrated
agent.Publisher = publisherName
agent.PublisherSecurityMode = SecurityMode.Integrated
agent.Publication = publicationName
agent.PublisherDatabase = publicationDbName
agent.ReplicationType = ReplicationType.Merge
' Specify the partition information to generate a
' filtered snapshot based on Hostname.
agent.DynamicFilterHostName = hostname
' Start the agent synchronously.
agent.GenerateSnapshot()
Catch ex As Exception
' Implement custom application error handling here.
Throw New ApplicationException(String.Format( _
"A snapshot could not be generated for the {0} publication." _
, publicationName), ex)
End Try
Treści powiązane
- sparametryzowane filtry wierszy
- Pojęcia dotyczące procedur składowanych systemu replikacji
- Najlepsze rozwiązania dotyczące zabezpieczeń replikacji