Tentukan Bagaimana Perubahan Disebarkan untuk Artikel Transaksional
Replikasi transaksional memungkinkan Anda menentukan bagaimana perubahan data disebarluaskan dari Penerbit ke Pelanggan. Untuk setiap tabel yang diterbitkan, Anda dapat menentukan salah satu dari empat cara agar setiap operasi (INSERT, UPDATE, atau DELETE) harus disebarluaskan ke Pelanggan:
Tentukan bahwa replikasi transaksional harus mengeluarkan skrip dan kemudian memanggil prosedur tersimpan untuk menyebarluaskan perubahan pada Pelanggan (default).
Tentukan bahwa perubahan harus disebarluaskan menggunakan pernyataan INSERT, UPDATE, atau DELETE (default untuk Pelanggan non-SQL Server).
Tentukan bahwa prosedur tersimpan kustom harus digunakan.
Tentukan bahwa tindakan ini tidak boleh dilakukan di Pelanggan mana pun. Transaksi jenis tersebut tidak direplikasi.
Secara default, replikasi transaksional menyebarkan perubahan pada Pelanggan melalui serangkaian prosedur tersimpan yang diinstal pada setiap Pelanggan. Saat penyisipan, pembaruan, atau penghapusan terjadi pada tabel di Publisher, operasi diterjemahkan ke dalam panggilan ke prosedur tersimpan di Pelanggan. Prosedur tersimpan menerima parameter yang memetakan ke kolom dalam tabel, memungkinkan kolom tersebut diubah di Pelanggan.
Untuk mengatur metode penyebaran perubahan data ke artikel transaksional, lihat Mengatur Metode Penyebaran untuk Perubahan Data ke Artikel Transaksional.
Prosedur default dan tersimpan kustom
Tiga prosedur yang dibuat replikasi secara default untuk setiap artikel tabel adalah:
< sp_MSins_ tablename > , yang menangani sisipan.
< sp_MSupd_ tablename > , yang menangani pembaruan.
< sp_MSdel_ tablename > , yang menangani penghapusan.
Nama <>tabel yang digunakan dalam prosedur bergantung pada bagaimana artikel ditambahkan ke publikasi dan apakah database langganan berisi tabel dengan nama yang sama dengan pemilik yang berbeda.
Salah satu prosedur ini dapat diganti dengan prosedur kustom yang Anda tentukan saat menambahkan artikel ke publikasi. Prosedur kustom digunakan jika aplikasi memerlukan logika kustom, seperti menyisipkan data ke dalam tabel audit saat baris diperbarui pada Pelanggan. Untuk informasi selengkapnya tentang menentukan prosedur tersimpan kustom, lihat cara topik yang tercantum di atas.
Jika Anda menentukan prosedur replikasi default atau prosedur kustom, Anda juga menentukan sintaks panggilan untuk setiap prosedur (replikasi memilih default jika Anda menggunakan prosedur default). Sintaks panggilan menentukan struktur parameter yang disediakan untuk prosedur dan berapa banyak informasi yang dikirim ke Pelanggan dengan setiap perubahan data. Untuk informasi selengkapnya, lihat bagian "Sintaks Panggilan untuk Prosedur Tersimpan" dalam topik ini.
Pertimbangan untuk Menggunakan Prosedur Tersimpan Kustom
Ingatlah pertimbangan berikut saat menggunakan prosedur tersimpan kustom:
Anda harus mendukung logika dalam prosedur tersimpan; Microsoft tidak menyediakan dukungan untuk logika kustom.
Untuk menghindari konflik dengan transaksi yang digunakan oleh replikasi, transaksi eksplisit tidak boleh digunakan dalam prosedur kustom.
Skema di Pelanggan biasanya identik dengan skema di Publisher, tetapi juga bisa menjadi subset skema Publisher jika pemfilteran kolom digunakan. Namun, jika Anda perlu mengubah skema karena data dipindahkan sedih sehingga skema pada Pelanggan bukan subset skema pada Penerbit, SQL Server 2014 Integration Services (SSIS) adalah solusi yang direkomendasikan. Untuk informasi selengkapnya, lihat SQL Server Integration Services.
Jika Anda membuat perubahan skema pada tabel yang diterbitkan, prosedur kustom harus diregenerasi. Untuk informasi selengkapnya, lihat Meregenerasi Prosedur Transaksional Kustom untuk Mencerminkan Perubahan Skema.
Jika Anda menggunakan nilai yang lebih besar dari 1 untuk parameter -SubscriptionStreams dari Agen Distribusi, Anda harus memastikan bahwa pembaruan pada kolom kunci utama berhasil. Contohnya:
update ... set pk = 2 where pk = 1 -- update 1 update ... set pk = 3 where pk = 2 -- update 2
Jika Agen Distribusi menggunakan lebih dari satu koneksi, kedua pembaruan ini mungkin direplikasi melalui koneksi yang berbeda. Jika pembaruan 1 diterapkan terlebih dahulu, tidak ada masalah; jika pembaruan 2 diterapkan terlebih dahulu, itu akan mengembalikan '0 baris yang terpengaruh' karena pembaruan 1 belum terjadi. Situasi ini ditangani dalam prosedur default dengan meningkatkan kesalahan jika tidak ada baris yang terpengaruh pada pembaruan:
if @@rowcount = 0 if @@microsoftversion>0x07320000 exec sys.sp_MSreplraiserror 20598
Meningkatkan kesalahan memaksa Agen Distribusi untuk mencoba kembali pembaruan melalui satu koneksi, yang akan berhasil. Prosedur tersimpan kustom harus menyertakan logika serupa.
Sintaks panggilan untuk prosedur tersimpan
Ada lima opsi untuk sintaks yang digunakan untuk memanggil prosedur yang digunakan oleh replikasi transaksional:
Sintaks PANGGILAN. Dapat digunakan untuk menyisipkan, memperbarui, dan menghapus. Secara default, replikasi menggunakan sintaks ini untuk menyisipkan dan menghapus.
Sintaks SCALL. Hanya dapat digunakan untuk pembaruan. Secara default, replikasi menggunakan sintaks ini untuk pembaruan.
Sintaks MCALL. Hanya dapat digunakan untuk pembaruan.
Sintaks XCALL. Dapat digunakan untuk pembaruan dan penghapusan.
VCALL. Digunakan untuk langganan yang dapat diperbarui. Penggunaan internal saja.
Setiap metode berbeda dalam jumlah data yang disebarkan ke Pelanggan. Misalnya, SCALL meneruskan nilai hanya untuk kolom yang benar-benar dipengaruhi oleh pembaruan. XCALL, sebaliknya, memerlukan semua kolom (baik yang dipengaruhi oleh pembaruan atau tidak) dan semua nilai data lama untuk setiap kolom. Dalam banyak kasus, SCALL sesuai untuk pembaruan, tetapi jika aplikasi Anda memerlukan semua nilai data selama pembaruan, XCALL memungkinkan hal ini.
Sintaks PANGGILAN
SISIPKAN prosedur tersimpan
Prosedur tersimpan yang menangani pernyataan INSERT akan diteruskan nilai yang disisipkan untuk semua kolom:
c1, c2, c3,... cn
MEMPERBARUI prosedur tersimpan
Prosedur tersimpan yang menangani pernyataan UPDATE akan diteruskan nilai yang diperbarui untuk semua kolom yang ditentukan dalam artikel, diikuti dengan nilai asli untuk kolom kunci utama (tidak ada upaya yang dilakukan untuk menentukan kolom mana yang diubah.):
c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn
PROSEDUR TERSIMPAN DELETE
Prosedur tersimpan yang menangani pernyataan DELETE akan diteruskan nilai untuk kolom kunci utama:
pkc1, pkc2, pkc3,... pkcn
Sintaks SCALL
MEMPERBARUI prosedur tersimpan
Prosedur tersimpan yang menangani pernyataan UPDATE akan diteruskan nilai yang diperbarui hanya untuk kolom yang telah berubah, diikuti oleh nilai asli untuk kolom kunci utama, diikuti oleh parameter bitmask (binary(n)
) yang menunjukkan kolom yang diubah. Dalam contoh berikut, kolom 2 (c2) tidak berubah:
c1, , c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
Sintaks MCALL
MEMPERBARUI prosedur tersimpan
Prosedur tersimpan yang menangani pernyataan UPDATE akan diteruskan nilai yang diperbarui untuk semua kolom yang ditentukan dalam artikel, diikuti dengan nilai asli untuk kolom kunci utama, diikuti oleh parameter bitmask (binary(n)
) yang menunjukkan kolom yang diubah:
c1, c2, c3,... cn, pkc1, pkc2, pkc3,... pkcn, bitmask
Sintaks XCALL
MEMPERBARUI prosedur tersimpan
Prosedur tersimpan yang menangani pernyataan UPDATE akan diteruskan nilai asli (gambar sebelum) untuk semua kolom yang ditentukan dalam artikel, diikuti oleh nilai yang diperbarui (gambar setelah) untuk semua kolom yang ditentukan dalam artikel:
old-c1, old-c2, old-c3,... old-cn, c1, c2, c3,... cn,
PROSEDUR TERSIMPAN DELETE
Prosedur tersimpan yang menangani pernyataan DELETE akan diteruskan nilai asli (gambar sebelumnya) untuk semua kolom yang ditentukan dalam artikel:
old-c1, old-c2, old-c3,... old-cn
Catatan
Saat menggunakan XCALL, nilai gambar sebelum untuk kolom teks dan gambar diharapkan null.
Contoh
Prosedur berikut adalah prosedur default yang dibuat untuk Vendor Table
dalam database sampel Adventure Works.
--INSERT procedure using CALL syntax
create procedure [sp_MSins_PurchasingVendor]
@c1 int,@c2 nvarchar(15),@c3 nvarchar(50),@c4 tinyint,@c5 bit,@c6 bit,@c7 nvarchar(1024),@c8 datetime
as
begin
insert into [Purchasing].[Vendor]([VendorID]
,[AccountNumber]
,[Name]
,[CreditRating]
,[PreferredVendorStatus]
,[ActiveFlag]
,[PurchasingWebServiceURL]
,[ModifiedDate])
values (
@c1
,@c2
,@c3
,@c4
,@c5
,@c6
,@c7
,@c8
)
end
go
--UPDATE procedure using SCALL syntax
create procedure [sp_MSupd_PurchasingVendor]
@c1 int = null,@c2 nvarchar(15) = null,@c3 nvarchar(50) = null,@c4 tinyint = null,@c5 bit = null,@c6 bit = null,@c7 nvarchar(1024) = null,@c8 datetime = null,@pkc1 int
,@bitmap binary(2)
as
begin
update [Purchasing].[Vendor] set
[AccountNumber] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [AccountNumber] end
,[Name] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [Name] end
,[CreditRating] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [CreditRating] end
,[PreferredVendorStatus] = case substring(@bitmap,1,1) & 16 when 16 then @c5 else [PreferredVendorStatus] end
,[ActiveFlag] = case substring(@bitmap,1,1) & 32 when 32 then @c6 else [ActiveFlag] end
,[PurchasingWebServiceURL] = case substring(@bitmap,1,1) & 64 when 64 then @c7 else [PurchasingWebServiceURL] end
,[ModifiedDate] = case substring(@bitmap,1,1) & 128 when 128 then @c8 else [ModifiedDate] end
where [VendorID] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end
go
--DELETE procedure using CALL syntax
create procedure [sp_MSdel_PurchasingVendor]
@pkc1 int
as
begin
delete [Purchasing].[Vendor]
where [VendorID] = @pkc1
if @@rowcount = 0
if @@microsoftversion>0x07320000
exec sp_MSreplraiserror 20598
end
go