Kimlik Sütunlarının Çoğaltılması

Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği

Bir IDENTITY sütuna özellik atadığınızda Microsoft SQL Server, kimlik sütununu içeren tabloya eklenen yeni satırlar için otomatik olarak sıralı sayılar oluşturur. Daha fazla bilgi için bkz IDENTITY . (Özellik) (Transact-SQL). Kimlik sütunları birincil anahtarın bir parçası olarak dahil edilebileceğinden, kimlik sütunlarında yinelenen değerlerden kaçınmak önemlidir. Birden fazla düğümde güncelleştirmeleri olan bir çoğaltma topolojisinde kimlik sütunlarını kullanmak için çoğaltma topolojisindeki her düğümün farklı bir kimlik değerleri aralığı kullanması gerekir, böylece yinelemeler gerçekleşmez.

Örneğin, Yayımcıya 1-100 aralığı, Abone A'ya 101-200 aralığı ve Abone B'ye 201-300 aralığı atanabilir. Publisher’da bir satır eklenirse ve IDENTITY değeri örneğin 65 ise, bu değer her Aboneye çoğaltılır. Çoğaltma her Abone’de veri eklediğinde, Abone tablosundaki kimlik sütunu değerini artırmaz; bunun yerine 65 sabit değeri eklenir. Yalnızca kullanıcı tarafından yapılan eklemeler, çoğaltma aracısı tarafından yapılan eklemeler değil, kimlik sütunu değerinin artmasına neden olur.

Çoğaltma, tüm yayın ve abonelik türlerinde kimlik sütunlarını yönetir ve bu sütunları ister el ile yönetmenize ister çoğaltmanın bunları otomatik olarak yönetmesine olanak tanır.

Note

Yayımlanmış bir tabloya IDENTITY sütunu eklemek desteklenmez, çünkü sütunun Abone'ye çoğaltılması durumunda yakınsama olmamasına neden olabilir. Publisher'daki kimlik sütunundaki değerler, etkilenen tablonun satırlarının fiziksel olarak depolanma sırasına bağlıdır. Satırlar Abonede farklı şekilde depolanabilir; bu nedenle, kimlik sütununun değeri aynı satırlar için farklı olabilir.

Kimlik Aralığı Yönetim Seçeneğini Belirtme

Çoğaltma üç kimlik aralığı yönetim seçeneği sunar:

  • Otomatik. Abone'deki güncelleştirmelerle birleştirme çoğaltması ve işlemsel çoğaltma için kullanılır. Publisher ve Aboneler için boyut aralıklarını belirleyin; çoğaltma yeni aralıkların atanmasını otomatik olarak yönetir. Çoğaltma, Abone’deki IDENTITY sütununda NOT FOR REPLICATION seçeneğini ayarlar; böylece değerin Abone’de yalnızca kullanıcı tarafından yapılan eklemelerle artırılması sağlanır.

    Note

    Abonelerin yeni aralıkları alabilmek için Publisher ile senkronize olması gerekir. Abonelere otomatik olarak kimlik aralıkları atandığından, her abonenin sürekli yeni aralıklar istemesi durumunda kimlik aralıklarının tamamını tüketmesi mümkündür.

  • Manuel Abonede güncelleştirme olmaksızın anlık görüntü çoğaltması ve işlemsel çoğaltma, eşler arası işlemsel çoğaltma veya uygulamanızın kimlik aralıklarını program aracılığıyla yönetmesi gereken durumlarda kullanılır. El ile yönetim belirtirseniz, aralıkların Publisher ve her Aboneye atandığından ve ilk aralıklar kullanılırsa yeni aralıkların atandığından emin olmanız gerekir. Çoğaltma işlemi, Abonedeki kimlik sütununu NOT FOR REPLICATION seçeneğiyle ayarlar.

  • Yok. Bu seçenek, yalnızca önceki SQL Server sürümleriyle geriye dönük uyumluluk için önerilir ve yalnızca işlem yayınları için saklanan prosedür arayüzünden erişilebilirdir.

Kimlik aralığı yönetimi seçeneği belirtmek için bkz. Kimlik Sütunlarını Yönetme.

Kimlik Aralıklarının Atanması

Birleştirme çoğaltması ve işlem çoğaltması, aralıkları atamak için farklı yöntemler kullanır; bu yöntemler bu bölümde açıklanmıştır.

Kimlik sütunlarını çoğaltırken dikkate alınması gereken iki tür aralık vardır: Publisher ve Abonelere atanan aralıklar ve sütundaki veri türünün aralığı. Aşağıdaki tabloda genellikle kimlik sütunlarında kullanılan veri türleri için kullanılabilir aralıklar gösterilmektedir. Aralık, bir topolojideki tüm düğümlerde kullanılır. Örneğin, 1'den başlayıp 1 artışla smallint kullanırsanız, Yayımcı ve tüm Aboneler için en fazla ekleme sayısı 32.767'dir. Gerçek ekleme sayısı, kullanılan değerlerde boşluk olup olmadığına ve eşik değerinin kullanılıp kullanılmadığına bağlıdır. Eşikler hakkında daha fazla bilgi için aşağıdaki "Birleştirme Çoğaltması" ve "Kuyruğa Alınmış Güncelleştirme Abonelikleriyle İşlemsel Çoğaltma" bölümlerine bakın.

Publisher bir eklemeden sonra kimlik aralığını tüketirse, ekleme db_owner sabit veritabanı rolünün bir üyesi tarafından gerçekleştirildiyse otomatik olarak yeni bir aralık atayabilir. Ekleme işlemi bu rolde olmayan bir kullanıcı tarafından gerçekleştirildiyse, Günlük Okuyucu Aracısı, Merge Agent veya db_owner rolüne üye olan bir kullanıcı sp_adjustpublisheridentityrange (Transact-SQL) çalıştırmalıdır. İşlemsel yayınlarda, yeni bir aralığın otomatik olarak ayrılması için Günlük Okuyucu Aracısı'nın çalışıyor durumda olması gerekir (varsayılan olarak aracı sürekli çalışır).

Warning

Büyük bir toplu ekleme sırasında çoğaltma tetikleyicisi, eklemenin her satırı için değil yalnızca bir kez tetiklenir. Bu, INSERT INTO ifadesi gibi büyük hacimli bir ekleme işlemi sırasında bir kimlik aralığı tükenirse INSERT ifadesinin başarısız olmasına neden olabilir.

Veri türü Menzil
tinyint Otomatik yönetim için desteklenmez
smallint -2^15 (-32.768) - 2^15-1 (32.767)
int -2^31 (-2.147.483.648) - 2^31-1 (2.147.483.647)
bigint -2^63 (-9.223.372.036.854.775.808) ile 2^63-1 (9.223.372.036.854.775.807)
ondalık ve sayısal -10^38+1 ila 10^38-1

Note

Birden çok tabloda kullanılabilecek veya herhangi bir tabloya başvurmadan uygulamalardan çağrılabilen otomatik olarak artan bir sayı oluşturmak için bkz. sıra numaraları.

Birleştirme Replikasyonu

Kimlik aralıkları Publisher tarafından yönetilir ve Merge Agent tarafından Abonelere yayılır (yeniden yayımlama hiyerarşisinde, aralıklar kök Publisher ve yeniden yayımlayanlar tarafından yönetilir). Kimlik değerleri, Yayıncıdaki bir havuzdan atanır. Yeni Yayın Sihirbazı'ndaki bir yayına kimlik sütunu içeren bir makale eklediğinizde veya sp_addmergearticle (Transact-SQL) kullanarak şu değerleri belirtirsiniz:

  • başlangıçta hem Yayıncıya hem de istemci aboneliklerine sahip Abonelere ayrılan kimlik aralığı boyutunu denetleyen @identity_range parametresi.

    Note

    SQL Server'ın önceki sürümlerini kullanan Aboneler için bu parametre (@pub_identity_range parametresi yerine) yeniden yayımlayan Abonelerde kimlik aralığı boyutunu da denetler.

  • @pub_identity_range Sunucu aboneliklerine sahip abonelere ayrılan yeniden yayımlama için kimlik aralığı boyutunu denetleyen parametre (verileri yeniden yayımlamak için gereklidir). Sunucu abonelikleri olan tüm aboneler, verileri yeniden yayımlamasalar bile yeniden yayımlamak için bir aralık alır.

  • SQL Server Compact veya önceki bir SQL Server sürümüne yönelik bir abonelik için yeni bir kimlik aralığının ne zaman gerekli olduğunu belirlemek amacıyla kullanılan @threshold parametresi.

Örneğin, @identity_range için 10000 ve @pub_identity_range için 500000 belirtebilirsiniz. SQL Server 2005 (9.x) veya sonraki bir sürümünü çalıştıran Yayımcıya ve sunucu aboneliğine sahip Abone dahil tüm Abonelere 10000’lik bir birincil aralık atanır. Sunucu aboneliğine sahip Aboneye, yeniden yayımlayan Abone ile eşitlenen Aboneler tarafından kullanılabilecek 500000’lik bir birincil aralık da atanır (yeniden yayımlayan Abonedeki yayının makaleleri için @identity_range, @pub_identity_range ve @threshold değerlerini de belirtmeniz gerekir).

SQL Server 2005 (9.x) veya sonraki bir sürümü çalıştıran her abone de ikincil bir kimlik aralığı alır. İkincil aralığın boyutu birincil aralığa eşittir; birincil aralık tükendiğinde ikincil aralık kullanılır ve Merge Agent Aboneye yeni bir aralık atar. Yeni aralık ikincil aralık olur ve abone kimlik değerlerini kullandığından işlem devam eder.

Kuyruklu Güncelleştirme Abonelikleri ile İşlemsel Çoğaltma

Kimlik aralıkları Dağıtımcı tarafından yönetilir ve Dağıtım Aracısı tarafından abonelere iletilir. Kimlik değerleri, Dağıtıcıdaki bir havuzdan atanır. Havuz boyutu, veri türünün boyutuna ve kimlik sütunu için kullanılan artışa bağlıdır. Yeni Yayın Sihirbazı'nda bir yayına kimlik sütunu içeren bir makale eklediğinizde veya sp_addarticle (Transact-SQL) kullanarak şu değerleri belirtirsiniz:

  • Başlangıçta tüm Abonelere ayrılan kimlik aralığı boyutunu denetleyen @identity_range parametresi.

  • Publisher’a ayrılan kimlik aralığı boyutunu denetleyen @pub_identity_range parametresi.

  • Bir abonelik için yeni bir kimlik aralığının ne zaman gerekip gerekmediğini belirlemek için kullanılan @threshold parametresi.

Örneğin, @pub_identity_range için 10000, @identity_range için 1000 (Abonede daha az güncelleştirme olduğu varsayılarak) ve @threshold için yüzde 80 belirtebilirsiniz. Bir Abonede 800 ekleme işleminden sonra (1000'in yüzde 80'i), Aboneye yeni bir aralık atanır. Publisher’da 8000 ekleme işlemi yapıldıktan sonra Publisher’a yeni bir aralık atanır. Yeni bir aralık atandığında, tablodaki kimlik aralığı değerlerinde bir boşluk olur. Daha yüksek bir eşik belirtmek daha küçük boşluklarla sonuçlanır, ancak sistem hataya daha az dayanıklıdır: Distribution Agent bir nedenle çalışamazsa abonenin kimlikleri daha kolay tükenebilir.

Kimlik aralıklarının el ile yönetimi için aralıkların atanması

El ile kimlik aralığı yönetimi belirtirseniz, Publisher ve her abonenin farklı kimlik aralıkları kullandığından emin olmanız gerekir. Örneğin, Publisher'da IDENTITY(1,1) olarak tanımlanmış bir kimlik sütununa sahip bir tabloyu ele alalım: kimlik sütunu 1’den başlar ve her satır eklendiğinde 1 artar. Publisher tablosunda 5.000 satır varsa ve tabloda uygulamanın ömrü boyunca biraz büyüme bekliyorsanız, Publisher 1-10.000 aralığını kullanabilir. İki Abone göz önüne alındığında, A Abonesi 10.001-20.000, B Abonesi 20.001-30.000 kullanabilir.

Bir abone anlık görüntüyle veya başka bir yöntemle başlatıldıktan sonra, aboneye kimlik aralığı için bir başlangıç noktası atamak üzere DBCC CHECKIDENT komutunu çalıştırın. Örneğin, A Abonesinde DBCC CHECKIDENT('<TableName>','reseed',10001) komutunu çalıştırırsınız. Abone B'de CHECKIDENT('<TableName>','reseed',20001) komutunu çalıştırırsınız.

Publisher veya Abonelere yeni aralıklar atamak için DBCC CHECKIDENT'i yürütüp tabloyu yeniden göndermek için yeni bir değer belirtin. Yeni bir aralığın ne zaman atanması gerektiğini belirlemek için bir yolunuz olmalıdır. Örneğin, uygulamanız bir düğümün aralığını ne zaman kullanmak üzere olduğunu algılayan ve DBCC CHECKIDENT kullanarak yeni bir aralık atayan bir mekanizmaya sahip olabilir. Ayrıca, aralık dışı kimlik değerinin kullanılmasına neden olacak bir satırın eklenememesini sağlamak için bir denetim kısıtlaması ekleyebilirsiniz.

Veritabanı Geri Yüklemeden Sonra Kimlik Aralıklarını İşleme

Otomatik kimlik aralığı yönetimi kullanıyorsanız, abone bir yedekten geri yüklendiğinde otomatik olarak yeni bir kimlik değerleri aralığı istemektedir. Bir Yayıncı yedekten geri yüklenirse, Yayıncıya uygun bir aralığın atandığından emin olmalısınız. Birleştirme çoğaltması için sp_restoremergeidentityrange (Transact-SQL) kullanarak yeni bir aralık atayın. İşlem çoğaltması için, kullanılan en yüksek değeri belirleyin ve ardından yeni aralıklar için başlangıç noktasını ayarlayın. Yayın veritabanı geri yüklendikten sonra aşağıdaki yordamı kullanın:

  1. Tüm abonelerdeki tüm etkinlikleri durdurun.

  2. Bir kimlik sütunu içeren her yayımlanan tablo için:

    1. Her Abonede, abonelik veritabanında IDENT_CURRENT('<TableName>') komutunu çalıştırın.

    2. Tüm Aboneler arasında bulunan en yüksek değeri kaydedin.

    3. Publisher’daki yayın veritabanında DBCC CHECKIDENT(<TableName>','reseed',<HighestValueFound+1> öğesini yürütün).

    4. Publisher yayın veritabanında sp_adjustpublisheridentityrange <PublicationName>, <TableName> komutunu çalıştırın.

    Note

    Kimlik sütunundaki değer artım yerine azaltma olarak ayarlandıysa, bulunan en düşük değeri kaydedin ve ardından bu değerle yeniden denetleyin.