Makale Özeti

Büyük projelerde sql veritabanı üzerinde yapılan yapısal değişiklikleri farklı lokasyonlarda bütünlüğünü nasıl sağlarız?

Makale

Merhaba Arkadaşlar,

Büyük projelerde sql veritabanı üzerinde yapılan yapısal değişiklikleri takip etmek, gerektiği zaman yapılan değişiklerin geri alınabilmesi gereksinimi ve farklı lokasyonlarda bulunan aynı veritabanının geliştirme ortamı ile olan yapısal bütünlüğünün korunması her zaman zor olmuştur. Bu zorluğa karşın ne yazık ki bu bahsettiğim şeyler çoğu zaman hayati öneme sahiptir.

Yazının girişinde yapmak istediğim şey hakkında bazı ipuçları vermiş oldum. Gerçekten de yazılım projelerinde database'i yapısal olarak yönetebilmek ve her lokasyonda ki versiyonunu aynı olmasını sağlayabilmek büyük bir sorun. Allahtan ki Visual Studio'nun sahip olduğu proje türlerinden bir tanesi de "Database Project". Bu proje türü sayesinde, sahip olduğumuz database yapısının bir kopyası üzerinde çalışabilir, database entity'lerini değiştirebilir, yenilerini ekleyebilir ve benzer işlemler yapabiliriz. İhtiyacımız olan şey bir "Database Project" yaratmak.

Database Projesi Yaratmak

Resimde bir database projesinin nasıl yaratılabileceği görünüyor. Projemizi bu şekilde yarattıktan sonra içerisinde hiç bir database objesi olmayan bir proje karşımıza çıkacak. Bu aşamada tercih edebileceğiniz iki seçenek var. Ya kendi database yapımızı script yazarak kendimiz oluşturabilirsimiz ya da mevcut database'imizin script'ini alarak projeye ekleriz. Bizim burada ki amacımız ikinci adım, yani mevcut bir database'i bu projeye dahil etmek. Bunu yapabilmek için de "Solution Explorer" penceresinde proje adını mouse ile sağ click yaparak açılan seçenekler arasından "Import Script" seçeneğini tıklamak.

Database Projesi Yaratmak

Açılan pencerenin "Select File" sekmesinden yukarıda ki gibi script dosyamızı seçip "Next" ile devam ederek mevcut database yapımızı projemize aktarabiliriz. Bahsettiğim yapısal elementler table'lar, stored procedure'ler, function'lar, view'lar, user'lar vb. herşey. Benim içeriye alacağım database'im de yalnıca iki tane database table ve bir adet stored procedure var. Mevcut script'i import ettiğinizde projenin ilgili klasörleri altına ilgili database nesnelerinizin gelmiş olması gerekmekte. Aşağıda ki resime benzer bir projeniz olmalı.

Schema View Penceresi

Yukarıda benim database'imde mevcut olan nesneleri görüyorsunuz. İstersem bu nesneler arasına yenilerini ekleyebilir yada mevcut olanları silebilir, güncelleyebilirim. SQL Management Studio'nun bize sunduğu intelisense özelliğini burada kullanamayacağımızı sanmayın. Bu projede de sql intellisense mevcut. Peki bu proje üzerinde çalışmak bana ne kazandırır? Ne gibi faydaları olur? İşte bu sorunun cevabı bu paylaşımı yapma sebebim. Şimdi şunu hayal etmenizi istiyorum; development ortamında üzerinde geliştirme yaptığınız bir database'iniz var. Aynı zamanda ürününüz gerçek ortamlarda müşterileriniz tarafından kullanılıyor ve belli aralıklarla ürününüze ait dosyaları deploy ederek geliştirmesine devam ettiğiniz ürününüzün bu ortamlarda da güncel kalmasını sağlıyorsunuz. Bunlar illa production server'lar olmak zorunda değil. Aynı zamanda farklı müşteri lokasyonlarında ki test server'lar da olabilir. Bahsettiğim bu durumlar düşünüldüğünde database'in her ortamda yapısal olarak aynı kalmasını sağlamak çok zor. Bunun için ya üçüncü parti bir tool kullanacaksınız ya da her yazılım geliştirici database üzerinde yaptığı çalışmaları diğer server'larda ki versiyonlara da aktarıyor olacak (yada bunu yapması için database admin'i bilgilendirecek). Test server'larınız ile birlikte 10 tane lokasyonunuz olduğunu düşünürseniz ve belli ücretler karşılığında üçüncü parti tool'lar kullanmıyorsanız bu size havlu attıracak bir iş. Şimdi çıkış noktamıza geri dönelim. Visual Studio'nun "Debug" menüsünün altında ki "Deploy [Proje_Adı]" seçeneğini kullanarak projemizi istediğimiz hedef sunucuya deploy edebiliriz. Bu şekilde ya sıfırdan bir database yaratırız ya da varolan bir database'in bizde ki versiyon ile aynı kalmasını sağlayabiliriz.

Property Penceresi

Deploy işlemine başlamadan önce bazı ayarlar yapmanız gerekiyor. "Project\[Proje Adı] Properties" menüsünü takip ederek açtığınız ekranın "Deploy" sekmesinin görüntüsü yukarıda verdiğim resimde ki gibi. Bu pencerede deploy edeceğiniz lokasyona ait bilgileri girebilir ve dağıtım işleminin özelliklerini belirtebilirsiniz. Bu özellikleri de "Deployment configuration file" seçeneğinin yanında bulunan "Edit" butonu ile açılan pencereden set edebilirsiniz. Ayrıca bu ekrana "Solution Explorer" penceresinde ki "Properties" klasöründe bulunan "Database.sqldeployment" dosyasına mouse ile çift tıklayarak ta ulaşabilirsiniz. Bu klasörün altında başka property dosyaları da mevcut ancak bizim şu aşamada ihtiyaç duyduğumuz deployment ile ilgili olanı. Deployment property ekranında dikkat etmemiz gereken bir kaç özellik var.

  • Always re-create database: Eğer bu seçeneği işaretlerseniz database ait tüm nesneler eskileri silinerek yeniden yaratılırlar. Çok dikkatkli kullanmanız gereken bir şeçenek. Seçili hale getirirseniz ve hedef database'inizde veriler varsa bu verileri kaybedersiniz.
  • Block incremental deployment if data loss might occur: Eğer bu seçeneği işaretlerseniz yaptığınız değiklikler database'de veri kayıplarına sebep olacaksa deployment işleminin yapılmasını engelleyebilir ve bu şekilde olası veri kayıplarının önüne geçebilirsiniz.
  • Back up database before deployment: Bu seçenek ile deploy işlemi yapılmadan önce hedef database'in yedeğinin alınmasını sağlayabilirsiniz. Bu sayede deployment'ta yaşadığınız bir aksilik sonucunda database'inizi eski haline döndürebilirsiniz.
  • Gördüğünüz gibi bu proje türü sayesinde database'lerinizi farklı yerlere deploy etmek artık çok kolay.Fakat yazı boyunca değinmediğim ve sona sakladığım bir nokta var. Bir takım olarak çalışıyorsanız ve database üzerinde insanların yaptıkları değişiklileri takip etmek yada yapılan yanlış değişiklikleri geri alabilmek istiyorsanız ne yapmanız gerekir? Visual Studio database çalışmalarımızı bir proje olarak yapmamıza imkan sağladığı için projemizi bir source control yapısının içerisine alarak tüm bunları da kolaylıkla yapabiliriz.

    Özet olarak database yapısımızın farklı lokasyonlarda ki versiyonlar ile aynı kalmasını sağlamaya çalıştık. Dilim döndüğünce bildiklerimi sizinle paylaşmak istedim. Dilim sürçtü ise af ola.

    Herkese selamlar.