Mereplikasi Kolom Identitas

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Saat Anda menetapkan properti IDENTITY ke kolom, Microsoft SQL Server secara otomatis menghasilkan nomor berurutan untuk baris baru yang disisipkan dalam tabel yang berisi kolom identitas. Untuk informasi selengkapnya, lihat IDENTITY (Properti) (Transact-SQL). Karena kolom identitas mungkin disertakan sebagai bagian dari kunci utama, penting untuk menghindari nilai duplikat dalam kolom identitas. Untuk menggunakan kolom identitas dalam topologi replikasi yang memiliki pembaruan di lebih dari satu simpul, setiap simpul dalam topologi replikasi harus menggunakan rentang nilai identitas yang berbeda, sehingga duplikat tidak terjadi.

Misalnya, Penerbit dapat diberi rentang 1-100, Pelanggan A rentang 101-200, dan Pelanggan B rentang 201-300. Jika baris disisipkan di Publisher dan nilai identitasnya adalah, misalnya, 65, nilai tersebut direplikasi ke setiap Pelanggan. Saat replikasi menyisipkan data di setiap Pelanggan, replikasi tidak menambahkan nilai kolom identitas dalam tabel Pelanggan; sebagai gantinya, nilai harfiah 65 disisipkan. Hanya sisipan pengguna, tetapi tidak menyisipkan agen replikasi yang menyebabkan nilai kolom identitas bertahap.

Replikasi menangani kolom identitas di semua jenis publikasi dan langganan, memungkinkan Anda mengelola kolom secara manual atau memiliki replikasi mengelolanya secara otomatis.

Catatan

Menambahkan kolom identitas ke tabel yang diterbitkan tidak didukung, karena dapat mengakibatkan non-konvergensi saat kolom direplikasi ke Pelanggan. Nilai dalam kolom identitas di Publisher bergantung pada urutan baris untuk tabel yang terpengaruh disimpan secara fisik. Baris mungkin disimpan secara berbeda di Pelanggan; oleh karena itu, nilai untuk kolom identitas bisa berbeda untuk baris yang sama.

Menentukan Opsi Manajemen Rentang Identitas

Replikasi menawarkan tiga opsi manajemen rentang identitas:

  • Otomatis. Digunakan untuk menggabungkan replikasi dan replikasi transaksional dengan pembaruan di Pelanggan. Tentukan rentang ukuran untuk Penerbit dan Pelanggan, dan replikasi secara otomatis mengelola penetapan rentang baru. Replikasi menetapkan opsi NOT FOR REPLICATION pada kolom identitas di Pelanggan, sehingga hanya sisipan pengguna yang menyebabkan nilai bertahap di Pelanggan.

    Catatan

    Pelanggan harus menyinkronkan dengan Publisher untuk menerima rentang baru. Karena Pelanggan diberi rentang identitas secara otomatis, pelanggan mana pun dapat menghabiskan seluruh pasokan rentang identitas jika berulang kali meminta rentang baru.

  • Manual. Digunakan untuk rekam jepret dan replikasi transaksional tanpa pembaruan di Pelanggan, replikasi transaksional peer-to-peer, atau jika aplikasi Anda harus mengontrol rentang identitas secara terprogram. Jika Anda menentukan manajemen manual, Anda harus memastikan bahwa rentang ditetapkan ke Penerbit dan setiap Pelanggan dan rentang baru tersebut ditetapkan jika rentang awal digunakan. Replikasi menetapkan opsi NOT FOR REPLICATION pada kolom identitas di Pelanggan.

  • Tidak ada. Opsi ini direkomendasikan hanya untuk kompatibilitas mundur dengan versi SQL Server yang lebih lama dan hanya tersedia dari antarmuka prosedur tersimpan untuk publikasi transaksional.

Untuk menentukan opsi manajemen rentang identitas, lihat Mengelola Kolom Identitas.

Menetapkan Rentang Identitas

Replikasi penggabungan dan replikasi transaksional menggunakan metode yang berbeda untuk menetapkan rentang; metode ini dijelaskan di bagian ini.

Ada dua jenis rentang yang perlu diperhitungkan saat mereplikasi kolom identitas: rentang yang ditetapkan ke Penerbit dan Pelanggan, dan rentang jenis data di kolom. Tabel berikut ini memperlihatkan rentang yang tersedia untuk jenis data yang biasanya digunakan dalam kolom identitas. Rentang ini digunakan di semua node dalam topologi. Misalnya, jika Anda menggunakan smallint mulai dari 1 dengan kenaikan 1, jumlah maksimum sisipan adalah 32.767 untuk Penerbit dan semua Pelanggan. Jumlah sisipan aktual tergantung pada apakah ada celah dalam nilai yang digunakan dan apakah nilai ambang batas digunakan. Untuk informasi selengkapnya tentang ambang batas, lihat bagian berikut "Gabungkan Replikasi" dan "Replikasi Transaksional dengan Langganan Pembaruan Antrean".

Jika Publisher menghabiskan rentang identitasnya setelah penyisipan, Publisher dapat secara otomatis menetapkan rentang baru jika penyisipan dilakukan oleh anggota peran database tetap db_owner . Jika sisipan dilakukan oleh pengguna yang tidak dalam peran tersebut, Agen Pembaca Log, Agen Penggabungan, atau pengguna yang merupakan anggota peran db_owner harus menjalankan sp_adjustpublisheridentityrange (Transact-SQL). Untuk publikasi transaksional, Agen Pembaca Log harus berjalan untuk secara otomatis mengalokasikan rentang baru (defaultnya adalah agar agen berjalan terus menerus).

Peringatan

Selama sisipan batch besar, pemicu replikasi diaktifkan hanya sekali, bukan untuk setiap baris sisipan. Ini dapat menyebabkan kegagalan pernyataan sisipan jika rentang identitas habis selama sisipan besar, seperti pernyataan INSERT INTO .

Jenis data Rentang
kecil Tidak didukung untuk manajemen otomatis
smallint -2^15 (-32.768) hingga 2^15-1 (32.767)
int -2^31 (-2.147.483.648) hingga 2^31-1 (2.147.483.647)
bigint -2^63 (-9.223.372.036.854.775.808) hingga 2^63-1 (9.223.372.036.854.775.807)
desimal dan numerik -10^38+1 hingga 10^38-1

Catatan

Untuk membuat nomor bertahap otomatis yang dapat digunakan dalam beberapa tabel atau yang dapat dipanggil dari aplikasi tanpa merujuk tabel apa pun, lihat Nomor Urutan.

Replikasi Penggabungan

Rentang identitas dikelola oleh Penerbit dan disebarkan ke Pelanggan oleh Agen Penggabungan (dalam hierarki penerbitan ulang, rentang dikelola oleh Penerbit akar dan penerbit ulang). Nilai identitas ditetapkan dari kumpulan di Publisher. Saat Anda menambahkan artikel dengan kolom identitas ke publikasi di Wizard Publikasi Baru atau dengan menggunakan sp_addmergearticle (Transact-SQL), Anda menentukan nilai untuk:

  • Parameter @identity_range , yang mengontrol ukuran rentang identitas yang awalnya dialokasikan baik ke Penerbit maupun kepada Pelanggan dengan langganan klien.

    Catatan

    Untuk Pelanggan yang menjalankan versi SQL Server sebelumnya, parameter ini (bukan @pub_identity_range parameter) juga mengontrol ukuran rentang identitas pada penerbitan ulang Pelanggan.

  • Parameter @pub_identity_range , yang mengontrol ukuran rentang identitas untuk penerbitan ulang yang dialokasikan untuk Pelanggan dengan langganan server (diperlukan untuk menerbitkan ulang data). Semua Pelanggan dengan langganan server menerima rentang untuk penerbitan ulang, bahkan jika mereka tidak benar-benar menerbitkan ulang data.

  • Parameter @threshold , yang digunakan untuk menentukan kapan rentang identitas baru diperlukan untuk langganan ke SQL Server Compact atau versi SQL Server sebelumnya.

Misalnya, Anda dapat menentukan 10000 untuk @identity_range dan 500000 untuk @pub_identity_range. Penerbit dan semua Pelanggan yang menjalankan SQL Server 2005 (9.x) atau versi yang lebih baru, termasuk Pelanggan dengan langganan server, diberi rentang utama 10000. Pelanggan dengan langganan server juga diberi rentang utama 500000, yang dapat digunakan oleh Pelanggan yang disinkronkan dengan Pelanggan penerbitan ulang (Anda juga harus menentukan @identity_range, , @pub_identity_rangedan @threshold untuk artikel dalam publikasi di Pelanggan penerbitan ulang).

Setiap Pelanggan yang menjalankan SQL Server 2005 (9.x) atau versi yang lebih baru juga menerima rentang identitas sekunder. Rentang sekunder sama ukurannya dengan rentang utama; ketika rentang utama habis, rentang sekunder digunakan, dan Agen Penggabungan menetapkan rentang baru ke Pelanggan. Rentang baru menjadi rentang sekunder, dan proses berlanjut saat Pelanggan menggunakan nilai identitas.

Replikasi Transaksional dengan Langganan Pembaruan Antrean

Rentang identitas dikelola oleh Distributor dan disebarluaskan ke Pelanggan oleh Agen Distribusi. Nilai identitas ditetapkan dari kumpulan di Distributor. Ukuran kumpulan didasarkan pada ukuran jenis data dan kenaikan yang digunakan untuk kolom identitas. Saat Anda menambahkan artikel dengan kolom identitas ke publikasi di Wizard Publikasi Baru atau dengan menggunakan sp_addarticle (Transact-SQL), Anda menentukan nilai untuk:

  • Parameter @identity_range , yang mengontrol ukuran rentang identitas yang awalnya dialokasikan untuk semua Pelanggan.

  • Parameter @pub_identity_range , yang mengontrol ukuran rentang identitas yang dialokasikan untuk Publisher.

  • Parameter @threshold , yang digunakan untuk menentukan kapan rentang identitas baru diperlukan untuk langganan.

Misalnya, Anda dapat menentukan 10000 untuk @pub_identity_range, 1000 untuk @identity_range (dengan asumsi lebih sedikit pembaruan di Pelanggan), dan 80 persen untuk @threshold. Setelah 800 sisipan pada Pelanggan (80 persen dari 1000), Pelanggan diberi rentang baru. Setelah 8000 disisipkan di Publisher, Publisher diberi rentang baru. Saat rentang baru ditetapkan, akan ada celah dalam nilai rentang identitas dalam tabel. Menentukan ambang yang lebih tinggi menghasilkan celah yang lebih kecil, tetapi sistem kurang toleran terhadap kesalahan: jika Agen Distribusi tidak dapat berjalan karena alasan tertentu, Pelanggan dapat lebih mudah kehabisan identitas.

Menetapkan rentang untuk manajemen rentang identitas manual

Jika Anda menentukan manajemen rentang identitas manual, Anda harus memastikan bahwa Penerbit dan setiap Pelanggan menggunakan rentang identitas yang berbeda. Misalnya, pertimbangkan tabel di Publisher dengan kolom identitas yang didefinisikan sebagai IDENTITY(1,1): kolom identitas dimulai pada 1 dan bertambah 1 setiap kali baris disisipkan. Jika tabel di Publisher memiliki 5.000 baris, dan Anda mengharapkan beberapa pertumbuhan dalam tabel selama masa pakai aplikasi, Publisher dapat menggunakan rentang 1-10.000. Mengingat dua Pelanggan, Pelanggan A dapat menggunakan 10.001-20.000, dan Pelanggan B dapat menggunakan 20.001-30.000.

Setelah Pelanggan diinisialisasi dengan rekam jepret atau melalui cara lain, jalankan DBCC CHECKIDENT untuk menetapkan titik awal pelanggan untuk rentang identitasnya. Misalnya, di Pelanggan A, Anda akan menjalankan DBCC CHECKIDENT('<TableName>','reseed',10001). Di Pelanggan B, Anda akan menjalankan CHECKIDENT('<TableName>','reseed',20001).

Untuk menetapkan rentang baru ke Penerbit atau Pelanggan, jalankan DBCC CHECKIDENT dan tentukan nilai baru untuk mengubah tabel. Anda harus memiliki beberapa cara untuk menentukan kapan rentang baru harus ditetapkan. Misalnya, aplikasi Anda dapat memiliki mekanisme yang mendeteksi kapan simpul akan menggunakan rentangnya dan menetapkan rentang baru menggunakan DBCC CHECKIDENT. Anda juga dapat menambahkan batasan pemeriksaan untuk memastikan bahwa baris tidak dapat ditambahkan jika akan menyebabkan nilai identitas di luar rentang digunakan.

Menangani Rentang Identitas setelah Pemulihan Database

Jika Anda menggunakan manajemen rentang identitas otomatis, saat Pelanggan dipulihkan dari cadangan, secara otomatis meminta rentang nilai identitas baru. Jika Publisher dipulihkan dari cadangan, Anda harus memastikan bahwa Publisher diberi rentang yang sesuai. Untuk replikasi penggabungan, tetapkan rentang baru menggunakan sp_restoremergeidentityrange (Transact-SQL). Untuk replikasi transaksional, tentukan nilai tertinggi yang telah digunakan lalu atur titik awal untuk rentang baru. Gunakan prosedur berikut setelah database publikasi dipulihkan:

  1. Hentikan semua aktivitas pada semua Pelanggan.

  2. Untuk setiap tabel yang diterbitkan yang menyertakan kolom identitas:

    1. Dalam database langganan di setiap Pelanggan, jalankan IDENT_CURRENT('<TableName>').

    2. Catat nilai tertinggi yang ditemukan di semua Pelanggan.

    3. Dalam database publikasi di Publisher, jalankan DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1>).

    4. Dalam database publikasi di Publisher, jalankan sp_adjustpublisheridentityrange <PublicationName>, <TableName>.

    Catatan

    Jika nilai di kolom identitas diatur ke dekremen daripada kenaikan, rekam nilai terendah yang ditemukan, lalu reseed dengan nilai tersebut.

Lihat Juga

BACKUP (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL)
IDENT_CURRENT (T-SQL)
IDENTITY (Properti) (Transact-SQL)
sp_adjustpublisheridentityrange (T-SQL)