Merkez ve şubeler arasında transactional replication yapılmaktadır. Bu replikasyon aracılığıyla birçok tablo şubelerden merkeze aktarılmaktadır. Fakat sonraki günlerde ihtiyaç doğrultusunda replike edilen dataya yeni bir nesne(article) daha ekleme ihtiyacı doğdu. Mevcut publication içerisine yeni bir article eklediğimizde varsayılan olarak senkronizasyonu yeniden sağlamak lazım yani başından bu yan tüm tabloların bulunduğu yeni bir snapshot oluşturup bunu şube(-lere) yansıtmak lazım.
Fakat her eklemede tüm snapshot’un yeniden alınması istenilen bir durum deÄŸildir. Hangi nesneler replikasyona dahil edildiyse sadece onlara ait snapshot’un oluÅŸturulması daha doÄŸru olacaktır. Bu sayfada bu iÅŸlemin nasıl yapılacağını örneklendireceÄŸiz. Sehir isimli tabloyı MerkezData isimli publication’a dahil etmek için sp_addarticle prosedürü kullanılır.
EXEC sp_addarticle @publication='MerkezData', @article='Sehir',@source_table='Sehir'
Bu komutu çalıştırdığımızda aşağıdaki gibi bir hata mesajıyla karşılaşırız.
Msg 20607, Level 16, State 1, Procedure sp_MSreinit_article, Line 99
Cannot make the change because a snapshot is already generated. Set @force_invalidate_snapshot to 1 to force the change and invalidate the existing snapshot.
Bu mesajın sebebi hali hazırda bir snapshot oluÅŸturulmuÅŸ olmasıdır. Yeni tablo eklemekle birlikte mevcut snapshot’u kullanamayacağımız için @force_invalidate_snapshot=1 seçeneÄŸini kullanarak yeni geçerli bir snapshot’un oluÅŸturulmasını saÄŸlamalıyız. Kodu aÅŸağıdaki gibi düzenlediÄŸimizde yayına Sehir tablosu eklenmiÅŸ olacak ve abonelere yansıtılmak üzere yeni bir snapshot oluÅŸturulmuÅŸ olacaktır.
EXEC sp_addarticle @publication='MerkezData', @article='Sehir',@source_table='Sehir',@force_invalidate_snapshot=1
Bu iÅŸlemden sonra Snapshot Agent servisi yeniden baÅŸlatıldığı zaman hem daha önceki tabloların hem de Sehir tablosunun ÅŸema ve data scriptleri oluÅŸturulur ve aboneye gönderilir. Oysa bizim istediÄŸimiz durum sadece “Sehir” tablosunun snapshot’unu almasıdır. Bu amaçla kontrol etmemiz gereken yer mevcut publication’ın immediate_sync ve allow_anonymous özellikleridir. sp_helppublication prosedürünü kullanarak mevcut publication hakkında bilgi alınabilir.
EXEC sp_helppublication ‘MerkezData’
Bu komutun sonucunda immediate_sync özelliÄŸinin 1 olduÄŸu yani enabled olduÄŸu görülür.Bu özelliÄŸin aktif olması her yeni tablo eklendiÄŸinde tüm publication için snapshot alınmasını saÄŸlar. Bu özellik genellikle anonymous subscription’a izin vermek için kullanılır. Bu tür aboneler CreatePublication aracını kullanarak mevcut yayına abone olurlar. Bu iki özelliÄŸi aÅŸağıdaki gibi false moduna çekelim.
EXEC sp_changepublication @publication = 'MerkezData', @property = N'allow_anonymous', @value = 'false' GO EXEC sp_changepublication @publication = 'MerkezData', @property = N'immediate_sync', @value = 'false' GO
Şimdi Sehir tablosunu yayına alıp ilgili aboneyle ilişkilendirelim.
EXEC sp_addarticle @publication='MerkezData', @article='Sehir', @source_table='Sehir' GO EXEC sp_addsubscription @publication = 'MerkezData', @article = 'Sehir', @subscriber = 'DW', @destination_db = 'XXX'
sp_addsubscription yordamına alternatif olarak sp_refreshsubscriptions yordamı kullanılabilir.
EXEC sp_refreshsubscriptions @publication = N'MerkezData'
sp_refreshsubscriptions yordamı tanımlı tüm subscriber’lar için eklenmiÅŸ yeni tablolara subscription ekler. Yani tüm abonelere bu yeni tabloya abone eder.
Bu iÅŸlemden sonra Snapshot Agent servisi yeniden baÅŸlatıldığı zaman sadece Sehir tablosunun snapshot’u oluÅŸturulur ve abonelere yansıtılır.
Aynı şekilde Sehir tablosunu Replikasyonda çıkarmak için aşağıdaki prosedürler kullanılır;
EXEC sp_dropsubscription @publication = N'MerkezData', @article = N'Sehir', @subscriber = N'DW' GO EXEC sp_droparticle @publication='MerkezData', @article='Sehir'
Yayınlanan yayınların abonelik durumlarını görmek için sp_helpsubscription yordamı kullanılabilir.
Kaynak : replicationanswers.com




Recent Comments