Merhabalar, bu yazımda sizlere SQL Server üzerinde farklı iki veritabanında bulunan 2 ayrı tablonun birbirine nasıl senkronize edileceği konusundan bahsedeceğim.

Neden böyle bir işlem yaptık?

Bu basit örneklerle anlattığım çalışmayı PRODUCTION geçişinde bir veritabanından diğer veritabanına alınmak istenen bir tabloyu taşımak için kullandık ve 2 dakikalık bir Schedule ayarladık. Yani uygulama en fazla 2 dakika downtime vererek başka bir database üzerinden çalışır duruma geldi ve veri tutarlılığından emin olduk.

Bu işlemde kullandığımız SQL Server SSIS hizmeti ve Merge ifadesi ile ilgili kaynakları aşağıda paylaşıyorum ve anlatmaya geçiyorum.

https://docs.microsoft.com/en-us/sql/t-sql/statements/merge-transact-sql?view=sql-server-ver15

https://www.microsoft.com/en-us/download/details.aspx?id=56827

Öncelikle kaynak(source) ve hedef(target) veritabanlarını belirleyip hedef veritabanında tabloyu taşımak istediğimiz isimde oluşturuyoruz. Bu aşamada eğer istersek tablodaki kolon isimlerini de değiştirme opsiyonumuz bulunuyor.

Ben kaynak veritabanımı “test” ,hedef veritabanımı ise “test2” olarak oluşturdum ve iki tabloya da birbirinden farklı sayıda örnek data ile doldurdum.

SSIS ile tablonun veritabanları arasında aktarılması

Daha sonra kaynak veritabanına sağ tıklayarak ‘Export Data’ seçeneğini seçip SSIS paketi oluşturma işlemine başlanır. Data Source olarak SQL Server Native Client 11.0 seçilip kaynak veritabanı ve erişim bilgileri doldurulup devam edilir. Bu adımda ise hedef veritabanı ve erişim bilgileri girilerek devam edilir. Bu adımda isterseniz belirli bir datanın transfer edilmesi için query yazarak veya tablonun tamamının kopyalanması seçeneğini işaretleyerek devam edilir. Bu adımda ise tablonun nereden nereye hangi isimle ve ne şartlarda kopyalanacağına dair seçenekleri doldurup işleme devam edilir.

Bu adımda SSIS paketini direk çalıştırma veya kaydetme opsiyonlarından eğer ‘’Run immediately’ seçeneğini seçip devam ederseniz işlem 1 kere çalışır ve biter, ancak biz burada ‘Save SSIS Package’ seçeneğini ‘File system’ seçeneği ile işaretleyip paketimizi belirlediğimiz bir şifre ile şifreleyip devam ediyoruz.

Son adımda ise paketin kaydedileceği lokasyonu ve ismi seçip SSIS kısmını sonlandırıyoruz.

SSIS üzerinden oluşturduğumuz paketimizi SQL Server Job oluşturmak üzere eğer belirli bir lokasyonumuz varsa oraya alıyoruz. Yeni Job oluşturma adımında ise Job Step içine girerek Type kısmından ‘SQL Server Integration Services Package’ seçeneği işaretlenip Package source kısmında ‘File system’ seçilerek paketimizin yolu buraya girilir ve 1 kere çalıştırılarak test edilir.

Bu kısımdan sonra T-SQL ifadesi olan ‘MERGE’ kullanacağız.

Peki şu ana kadar neler yaptık?

Bir veritabanı üzerinde bulunan tabloyu başka bir veritabanı üzerinde farklı tablo ve kolon isimleriyle oluşturma işlemini tamamladık.

NOT : Burada dikkat etmemiz gereken konu ise SSIS ile data aktarımı yaptığımız tablo belirlediğimiz Schedule zarfında DROP edilip Daha sonra CREATE edilecektir.

SQL Server Merge ifadesi kullanımı

Bu kısımda ise MERGE ifadesini kullanırken nerler yaptığımıza yoğunlaşıyoruz. Burada SSIS ile hedef tabloya aldığımız SourceCopy ve hedef tablomuz olan Destination tabloları arasında MERGE işlemini gerçekleştireceğiz.

Öncelikle iki tabloda join yapabilmek için ortak olarak kullanacağımız bir alan belirlememiz gerekiyor. Ben buradaki örnekte veri setimde bu alan UNIQUE bir alan olduğundan [EMPNO] alanını kullandım.Bu alanı belirledikten sonra UPDATE işlemi için gerekli şartları belirlememiz gerekiyor. Ben örnekte aynı [EMPNO] değerine sahip olup [ENAME] alanları birbirine eşit olmayan ve [ENAME] alanının boş olmadığı bir UPDATE şartı belirledim. INSERT şartı ise iki tablonun [EMPNO] alanı üzerinde eşleşememesi durumunda yapılacak şekilde belirledim. Eğer yapınızda DELETE ifadesi kullanmanız gerekirse benzer mantıkla bu ifadeyi de kodunuza ekleyebilirsiniz. Ayrıca ‘mergeloop’ ifadesi kodu döngüye sokar ve işlem tamamlanana kadar döngü devam eder. Bunun altında bulunan MERGE TOP(1000) ifadesi ise kodun her defasında TOP(1000) satır için çalışmasını sağlıyor. İsterseniz bu alanı modifiye edebilirsiniz. Bu adımlar belirlenip yapıldıktan sonra oluşturduğumuz MERGE kodunu 1 kere çalıştırıp test ediyoruz ve son adıma geçiyoruz.

Merge işlemi için kullandığımız T-SQL ifadesini aşağıda bulabilirsiniz. Yaptığım örnekte IDENTITIY_INSERT gerekli olmadığından bu kısmı yoruma aldım. Eğer size bu kısım gerekiyorsa açabilirsiniz.

MERGE için kullandığımız kodu aşağıdaki linkten bulabilirsiniz.

https://paste.ubuntu.com/p/wKKwCXTgzv/

Son işlem olarakta önceden SSIS paketini içeren Job içerisine MERGE kodunu aşağıda görüldüğü gibi ekleyerek iki işlemi sırayla çalışacak şekilde ayarlıyoruz. Daha sonra Job Schedule ayarlarını yapıp işlemi sonlandırıyoruz.

Nelerden bahsettik?

Burada SQL Server SSIS servisi ile bir veritabanında başka bir vertabanına (başka bir sunucu üzerinde de olabilir) veri aktarımının nasıl yapılacağını genel hatlarıyla görmüş olduk.

MERGE ifadesi ile aynı veritabanında bulunan iki tablo arasında nasıl senkronizasyon sağlayacağımızdan bahsetmiş olduk.

NOT : Bu işlemi çok büyük olmayan veya çok sık UPDATE işlemine maruz kalmayan tablolarda rahatlıkla uygulayabilirsiniz.

Büyük boyutlu tablolar için nasıl bir yol izleyeceğimizi sonraki yazılarımda paylaşmaya çalışacağım :)

Bir sonraki yazımızda görüşmek dileğiyle…

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store