18 Mart 2014 Salı

Veritabanı Proje Geliştirme Çözümleri - Visual Studio Özellikleri

Microsoft SQL Server verileri iki farklı modeldeki veri tabanlarında tutabilmektedir. Bunlar operasyonel işlemlerin yapıldığı OLTP veri tabanları ve analitik işlemlerin yapıldığı OLAP veri tabanlarıdır.

Yazımızın amacına uygun olabilmesi için kavramlar üzerine şu şekilde bir özet yapabiliriz; Database Engine günlük işlemlerin tutulduğu normalize yapıdaki operasyonel veri tabanlarını veya kompleks analitik işlemler için gerekli verilerin tutulduğu dimensional yapıdaki analitik veri ambarlarını yönetir. Analysis Services ise OLAP amacı ile tutulan, veri ambarlarından beslenen ve cube (Tabular ve PowerPivot da aynı şekilde) olarak ifade edilen yapıları yönetmektedir.

Herhangi bir veritabanı türünü tasarlamak için bir notepad’den faydalanılabileceği gibi (pek iyi bir yöntem sayılmaz) tamamen bu iş için donanımlı hale getirilmiş Visual Studio (SSDT - BIDS - SSMS) veya duruma göre Office ürünleri de kullanılabilir. Her iki modelin kendine has rahat ettiren geliştirme ortamları artık developerların alışkanları arasında yerini almıştır. Örneğin bir BI Developer Multi-Dimensional Cube tasarlamak için SSTD(önceden BIDS)’da proje başlatması gerektiğini bilir. Benzer şekilde veri ambarı tasarımı yapacak bir developer SSMS’yu açarak kısa sürede kodlarla veya arayüzlerle çalışmaya başlayabilir.

SSAS tarafının esas geliştirme ortamı olan Visual Studio(SSDT-BIDS) ve/veya Excel PowerPivot araçları gerekli rahatlığı sağlayabilmektedir. Database Engine için düşünürsek, acaba SSMS proje sürecindeki tüm ihtiyaçların karşılanması konusunda yeterli midir? Veya mevcut özellikler etkin bir şekilde kullanılmakta mıdır?
Bu yazımızda, Database Engine tarafından yönetilen veritabanlarını inşa etmek için kullanılabilecek yöntemlerin elit olanlarına odaklanacağız.

Geleneksel Yöntemler

Geleneksel olarak(DBA bakış açısıyla) bir veritabanı şu yöntemlerle oluşturulmaktadır:

1-      Kodlar ve arayüzler yardımıyla gelişigüzel:
SQL Server Management Studio içerisinde sıfırdan kodlama imkânı olduğu gibi birçok konuda hazır script ve büyük kolaylık sağlayan kullanıcı dostu arayüzler de mevcuttur. Geliştirme bunlar yardımıyla yapılabilir.

Bu ilk yöntem küçük veri tabanları için mantıklı olabilir. Ancak yapılacaklar çoğaldıkça iş çığırından çıkmaya başlayacaktır. Bu durum çok iyi bilmediğiniz bir yoldan işaret bırakmadan geçip gitmek gibi olacaktır. Yeterince uzaklaştıktan sonra geri dönmek istediğinizde ise her izden bir anlam çıkarmaya zorlanmış olursunuz. Yani veritabanında neler olup bittiğini anlamak için bir nevi tersine mühendislik yapmanız gerekir. Hâlbuki bu şekildeki çalışma bir kademe daha geliştirilerek derli toplu hale getirilebilir.

2-      Solution yaklaşımı ile daha düzenli
Veritabanı scriptlerini solution mantığında SSMS üzerinde bir araya getirmek düzenli ve katmanlı çalışma olanağı sağlar. Geliştirme esnasında bir nevi proje dokümantasyonu yapılmış olur. Ayrıca diğer türdeki dosyaları da (notlar, resimler vs.) solution içerisindeki projelerle birlikte taşıma imkânı doğar.

Bu yöntemle çalışmak için SSMS üzerinde File > New > Project yoluyla açılan aşağıdaki pencereden SQL Server Scripts templatei tercih edilir.


Bu pencerede scriptlerin kaydedileceği lokasyon, solutionın ve ilk açılacak projenin adı girilir. Açılan Solution Explorer penceresindeki Solution çatısı altına yeni projeler (Solution > Add > New Project) açılarak scriptler daha üst hiyerarşilerde gruplanabilir.


3-      Database Diagramlar kullanarak daha görsel
Kodlar ile çalışmak artık sizi yorduysa tablo oluşturma ile ilgili işlemleri görsel olarak da yapabilirsiniz.

İlgili tabloları aynı diagramda tutup aralarındaki ilişkileri sürükle bıraklarla kolayca tanımlamak mümkün. Yeni diagramlar Object Explorer’dan ilgili veritabanı altındaki Database Diagrams klasörünü sağ tıklayıp New Database Diagram seçeneği ile oluşturulabilir. Diagramlar üzerinde yapılan tüm değişiklikler veritabanını doğrudan etkileyebilecek şekilde işleneceği unutulmamalıdır.


Geleneksel yöntemler ortalama bir veritabanı projesini başarıyla ilerletmenize olanak tanıyabilir. Ancak proje birkaç developerın birlikte çalışması gerekecek kadar büyüyorsa, değişiklikler ve zaman baskısı artıyorsa, yapılan değişikliklerin versiyonlanması ve versiyonlar arası değişimin takibi gibi talepler doğuyorsa artık geleneksel yöntemlerin biraz dışına çıkma vakti gelmiş demektir. İşte bu noktada Visual Studio üzerinde başlatılabilen SQL Server Database Project devreye girecektir.

SQL Server Database Projesi

Genelde veritabanı oluşturma işi bir yazılım projesi gibi değerlendirilmez. Yazılım projelerinde bir birbirinden beslenen katmanların oluşturulması, defalarca kez yapılan işlemlerin kod kütüphaneleri(dll) haline getirilmesi ve kaynak kullanımının optimize edilebilmesi için tasarım desenlerinin uygulanması gerekir.

Veritabanı geliştirmek istendiğinde ise daha çok konu ve konular arası ilişkiler düşünülerek yapılar bir bir ortaya çıkartılır. Bu süreç her ne kadar geleneksel yöntemlerle sürdürülebilir olarak görünse de yazılımsal mantıkta bir proje yaklaşımı çıkabilecek aksaklıkları ve düzeltmeleri en aza indireceğinden geliştirme aracı tercihini Visual Stuido tarafında kullanmakta fayda vardır.

Bunun için öncelikle Visual Studio’yu açarak File > New > Project seçeneği üzerinden aşağıdaki SQL Server proje türünü tercih ederiz.


Bu örneğimizde YMagaza isimli Solution ve içerisinde YMagaza_1 isimli bir Project oluşacaktır.

Proje özelliklerinin ayarlanması

Proje kapsamındaki ayarları örneğin ortaya çıkacak olan veritabanın konfigürasyonunu yapmak için YMagaza_1 > Properties yoluyla açılan ekrandan faydalanabilirsiniz. Açılan bu ekranın bölümleri arasında gezinerek Debug, Build ve CLR ile ilişkili gerekli ayarları en başta yapmak daha mantıklı olacaktır. Kullanılan ifadelerin uyumluluğu sürekli olarak buradaki ayarlara göre kontrol edilmektir.


Project Settings bölümündeki Target Platform kısmında veritabanının publish edileceği server versiyonunu, Output types kısmında Build edilen projenin Bin\Debug klasöründeki son çıktısının format ve dosya versiyonunu belirtebilirsiniz.

Nesneleri oluşturmak (Table, Schema vs.)

İhtiyacımız olan proje ayarlarını yaptıktan sonra artık gönül rahatlığı ile veritabanını inşa etmeye başlayabiliriz. Düzenli çalışabilmek için proje altında klasörler oluşturarak scriptleri gruplamanızı tavsiye ederim. Örneğin biz YMagaza_1 > Add > New Folder ile Satis isimli bir klasör oluşturup veri tabanlarındaki Schema/Object hiyerarşisini kurmayı tercih edeceğiz. Projemizde Satis klasörü altında tablo, view vs. gibi nesneleri ayrı ayrı klasörlerde tuttuk. Gereken veritabanı nesnelerini YMagaza_1 > Add > New Item… Seçeneği ile istediğimiz klasöre bir bir ekliyoruz. Bu yöntemle tüm veritabanı nesnelerinin şablonlarını projenize dâhil edebilirsiniz.


Eklediğimiz nesneye özgü arayüz, şablon ve varsa yaptığımız hatalarla ilgili açıklamalar çalışmamızı oldukça kolaylaştırıyor.


Birden fazla proje yardımıyla veritabanı geliştirmek

Proje büyüdükçe geliştirme sürecine dâhil olan developerların sayısı veya birbirinden ayrı yönetilmesi gereken işlerin miktarı-çeşidi artacaktır. Bu noktada bir veritabanını birden fazla proje açarak geliştirebilir ve işleri daha üst hiyerarşide ayırabiliriz. Örneğin her bir Schema için ayrı bir proje başlatmak isteyebilirsiniz.

Bu şekilde çalışabilmek için YMagaza > Add > New Project seçeneği ile yeni bir proje başlatıyoruz ve YMagaza_2 adını veriyoruz. Şuanda YMagaza_1 ve YMagaza_2 projeleri bir birinden bağımsız projelerdir. YMagaza_2 projesine References > Add Database Reference… Yoluyla veritabanı referansı ekleyelim.

Add Database References penceresindeki Database Reference bölümünde, bu proje içerisinden işaret edilebilecek nesnelerin bulunduğu projeyi, system veri tabanlarından birini veya dacpac uzantılı olup içerisinde veritabanı iskeletini saklayan herhangi bir dosyayı seçebilirsiniz. Database Location bölümünde ise referansımız ile aynı veritabanı için mi yoksa aynı serverda farklı veritabanı veya farklı serverda farklı veritabanı için mi geliştirme yaptığınızı belirtebiliyorsunuz.


Örneğimizde aynı solution altındaki YMagaza_1 projesini referans ediyoruz ve her iki projenin de aynı veritabanı için sürdürüldüğünü ifade ediyoruz.

Bu sayede artık YMagaza_2 projesindeki bir tablo üzerinde çalışırken YMagaza_1 projesindeki Kategori tablosunda bulunan kolona erişip PK-FK ilişkisini hatasız kurabiliyoruz.


Nesnelerin bağlılıklarını görüntülemek

Bir veritabanı nesnesini nelerin kullandığını görüntülemek isteyebilirsiniz. Bunun için nesnenin üzerine gelip Find All References seçeneğini tıklamanız yeterli. Sonuç penceresinde tüm bağlılıkları listeleyebilirsiniz.


Bu örneğimizde YMagaza_1 isimli projedeki Kategori tablosunun bağlıklarını istedik. Sonuç listesinde YMagaza_2 projesindeki Uretim tablosuyla aralarında bir PK-FK ilişkisi olduğunu görüntüledik. Listeden ilgilendiğiniz yolu tıklayarak kodların bulunduğu sayfayı açabilirsiniz.
Benzer şekilde bir nesnenin tanımlandığı(oluşturulduğu) yere ulaşmak istediğinizde ise nesnenin ismini sağ tıklayıp Go To Definition seçeneğini kullanabilirsiniz.

Snapshot almak

Proje geliştirme süresince zaman zaman belli bir ana kadar olan değişiklikleri saklamak isteyebiliyoruz. Bunun için örneğin YMagaza_2 > Snapshot Project seçeneği ile projenin anlık görünümlerini dacpac paketleri halinde saklamak mümkün.

Publish ayarları

Visual Studio üzerinde yapısını inşa ettiğimiz veritabanını SQL Server’a gönderme işlemine Publish denir. Projeyi publish etmek için YMagaza_2 > Publish seçeneği ile açılan pencerede veritabanı bağlantı bilgilerini, publish scriptini ve davranışlarını ayarlayabilirsiniz. Aşağıdaki pencerede bağlantı cümlesini belirtip Publish butonunu tıklayarak veritabanının serverda inşa edilmesini sağladık.


Artık veritabanımız servera gönderildi ve SSMS üzerinden erişilebilir duruma geldi.


Import Database Özelliği

Projenin sıfırdan nasıl inşa edilebildiğini inceledik. Peki, var olan bir veritabanını da benzer şekilde geliştirmeye devam ettirebilir miyiz?

Bunun için açtığınız bir proje üzerinden (bu örnekte AdwCalisma isimli projede) AdwCalisma > Import yoluyla gelen seçeneklerden uygun olanını tercih ederek hazır yapıyı Visual Studio projesi kapsamına alabilirsiniz.


Buradaki örnekte Database seçeneği ile ilerlersek açılan pencerede gerekli bağlantı ayarlarını ve import opsiyonlarını belirttikten sonra Start butonunu tıklayarak yapının proje içerisine aktarımını başlatabiliriz.


Kısa süre içerisinde import işlemi tamamlanacak ve aşağıdakine benzer bir çalışma ortamı karşımıza çıkacaktır.


Schema Compare Özelliği

Proje geliştirirken takip edilmesi gereken bir başka şey ise iki yapı arasındaki değişikliklerin neler olduğudur. Bu ihtiyaca cevap olarak Schema Compare özelliği kullanılabilir. Bir başka yazımızda Data Compare özelliği ile birlikte incelemeyi planladığım bu özelliğe kısaca bir göz atalım.

Örneğimizde AdwCalisma > Schema Compare seçeneğiyle açılan sayfada karşılaştırmak istediğimiz kaynak ve hedefi belirtiyoruz. Ben bu örnekte proje içerisinde ProductCategory tablosunda birkaç değişiklik yaptım. Şimdi serverdaki veritabanı ile projemizdeki yapıyı mukayese edelim.


Kaynak kısmında projeyi, hedef kısmında serverdaki veritabanını gösterdikten sonra Compare butonu ile mukayese işlemini başlatıyoruz.

Kısa süre içerisinde analiz yapılıyor ve aşağıdakine benzer bir arayüz ile farklılıklar ifade ediliyor.


İsterseniz üst menüde bulunan Update butonunu kullanarak değişikliklerin hedefte uygulanmasını sağlayabilirsiniz.

Veritabanı inşası için kullanılan bu son yöntem, proje süresince doğabilecek neredeyse tüm ihtiyaçları karşılayabilmektedir. Ancak belki siz de benim gibi karma yöntemleri tercih etmek isteyebilirsiniz. Her ne kadar birçok kolaylık sağlasa da geliştirmeyi bir noktaya kadar SSMS üzerinde diagramlarla ilerletmek daha pratik geliyor bana.

Arayüzler beni kesmez kodlar benim işim diyorsanız Visual Studio içerisindeki SQL Database projesi sizin için biçilmiş kaftan demektir.

Örneklerimizde Visual Studio 2013 Ultimate kullandık. İhtiyacınız olan Visual Studio biraz da kendi ortamınıza bağlı olduğu için versiyon ve gereklilikler meselesini size bırakıyorum.


Faydalı olması dileğiyle…

1 yorum:

  1. Bu SQL Database projesini bir winform uygulamaya dahil edip daha sonra tablolar üzerinde değişiklik yapıp, yeni sql table yapısını winform tarafında kod ile nasıl çalıştırabilr veya tetikleyebilirim ki; winform kurulumuyla birlikte yeni update edilmiş DB de gelmiş olsun.

    YanıtlaSil