Membuat Rekam Jepret untuk Publikasi Gabungan dengan Filter Berparameter

Berlaku untuk:SQL Server

Topik ini menjelaskan cara membuat rekam jepret untuk publikasi gabungan dengan filter berparameter di SQL Server dengan menggunakan SQL Server Management Studio, Transact-SQL, atau Objek Manajemen Replikasi (RMO).

Saat filter baris berparameter digunakan dalam publikasi gabungan, replikasi menginisialisasi setiap langganan dengan rekam jepret dua bagian. Pertama, rekam jepret skema dibuat yang berisi semua objek yang diperlukan oleh replikasi dan skema objek yang diterbitkan, tetapi bukan data. Kemudian, setiap langganan diinisialisasi dengan rekam jepret yang menyertakan objek dan skema dari rekam jepret skema dan data milik partisi langganan. Jika lebih dari satu langganan menerima partisi tertentu (dengan kata lain, mereka menerima skema dan data yang sama), rekam jepret untuk partisi tersebut dibuat hanya sekali; beberapa langganan diinisialisasi dari rekam jepret yang sama. Untuk informasi selengkapnya tentang filter baris berparameter, lihat Filter Baris Berparameter.

Anda dapat membuat rekam jepret untuk publikasi dengan filter berparameter dengan salah satu dari tiga cara:

  • Rekam jepret pra-hasil untuk setiap partisi. Menggunakan opsi ini memungkinkan Anda mengontrol kapan rekam jepret dihasilkan.
    Anda juga dapat memilih untuk merefresh rekam jepret sesuai jadwal. Pelanggan baru yang berlangganan partisi tempat rekam jepret dibuat akan menerima rekam jepret terbaru.

  • Izinkan Pelanggan untuk meminta pembuatan rekam jepret dan aplikasi saat pertama kali disinkronkan. Menggunakan opsi ini memungkinkan Pelanggan baru untuk menyinkronkan tanpa memerlukan intervensi dari administrator (SQL Server Agent harus berjalan di Publisher untuk memungkinkan rekam jepret dibuat).

    Catatan

    Jika pemfilteran untuk satu atau beberapa artikel dalam publikasi menghasilkan partisi yang tidak tumpang tindih yang unik untuk setiap langganan, metadata dibersihkan setiap kali Agen Penggabungan berjalan. Ini berarti bahwa rekam jepret yang dipartisi kedaluwarsa lebih cepat. Saat menggunakan opsi ini, Anda harus mempertimbangkan untuk mengizinkan Pelanggan memulai pembuatan dan pengiriman rekam jepret. Untuk informasi selengkapnya tentang opsi pemfilteran, lihat Filter Baris Berparameter.

  • Buat rekam jepret secara manual untuk setiap Pelanggan dengan Agen Rekam Jepret. Pelanggan kemudian harus menyediakan lokasi rekam jepret ke Agen Penggabungan, sehingga dapat mengambil dan menerapkan rekam jepret yang benar.

    Catatan

    Opsi ini didukung untuk kompatibilitas mundur dan tidak mengizinkan berbagi rekam jepret FTP.

Pendekatan yang paling fleksibel adalah menggunakan kombinasi opsi rekam jepret yang dibuat sebelumnya dan yang diminta Pelanggan: rekam jepret dibuat sebelumnya dan disegarkan secara terjadwal (biasanya selama waktu di luar puncak), tetapi Pelanggan dapat menghasilkan rekam jepretnya sendiri jika langganan yang memerlukan partisi baru dibuat.

Pertimbangkan Adventure Works, yang memiliki kekuatan kerja seluler yang memberikan inventaris ke toko individu. Setiap orang penjualan menerima langganan berdasarkan login mereka, yang mengambil data untuk penyimpanan yang mereka layanani. Administrator memilih untuk membuat rekam jepret sebelumnya dan me-refreshnya setiap hari Minggu. Terkadang pengguna baru ditambahkan ke sistem dan membutuhkan data untuk partisi yang tidak memiliki rekam jepret yang tersedia. Administrator juga memilih untuk mengizinkan rekam jepret yang dimulai Pelanggan untuk menghindari situasi di mana Pelanggan tidak dapat berlangganan publikasi karena rekam jepret belum tersedia. Ketika Pelanggan baru terhubung untuk pertama kalinya, rekam jepret dihasilkan untuk partisi yang ditentukan dan diterapkan di Pelanggan (SQL Server Agent harus berjalan di Penerbit untuk memungkinkan rekam jepret dibuat).

Untuk membuat rekam jepret untuk publikasi dengan filter berparameter, lihat Membuat Rekam Jepret untuk Publikasi Penggabungan dengan Filter Berparameter.

Pengaturan Keamanan untuk Agen Rekam Jepret

Agen Rekam Jepret membuat rekam jepret untuk setiap partisi. Untuk rekam jepret dan rekam jepret yang telah dibuat sebelumnya yang diminta oleh Pelanggan, agen menjalankan dan membuat koneksi di bawah kredensial yang ditentukan ketika pekerjaan agen rekam jepret untuk publikasi dibuat (pekerjaan dibuat oleh Panduan Publikasi Baru atau sp_addpublication_snapshot). Untuk mengubah kredensial, gunakan sp_changedynamicsnapshot_job. Untuk informasi selengkapnya, lihat sp_changedynamicsnapshot_job (Transact-SQL).

Rekomendasi

  • Saat membuat rekam jepret untuk publikasi gabungan menggunakan filter berparameter, Anda harus terlebih dahulu membuat rekam jepret standar (skema) yang berisi semua data yang diterbitkan dan metadata Pelanggan untuk langganan. Untuk informasi selengkapnya, lihat Membuat dan Menerapkan Rekam Jepret Awal. Setelah membuat rekam jepret skema, Anda dapat membuat rekam jepret yang berisi partisi khusus Pelanggan dari data yang diterbitkan.

  • Jika pemfilteran untuk satu atau beberapa artikel dalam publikasi menghasilkan partisi yang tidak tumpang tindih yang unik untuk setiap langganan, metadata dibersihkan setiap kali Agen Penggabungan berjalan. Ini berarti bahwa rekam jepret yang dipartisi kedaluwarsa lebih cepat. Saat menggunakan opsi ini, Anda harus mempertimbangkan untuk mengizinkan Pelanggan memulai pembuatan dan pengiriman rekam jepret.

Menggunakan SQL Server Management Studio

Hasilkan rekam jepret untuk partisi di halaman Partisi Data dari kotak dialog Properti Publikasi - <Publikasi> . Untuk informasi selengkapnya tentang mengakses kotak dialog ini, lihat Menampilkan dan Mengubah Properti Publikasi. Anda dapat mengizinkan Pelanggan untuk memulai pembuatan dan pengiriman rekam jepret dan/atau menghasilkan rekam jepret.

Sebelum membuat rekam jepret untuk satu atau beberapa partisi, Anda harus:

  1. Buat publikasi gabungan dengan Panduan Publikasi Baru, dan tentukan satu atau beberapa filter baris berparameter pada halaman Tambahkan Filter wizard. Untuk informasi selengkapnya, lihat Menentukan dan Mengubah Filter Baris Berparameter untuk Artikel Penggabungan.

  2. Buat rekam jepret skema untuk publikasi. Secara default, rekam jepret skema dibuat saat Anda menyelesaikan Wizard Publikasi Baru; Anda juga dapat membuat rekam jepret skema dari SQL Server Management Studio.

Untuk menghasilkan rekam jepret skema

  1. Koneksi ke Publisher di Management Studio, lalu perluas simpul server.

  2. Perluas folder Replikasi, lalu perluas folder Publikasi.

  3. Klik kanan publikasi yang ingin Anda buat rekam jepretnya, lalu klik Tampilkan Status Agen Rekam Jepret.

  4. Dalam kotak dialog Tampilkan Status Agen Rekam Jepret - <Publikasi> , klik Mulai.

    Ketika Agen Rekam Jepret selesai menghasilkan rekam jepret, pesan akan ditampilkan, seperti "[100%] Rekam jepret dari 17 artikel dihasilkan."

Untuk memungkinkan Pelanggan memulai pembuatan dan pengiriman rekam jepret

  1. Pada halaman Partisi Data dari kotak dialog Properti Publikasi - <Publikasi> , pilih Tentukan partisi secara otomatis dan buat rekam jepret jika diperlukan saat Pelanggan baru mencoba menyinkronkan.

  2. Pilih OK.

Untuk menghasilkan dan menyegarkan rekam jepret

  1. Pada halaman Partisi Data dari kotak dialog Properti Publikasi - <Publikasi> , klik Tambahkan.

  2. Masukkan nilai untuk nilai HOST_NAME() dan/atau SUSER_SNAME() yang terkait dengan partisi yang ingin Anda buat rekam jepretnya.

  3. Secara opsional tentukan jadwal untuk merefresh rekam jepret:

    1. Pilih Jadwalkan Agen Rekam Jepret agar partisi ini berjalan pada waktu berikut

    2. Terima jadwal default untuk merefresh rekam jepret, atau klik Ubah untuk menentukan jadwal yang berbeda.

  4. Klik OK, yang mengembalikan Anda ke kotak dialog Properti Publikasi - <Publikasi> .

  5. Pilih partisi di kisi properti, lalu klik Hasilkan rekam jepret yang dipilih sekarang.

  6. Pilih OK.

Menggunakan T-SQL

Dengan menggunakan prosedur tersimpan dan Agen Rekam Jepret, Anda dapat melakukan hal berikut:

  • Izinkan Pelanggan untuk meminta pembuatan rekam jepret dan aplikasi saat pertama kali disinkronkan.

  • Rekam jepret pra-hasil untuk setiap partisi.

  • Buat rekam jepret secara manual untuk setiap Pelanggan.

    Penting

    Jika memungkinkan, minta pengguna untuk memasukkan kredensial keamanan saat runtime. Jika Anda harus menyimpan kredensial dalam file skrip, Anda harus mengamankan file untuk mencegah akses yang tidak sah.

Untuk membuat publikasi yang memungkinkan Pelanggan memulai pembuatan dan pengiriman rekam jepret

  1. Di Publisher pada database publikasi, jalankan sp_addmergepublication (Transact-SQL). Tentukan parameter berikut:

    • Nama publikasi untuk @publication.

    • Nilai true untuk @allow_subscriber_initiated_snapshot, yang memungkinkan Pelanggan untuk memulai proses rekam jepret.

    • (Opsional) Jumlah proses rekam jepret dinamis yang dapat berjalan bersamaan untuk @max_concurrent_dynamic_snapshots. Jika jumlah maksimum proses berjalan dan Pelanggan mencoba menghasilkan rekam jepret, proses ditempatkan dalam antrean. Secara default tidak ada batasan jumlah proses bersamaan.

  2. Di Publisher, jalankan sp_addpublication_snapshot (Transact-SQL). Tentukan nama publikasi yang digunakan di langkah 1 untuk @publication dan kredensial Microsoft Windows tempat Agen Replikasi Rekam Jepret berjalan untuk @job_login dan @password. Jika agen akan menggunakan Autentikasi SQL Server saat menyambungkan ke Penerbit, Anda juga harus menentukan nilai 0 untuk @publisher_security_mode dan informasi masuk Microsoft SQL Server untuk @publisher_login dan @publisher_password. Ini membuat pekerjaan Agen Rekam Jepret untuk publikasi. Untuk informasi selengkapnya tentang membuat rekam jepret awal dan menentukan jadwal kustom untuk Agen Rekam Jepret, lihat Membuat dan Menerapkan Rekam Jepret Awal.

    Penting

    Saat mengonfigurasi Penerbit dengan Distributor jarak jauh, nilai yang disediakan untuk semua parameter, termasuk job_login dan job_password, dikirim ke Distributor sebagai teks biasa. Anda harus mengenkripsi koneksi antara Publisher dan Distributor jarak jauhnya sebelum menjalankan prosedur tersimpan ini. Untuk informasi selengkapnya, lihat Mengaktifkan Koneksi terenkripsi ke Mesin Database (Pengelola Konfigurasi SQL Server).

  3. Jalankan sp_addmergearticle (Transact-SQL) untuk menambahkan artikel ke publikasi. Prosedur tersimpan ini harus dijalankan sekali untuk setiap artikel dalam publikasi. Saat menggunakan filter berparameter, Anda harus menentukan filter baris berparameter untuk satu atau beberapa artikel menggunakan parameter @subset_filterclause . Untuk informasi selengkapnya, lihat Menentukan dan Mengubah Filter Baris Berparameter untuk Artikel Penggabungan.

  4. Jika artikel lain akan difilter berdasarkan filter baris berparameter, jalankan sp_addmergefilter (Transact-SQL) untuk menentukan hubungan rekaman gabungan atau logis antar artikel. Prosedur tersimpan ini harus dijalankan sekali untuk setiap hubungan yang ditentukan. Untuk informasi selengkapnya, lihat Menentukan dan Memodifikasi Filter Gabungan Antara Artikel Penggabungan.

  5. Saat Agen Penggabungan meminta rekam jepret untuk menginisialisasi Pelanggan, rekam jepret untuk partisi langganan yang meminta dibuat secara otomatis.

Untuk membuat publikasi dan membuat sebelumnya atau me-refresh rekam jepret secara otomatis

  1. Jalankan sp_addmergepublication (Transact-SQL) untuk membuat publikasi. Untuk informasi selengkapnya, lihat Membuat Publikasi.

  2. Di Publisher, jalankan sp_addpublication_snapshot (Transact-SQL). Tentukan nama publikasi yang digunakan di langkah 1 untuk @publication dan kredensial Windows tempat Agen Rekam Jepret berjalan untuk @job_login dan @password. Jika agen akan menggunakan Autentikasi SQL Server saat menyambungkan ke Publisher, Anda juga harus menentukan nilai 0 untuk @publisher_security_mode dan informasi masuk SQL Server untuk @publisher_login dan @publisher_password. Ini membuat pekerjaan Agen Rekam Jepret untuk publikasi. Untuk informasi selengkapnya tentang membuat rekam jepret awal dan menentukan jadwal kustom untuk Agen Rekam Jepret, lihat Membuat dan Menerapkan Rekam Jepret Awal.

    Penting

    Saat mengonfigurasi Penerbit dengan Distributor jarak jauh, nilai yang disediakan untuk semua parameter, termasuk job_login dan job_password, dikirim ke Distributor sebagai teks biasa. Anda harus mengenkripsi koneksi antara Publisher dan Distributor jarak jauhnya sebelum menjalankan prosedur tersimpan ini. Untuk informasi selengkapnya, lihat Mengaktifkan Koneksi terenkripsi ke Mesin Database (Pengelola Konfigurasi SQL Server).

  3. Jalankan sp_addmergearticle (Transact-SQL) untuk menambahkan artikel ke publikasi. Prosedur tersimpan ini harus dijalankan sekali untuk setiap artikel dalam publikasi. Saat menggunakan filter berparameter, Anda harus menentukan filter baris berparameter untuk satu artikel menggunakan parameter @subset_filterclause . Untuk informasi selengkapnya, lihat Menentukan dan Mengubah Filter Baris Berparameter untuk Artikel Penggabungan.

  4. Jika artikel lain akan difilter berdasarkan filter baris berparameter, jalankan sp_addmergefilter (Transact-SQL) untuk menentukan hubungan rekaman gabungan atau logis antar artikel. Prosedur tersimpan ini harus dijalankan sekali untuk setiap hubungan yang ditentukan. Untuk informasi selengkapnya, lihat Menentukan dan Memodifikasi Filter Gabungan Antara Artikel Penggabungan.

  5. Di Publisher pada database publikasi, jalankan sp_helpmergepublication (Transact-SQL), menentukan nilai @publication dari langkah 1. Perhatikan nilai snapshot_jobid dalam tataan hasil.

  6. Konversikan nilai snapshot_jobid yang diperoleh di langkah 5 menjadi uniqueidentifier.

  7. Di Publisher pada database msdb , jalankan sp_start_job (Transact-SQL), menentukan nilai yang dikonversi yang diperoleh di langkah 6 untuk @job_id.

  8. Di Publisher pada database publikasi, jalankan sp_addmergepartition (Transact-SQL). Tentukan nama publikasi dari langkah 1 untuk @publication dan nilai yang digunakan untuk menentukan partisi untuk @suser_sname jika SUSER_SNAME (Transact-SQL) digunakan dalam klausa filter atau untuk @host_name jika HOST_NAME (Transact-SQL) digunakan dalam klausa filter.

  9. Di penerbit pada database publikasi, jalankan sp_adddynamicsnapshot_job (Transact-SQL). Tentukan nama publikasi dari langkah 1 untuk @publication, nilai @suser_sname atau @host_name dari langkah 8, dan jadwal untuk pekerjaan tersebut. Ini membuat pekerjaan yang menghasilkan rekam jepret parameter untuk partisi yang ditentukan. Untuk informasi selengkapnya, lihat Menentukan Jadwal Sinkronisasi.

    Catatan

    Pekerjaan ini berjalan menggunakan akun Windows yang sama dengan pekerjaan rekam jepret awal yang ditentukan di langkah 2. Untuk menghapus pekerjaan rekam jepret berparameter dan partisi data terkait, jalankan sp_dropdynamicsnapshot_job (Transact-SQL).

  10. Di Publisher pada database publikasi, jalankan sp_helpmergepartition (Transact-SQL), menentukan nilai @publication dari langkah 1 dan nilai @suser_sname atau @host_name dari langkah 8. Perhatikan nilai dynamic_snapshot_jobid dalam tataan hasil.

  11. Di Distributor pada database msdb , jalankan sp_start_job (Transact-SQL), menentukan nilai yang diperoleh di langkah 9 untuk @job_id. Ini memulai pekerjaan rekam jepret berparameter untuk partisi.

  12. Ulangi langkah 8-11 untuk menghasilkan rekam jepret yang dipartisi untuk setiap langganan.

Untuk membuat publikasi dan membuat rekam jepret secara manual untuk setiap partisi

  1. Jalankan sp_addmergepublication (Transact-SQL) untuk membuat publikasi. Untuk informasi selengkapnya, lihat Membuat Publikasi.

  2. Di Publisher, jalankan sp_addpublication_snapshot (Transact-SQL). Tentukan nama publikasi yang digunakan di langkah 1 untuk @publication dan kredensial Windows tempat Agen Rekam Jepret berjalan untuk @job_login dan @password. Jika agen akan menggunakan Autentikasi SQL Server saat menyambungkan ke Publisher, Anda juga harus menentukan nilai 0 untuk @publisher_security_mode dan informasi masuk SQL Server untuk @publisher_login dan @publisher_password. Ini membuat pekerjaan Agen Rekam Jepret untuk publikasi. Untuk informasi selengkapnya tentang membuat rekam jepret awal dan menentukan jadwal kustom untuk Agen Rekam Jepret, lihat Membuat dan Menerapkan Rekam Jepret Awal.

    Penting

    Saat mengonfigurasi Penerbit dengan Distributor jarak jauh, nilai yang disediakan untuk semua parameter, termasuk job_login dan job_password, dikirim ke Distributor sebagai teks biasa. Anda harus mengenkripsi koneksi antara Publisher dan Distributor jarak jauhnya sebelum menjalankan prosedur tersimpan ini. Untuk informasi selengkapnya, lihat Mengaktifkan Koneksi terenkripsi ke Mesin Database (Pengelola Konfigurasi SQL Server).

  3. Jalankan sp_addmergearticle (Transact-SQL) untuk menambahkan artikel ke publikasi. Prosedur tersimpan ini harus dijalankan sekali untuk setiap artikel dalam publikasi. Saat menggunakan filter berparameter, Anda harus menentukan filter baris berparameter untuk setidaknya satu artikel menggunakan parameter @subset_filterclause . Untuk informasi selengkapnya, lihat Menentukan dan Mengubah Filter Baris Berparameter untuk Artikel Penggabungan.

  4. Jika artikel lain akan difilter berdasarkan filter baris berparameter, jalankan sp_addmergefilter (Transact-SQL) untuk menentukan hubungan rekaman gabungan atau logis antar artikel. Prosedur tersimpan ini harus dijalankan sekali untuk setiap hubungan yang ditentukan. Untuk informasi selengkapnya, lihat Menentukan dan Memodifikasi Filter Gabungan Antara Artikel Penggabungan.

  5. Mulai pekerjaan rekam jepret atau jalankan Agen Replikasi Rekam Jepret dari prompt perintah untuk menghasilkan skema rekam jepret standar dan file lainnya. Untuk informasi selengkapnya, lihat Membuat dan Menerapkan Rekam Jepret Awal.

  6. Jalankan Replikasi Snapshot Agent lagi dari prompt perintah untuk menghasilkan file salinan massal (.bcp), menentukan lokasi rekam jepret yang dipartisi untuk -DynamicSnapshotLocation dan satu atau kedua properti berikut yang menentukan partisi:

  7. Ulangi langkah 6 untuk menghasilkan rekam jepret yang dipartisi untuk setiap langganan.

  8. Jalankan Agen Penggabungan untuk setiap langganan untuk menerapkan rekam jepret awal yang dipartisi di Pelanggan, yang menentukan properti berikut:

    • -Hostname - nilai yang digunakan untuk menentukan partisi jika nilai aktual HOST_NAME sedang ditimpa.

    • -DynamicSnapshotLocation - lokasi rekam jepret dinamis untuk partisi ini.

Catatan

Untuk informasi selengkapnya tentang agen replikasi pemrograman, lihat Konsep Executables Agen Replikasi.

Contoh (Transact-SQL)

Contoh ini membuat publikasi penggabungan dengan filter berparameter tempat Pelanggan memulai proses pembuatan rekam jepret. Nilai untuk @job_login dan @job_password diteruskan menggunakan variabel pembuatan skrip.

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

Contoh ini membuat publikasi menggunakan filter berparameter di mana setiap Pelanggan memiliki partisi yang ditentukan dengan menjalankan sp_addmergepartition dan pekerjaan rekam jepret yang difilter yang dibuat dengan menjalankan sp_adddynamicsnapshot_job meneruskan informasi partisi. Nilai untuk @job_login dan @job_password diteruskan menggunakan variabel pembuatan skrip.

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

Contoh ini membuat publikasi menggunakan filter berparameter di mana setiap Pelanggan harus memiliki partisi data dan pekerjaan rekam jepret yang difilter yang dibuat dengan menyediakan informasi partisi. Pelanggan menyediakan informasi partisi menggunakan parameter baris perintah saat menjalankan agen replikasi secara manual. Contoh ini mengasumsikan bahwa langganan untuk publikasi juga telah dibuat.

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

Menggunakan Objek Manajemen Replikasi (RMO)

Anda dapat menggunakan Objek Manajemen Replikasi (RMO) untuk menghasilkan rekam jepret yang dipartisi secara terprogram dengan cara berikut:

  • Izinkan Pelanggan untuk meminta pembuatan rekam jepret dan aplikasi saat pertama kali disinkronkan.

  • Rekam jepret pra-hasil untuk setiap partisi.

  • Buat rekam jepret secara manual untuk setiap Pelanggan dengan menjalankan Agen Rekam Jepret.

Catatan

Saat memfilter artikel menghasilkan partisi yang tidak tumpang tindih yang unik untuk setiap langganan (dengan menentukan nilai F:Microsoft.SqlServer.Replication.PartitionOptions.NonOverlappingSingleSubscription untuk P:Microsoft.SqlServer.Replication.MergeArticle.PartitionOption saat membuat artikel penggabungan), metadata dibersihkan setiap kali Agen Penggabungan berjalan. Ini berarti bahwa rekam jepret yang dipartisi kedaluwarsa lebih cepat. Saat Anda menggunakan opsi ini, Anda harus mempertimbangkan untuk mengizinkan Pelanggan meminta pembuatan rekam jepret. Untuk informasi selengkapnya, lihat bagian Menggunakan Opsi Pemfilteran yang Sesuai dalam topik Filter Baris Berparameter.

Penting

Jika memungkinkan, minta pengguna untuk memasukkan kredensial keamanan saat runtime. Jika Anda harus menyimpan kredensial, gunakan layanan kriptografi yang disediakan oleh Microsoft Windows .NET Framework.

Untuk membuat publikasi yang memungkinkan Pelanggan memulai pembuatan dan pengiriman rekam jepret

  1. Buat koneksi ke Publisher dengan menggunakan ServerConnection kelas .

  2. Buat instans ReplicationDatabase kelas untuk database publikasi, atur ConnectionContext properti ke instans ServerConnection dari langkah 1, dan panggil LoadProperties metode . Jika LoadProperties mengembalikan false, konfirmasikan bahwa database ada.

  3. Jika EnabledMergePublishing properti false, atur ke true dan panggil CommitPropertyChanges.

  4. Buat instans MergePublication kelas, dan atur properti berikut untuk objek ini:

    • Dari ServerConnection langkah 1 untuk ConnectionContext.

    • Nama database yang diterbitkan untuk DatabaseName.

    • Nama untuk publikasi untuk Name.

    • Jumlah maksimum pekerjaan rekam jepret dinamis yang akan dijalankan untuk MaxConcurrentDynamicSnapshots. Karena permintaan rekam jepret yang dimulai pelanggan dapat terjadi kapan saja, properti ini membatasi jumlah pekerjaan Agen Rekam Jepret yang dapat berjalan secara bersamaan ketika beberapa Pelanggan meminta rekam jepret yang dipartisi secara bersamaan. Ketika jumlah maksimum pekerjaan berjalan, permintaan rekam jepret tambahan yang dipartisi diantrekan hingga salah satu pekerjaan yang sedang berjalan selesai.

    • Gunakan operator bitwise logical OR (| di Visual C# dan Atau di Visual Basic) untuk menambahkan nilai AllowSubscriberInitiatedSnapshot ke Attributes.

    • Bidang LoginSnapshotGenerationAgentProcessSecurity dan Password untuk memberikan kredensial untuk akun Microsoft Windows tempat pekerjaan Agen Rekam Jepret berjalan.

      Catatan

      Pengaturan SnapshotGenerationAgentProcessSecurity disarankan ketika publikasi dibuat oleh anggota peran server tetap sysadmin . Untuk informasi selengkapnya, lihat Model Keamanan Agen Replikasi.

  5. Create Panggil metode untuk membuat publikasi.

    Penting

    Saat mengonfigurasi Penerbit dengan Distributor jarak jauh, nilai yang disediakan untuk semua properti, termasuk SnapshotGenerationAgentProcessSecurity, dikirim ke Distributor sebagai teks biasa. Anda harus mengenkripsi koneksi antara Publisher dan Distributor jarak jauhnya sebelum memanggil Create metode . Untuk informasi selengkapnya, lihat Mengaktifkan Koneksi terenkripsi ke Mesin Database (Pengelola Konfigurasi SQL Server).

  6. MergeArticle Gunakan properti untuk menambahkan artikel ke publikasi. Tentukan FilterClause properti untuk setidaknya satu artikel yang menentukan filter berparameter. (Opsional) Buat MergeJoinFilter objek yang menentukan filter gabungan di antara artikel. Untuk informasi selengkapnya, lihat Menentukan Artikel.

  7. Jika nilai SnapshotAgentExists salah, panggil CreateSnapshotAgent untuk membuat pekerjaan Agen Rekam Jepret awal untuk publikasi ini.

  8. StartSnapshotGenerationAgentJob Panggil metode objek yang MergePublication dibuat di langkah 4. Ini memulai pekerjaan agen yang menghasilkan rekam jepret awal. Untuk informasi selengkapnya tentang membuat rekam jepret awal dan menentukan jadwal kustom untuk Agen Rekam Jepret, lihat Membuat dan Menerapkan Rekam Jepret Awal.

  9. (Opsional) Periksa nilai true untuk SnapshotAvailable properti guna menentukan kapan rekam jepret awal siap digunakan.

  10. Ketika Agen Penggabungan untuk Pelanggan terhubung untuk pertama kalinya, rekam jepret yang dipartisi dihasilkan secara otomatis.

Untuk membuat publikasi dan meregenerasi atau me-refresh rekam jepret secara otomatis

  1. Gunakan instans MergePublication kelas untuk menentukan publikasi gabungan. Untuk informasi selengkapnya, lihat Membuat Publikasi.

  2. MergeArticle Gunakan properti untuk menambahkan artikel ke publikasi. FilterClause Tentukan properti untuk setidaknya satu artikel yang menentukan filter berparameter, dan buat objek apa pun MergeJoinFilter yang menentukan filter gabungan di antara artikel. Untuk informasi selengkapnya, lihat Menentukan Artikel.

  3. Jika nilai SnapshotAgentExists salah, panggil CreateSnapshotAgent untuk membuat pekerjaan agen rekam jepret untuk publikasi ini.

  4. StartSnapshotGenerationAgentJob Panggil metode objek yang MergePublication dibuat di langkah 1. Metode ini memulai pekerjaan agen yang menghasilkan rekam jepret awal. Untuk informasi selengkapnya tentang membuat rekam jepret awal dan menentukan jadwal kustom untuk Agen Rekam Jepret, lihat Membuat dan Menerapkan Rekam Jepret Awal.

  5. Periksa nilai true untuk SnapshotAvailable properti guna menentukan kapan rekam jepret awal siap digunakan.

  6. Buat instans MergePartition kelas, dan atur kriteria pemfilteran berparameter untuk Pelanggan dengan menggunakan salah satu atau kedua properti berikut:

  7. Buat instans MergeDynamicSnapshotJob kelas, dan atur properti yang sama seperti pada langkah 6.

  8. ReplicationAgentSchedule Gunakan kelas untuk menentukan jadwal pembuatan rekam jepret yang difilter untuk partisi Pelanggan.

  9. Menggunakan instans MergePublication dari langkah 1, panggil AddMergePartition. Teruskan MergePartition objek dari langkah 6.

  10. Menggunakan instans MergePublication dari langkah 1, panggil AddMergeDynamicSnapshotJob metode . Teruskan MergeDynamicSnapshotJob objek dari langkah 7 dan ReplicationAgentSchedule objek dari langkah 8.

  11. Panggil EnumMergeDynamicSnapshotJobs, dan temukan MergeDynamicSnapshotJob objek untuk pekerjaan rekam jepret yang baru ditambahkan di array yang dikembalikan.

  12. Name Dapatkan properti untuk pekerjaan tersebut.

  13. Buat koneksi ke Distributor dengan menggunakan ServerConnection kelas .

  14. Buat instans kelas SQL Server Management Objects (SMO), Server melewati ServerConnection objek dari langkah 13.

  15. Buat instans Job kelas, melewati JobServer properti Server objek dari langkah 14 dan nama pekerjaan dari langkah 12.

  16. Start Panggil metode untuk memulai pekerjaan rekam jepret yang dipartisi.

  17. Ulangi langkah 6-16 untuk setiap Pelanggan.

Untuk membuat publikasi dan membuat rekam jepret secara manual untuk setiap partisi

  1. Gunakan instans MergePublication kelas untuk menentukan publikasi gabungan. Untuk informasi selengkapnya, lihat Membuat Publikasi.

  2. MergeArticle Gunakan properti untuk menambahkan artikel ke publikasi Tentukan FilterClause properti untuk setidaknya satu artikel yang menentukan filter berparameter, dan membuat objek apa pun MergeJoinFilter yang menentukan filter gabungan di antara artikel. Untuk informasi selengkapnya, lihat Menentukan Artikel.

  3. Hasilkan rekam jepret awal. Untuk informasi selengkapnya, lihat Membuat dan Menerapkan Rekam Jepret Awal.

  4. Buat instans SnapshotGenerationAgent kelas, dan atur properti yang diperlukan berikut:

  5. Tetapkan nilai Merge untuk ReplicationType.

  6. Atur satu atau beberapa properti berikut untuk menentukan parameter partisi:

  7. Panggil GenerateSnapshot metode.

  8. Ulangi langkah 4-7 untuk setiap Pelanggan.

Contoh (RMO)

Contoh ini membuat publikasi gabungan yang memungkinkan Pelanggan untuk membuat rekam jepret yang diminta.

// 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

Contoh ini secara manual membuat partisi Pelanggan dan rekam jepret yang difilter untuk publikasi gabungan dengan filter baris berparameter.

// 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

Contoh ini secara manual memulai Agen Rekam Jepret untuk menghasilkan rekam jepret data yang difilter untuk Pelanggan ke publikasi gabungan dengan filter baris berparameter.

// 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

Lihat Juga

Filter Baris Berparameter
Konsep Prosedur Tersimpan Sistem Replikasi
Praktik Terbaik Keamanan Replikasi