Rupanya, jawabannya adalah:"Ketika Anda mendefinisikan artikel, Anda harus mengatur @vertical_partition
parameter ke true lalu tambahkan kolom yang Anda inginkan dengan sp_articlecolumn
."
Namun, saya harus bertanya mengapa Anda melakukan ini. Replikasi dalam pikiran saya bukanlah alat umum untuk memindahkan data di antara basis data yang berbeda, tetapi untuk menjaga dua basis data yang identik tetap sinkron.
Ide brainstorming lainnya:
- Anda dapat membuat tabel sumber baru yang cocok dengan tabel tujuan, dan menggunakan pemicu agar tabel sumber tetap sinkron.
- Dorong tabel sumber secara utuh ke tujuan dan lakukan MERGE di database tujuan.
- Replikasi mungkin bukan solusi yang tepat, di sini. Apa aturan &persyaratan bisnis yang meminta hal ini dilakukan? Sudahkah Anda mempertimbangkan untuk menggunakan SSIS?
- Jika ada kebutuhan untuk kedua tabel dalam sinkronisasi yang tepat sepanjang waktu, lalu apa saluran perubahan ke tabel sumber--sebuah aplikasi? Sepertinya aplikasi Anda membutuhkan tingkat abstraksi baru, lapisan penulisan data yang tahu cara menulis ke dua sumber secara bersamaan.
Mencoba untuk menyinkronkan data antara dua database yang berbeda bisa menjadi masalah. Mungkin ada segala macam masalah halus dengan kondisi balapan, kurangnya transaksi terdistribusi (mempengaruhi konsistensi dan respons terhadap kegagalan), masalah dengan solusi yang dibuat untuk menangani transaksi yang tidak terdistribusi, dan seterusnya dan seterusnya. Bisakah Anda membuat server tertaut dan beberapa tampilan yang benar-benar membuat data dalam satu database diakses secara real-time dari database lainnya?
Beri tahu kami lebih lanjut tentang persyaratan Anda dan mengapa Anda perlu melakukan ini.
Perbarui
Jika Anda menggunakan rute pembaruan manual, perhatikan bahwa Anda tidak dapat menerapkan operasi penyisipan, pembaruan, dan penghapusan periode waktu secara massal. Anda harus menerapkannya satu per satu, secara berurutan . Jika Anda malah bekerja dengan status saat ini daripada operasi data perantara, maka Anda dapat melakukan semua baris sekaligus. Saya akan menunjukkan kepada Anda contoh MERGE, bukan yang riwayat-pemutaran.
BEGIN TRAN;
DELETE D
FROM LinkedServer.dbo.Dest D WITH (TABLOCKX, HOLDLOCK)
WHERE
NOT EXISTS (
SELECT *
FROM Source S
WHERE D.Key = S.Key
);
UPDATE D
SET
D.Col1 = S.Col4,
D.Col2 = S.Col5,
D.Col3 = S.Col6,
D.Col4 = S.Col7,
FROM
LinkedServer.dbo.Dest D
INNER JOIN Source S ON D.Key = S.Key
WHERE
D.Col1 <> S.Col4
OR EXISTS (
SELECT D.Col2, D.Col4
EXCEPT
SELECT S.Col3, S.Col6
); -- or some other way to handle comparison of nullable columns
INSERT LinkedServer.dbo.Dest (Col1, Col2, Col3)
SELECT Col4, Col5, Col6
FROM Source S WITH (TABLOCK, HOLDLOCK)
WHERE
NOT EXISTS (
SELECT *
FROM LinkedServer.dbo.Dest D
WHERE S.Key = D.Key
);
COMMIT TRAN;
Anda mungkin merasa lebih baik untuk mendorong seluruh tabel dan melakukan operasi penggabungan pada server tujuan.
Petunjuk kunci yang saya masukkan pada kueri pertama adalah penting jika Anda ingin memiliki snapshot point-in-time yang konsisten. Jika Anda tidak peduli tentang itu, maka keluarkan petunjuk pengunciannya.
Jika Anda menemukan bahwa pembaruan di seluruh server tertaut lambat, maka dorong seluruh tabel secara utuh ke tabel staging sementara di server jauh, dan lakukan MERGE dalam skrip sepenuhnya di server jauh.