SQL Server Replication – Şema Değişikliği

Kurulu olan bir replikasyona yeni nesne ekleme, mevcut nesne silme gibi işlemler bir gereksinim olduğu gibi bazı durumlarda tablodaki kolonların veri tipi değişimi, kolon adı değişimi gibi ihtiyaçlar da doğabiliyor. Daha önce yazdığımız SQL Server Replication – Yeni Tablo Ekleme makalesinde replikasyona yeni bir tablo nesnesinin nasıl ekleneceğini örneklendirmiştik. Bu yazıda da bir tablodaki kolonu replikasyona eklemek, replikasyonda çıkarmak ve şemasını değiştirdiğimizde replikasyonun nasıl etkileneceğini göreceğiz.
SQL Server üzerinde replike edilen bir tabloya yeni bir kolon eklediğimizde veya tablodan kaldırdığımızda (ALTER TABLE ADD / ALTER TABLE DROP) SQL Server 2000 bunu doğrudan replikasyona dahil etmez SQL Server 2005 ise bunu default olarak replikasyona dahil eder. SQL Server 2000’de yeni kolonu replikasyona dahil etmek için ya sözkonusu tablo yeniden replikasyona dahil edilir veya sp_repladdcolumn ve sp_repldropcolumn prosedürleri kullanılır. Eğer tablodaki kayıtlar az ise aşağıdaki gibi tabloyu mevcut replikasyondan çıkarıp yeniden dahil etmek daha kolay bir çözüm olarak tercih edilebilir.

--W00 isimli abonenin Urun nesnesine olan aboneliğini kaldırıyoruz
exec sp_dropsubscription @publication = 'MerkezData'
, @article = 'Urun'
, @subscriber = 'W00'
, @destination_db = 'akaymaz' 

--Mevcut publication içerisinden Urun tablosunu çıkarıyoruz
exec sp_droparticle @publication = 'MerkezData'
, @article = 'Urun'

--Urun tablosuna Fiyat kolonu ekleyelim
ALTER TABLE Urun ADD Fiyat int null

--MerkezData isimli yayına Urun nesnesini ekliyoruz
exec sp_addarticle @publication = 'MerkezData'
, @article = 'Urun'
, @source_table = 'Urun'
, @ins_cmd = N'SQL', @del_cmd = N'SQL', @upd_cmd = N'SQL'

--W00 istemcisinin Urun nesnesine abone edelim
exec sp_addsubscription @publication = 'MerkezData'
, @article = 'Urun'
, @subscriber = 'W00'
, @destination_db = 'akaymaz'

Bu kodları çalıştırdıktan sonra Urun tablosunun yeniden abonelere aktarmak için bu tablo için snapshot oluşturmak gerekir.

Bunu oluşturmak için “Snapshot Agent” servisini başlatmak yeterli olacaktır. Snapshot Agent, eklenen tablo için bir snapshot oluşturacaktır. Bu snapshot içerisinde tablodaki tüm kayıtlar olacağı için bu yöntem yükse satırlı tablolarda sorun teşkil edebilir. Büyük tablolar veya snapshot oluşturulmasını istemediğimiz durumlar için ikinci yöntem alternatif olarak kullanılabilir. Bu yöntem sp_repladdcolumn ve sp_repldropcolumn prosedürlerinin kullanılmasıdır. Bu prosedürler publish edilmiş tabloya yeni kolon ekler veya tablodaki kolonu çıkarır. Örneğin Urun tablosunda bulunan Fiyat kolonunu replikasyona dahil edelim. Fakat bu tabloda daha önce bulunan kayıtları da karşı tarafa aktarmamız gerekiyor. snapshot işlemi olmayacağı için ara bir kolon oluşturmamız gerekecektir. Aşağıdaki gibi tmpFiyat isimli bir alan oluşturacağız Fiyat alanındaki değerleri tmpFiyat alanına taşıyacağız. Fiyat alanını silip ardından replikasyonda dahil edilecek şekilde yeniden oluşturacak ve tmpFiyat alanındaki verileri Fiyat alanına taşıyacağız.

exec sp_repladdcolumn @source_object = 'Urun'
, @column = 'tmpFiyat'
, @typetext = 'int NULL'
, @publication_to_add = 'MerkezData'

update Urun set tmpFiyat = Fiyat

exec sp_repldropcolumn @source_object = 'Urun'
, @column = 'Fiyat'

exec sp_repladdcolumn @source_object = 'Urun'
, @column = 'Fiyat'
, @typetext = 'int NULL'
, @publication_to_add = 'MerkezData' 

update Urun set Fiyat = tmpFiyat

exec sp_repldropcolumn @source_object = 'Urun'
, @column = 'tmpFiyat'

Bu yöntemlerden farklı olarak şu da yapılabilir; replikasyonu kurarken kullandığımız sp_articlecolumn isimli prosedür aracılığıyla mevcut replikasyona tablodaki kolon eklenir. Böylece bundaki sonraki işlemlerde bu kolon da dahil edilmiş olur. O arada o kolondaki eski kayıtları linked server veya Import/Export ile aboneye taşıyıp şube ile merkez senkronize edilebilir.

exec sp_articlecolumn @publication = N'MerkezData',
@article = N'Urun',
@column = N'Fiyat', @operation = N'add'

exec sp_articlecolumn @publication = N'MerkezData',
@article = N'Urun',
@column = N'Fiyat', @operation = N'drop'

SQL Server 2005’te 2000’den farklı olarak replike edilen bir tabloya yeni kolon eklediğimizde bu kolon default olarak replikasyona dahil edilir. Aşağıdaki gibi Cinsiyet alanını eklediğimizde otomatik olarak abonedeki Musteri tablosuna da Cinsiyet alanı eklenecektir.
ALTER TABLE Musteri ADD Cinsiyet int
Aynı şekilde alanı DROP ettiğimizde abonedeki Cinsiyet alanı da kaldırılmış olacaktır.
ALTER TABLE Musteri DROP COLUMN Cinsiyet
SQL Server 2005’te de mevcut bir kolonu replikasyona dahil etmek için sp_articlecolumn yordamı kullanılabilir.
Şimdi şema değişikliği konusuna değinelim. SQL Server 2000’de replikasyonda bulunan bir tablo üzerinde ortamında şema değişikliği yapmak istediğimizde aşağıdaki hata mesajıyla karşılaşırız.
ALTER TABLE Urun ALTER COLUMN Fiyat numeric(9,2)
“Cannot alter/drop the table ‘Urun’ because it is being published for replication”.
SQL Server 2005’te tahmin edileceği gibi kolon ekleme, çıkarma gibi şema değişikliği de default olarak aboneye yansır. Bu özellik sp_addpublication veya sp_changepublication yordamları için kullanılan @replicate_ddl parametresiyle belirlenmektedir.

sp_changepublication @publication='MerkezData',
	@property = N'replicate_ddl', @value = 0

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.