Selam!
Uzun zamandır Blog'uma giriş yapamadım. Özellikle son zamanlarda icat ettiğim 2 proje ile çok meşgulüm. Çok da haddim olmayarak, ama heyecanla 2 farklı uygulama geliştirme projesine bulaştım. Birisi bir arkadaşımın Cafe'si için hazırladığım sipariş alma uygulaması, diğeri de, ki bu sizleri de doğrudan ilgilendiriyor, SQL Server'a kod taşıma uygulaması. Bu projeleri yaparken SQL Server ile ilgili, küçük ama tatlı yeni şeyler de öğrendim, özellikle de 2. projede!
SQL Server'a kod taşıma ile ilgili olan projemden ayrıntılı olarak bahsedeceğim, ama önce öğrendiğim küçük de olsa yeni şeylere değinmek istiyorum.
İlk aklıma geleni, Database Mail ile eposta gönderirken yaşanılan 2 temel sorun ile ilgili. Birincisi, örneğin sp_send_dbmail ile birlikte
@query parametresini kullandıysanız ve nvarchar(500) veritipi gibi veritipi olan bir alana sorgulama yapıyorsanız, gönderdiğiniz postanın içeriğinde bol bol ------ görürsünüz. Bundan kurtulmak için
@query_result_header = 0 parametresiyle alan başlıklarını sorgulamamayı deneyebilirsiniz.
@query_result_header = 0 kullanarak ----'den kurtulsanız bile, eğer sorgunuz birden fazla kayıt getirecekse bu sefer de kayıtlar arasında 500 karakterlik boşluklar olacaktır. Bunu engellemek için de
@query_resuld_no_padding = 1 parametresi gayet başarılı bir şekilde işe yarıyor!
sp_rename ile SP, Function, View gibi nesnelerin isimlerini değiştirdiğinizde
sys.sql_modules Catalog View'ünde bu değişikliğin uygulanmadığını biliyor muydunuz? Ben bunu testlerim sırasında öğrenmiş oldum. Eğer sp_rename ile yapılan işlemler varsa, o zaman örneğin SP gibi bir nesnenin Create Script'ini sys.sql_modules'ten almaya kalktığınızda yanılmış olursunuz. Evet, belki 10 nesnenin 7'sinde sorun yaşamazsınız, fakat diğer 3'ü için kimse garanti veremez! Özellikle de çalışılan ortam çok sıkı denetimli bir ortam değilse. Microsoft da kendi dokümantasyonunda bir SP'nin adını değiştirmek için sp_rename'in kullanılmamasını, bunun yerine Script'in DROP + CREATE edilmesini öneriyor.
SQL Server'a kod taşıma uygulamama şimdilik verdiğim isim:
SQL Paket Taşıma Yöneticisi. Bu uygulamaya birçok firmada gereksinim olduğunu ve piyasada bu işi yapabilecek doğru düzgün bir uygulamanın olmadığını gördüm. Denizbank'ta çalışırken orada Beamer adında, Intertech'te geliştirilen bir uygulamayı kullanıyorduk. Beamer birçok açıdan pratik bir uygulama. Fakat aynı zamanda küçük ve orta ölçekli firmaların alamayacağı kadar pahalı ve kullanamayacağı kadar kompleks bir uygulama. Beamer'ın satışı genelde bankalara yapılıyor bildiğim kadarıyla. Ben de hem piyasadaki açığı bildiğim için, hem de Beamer'ı, en azından Beamer'ın onay kısmını (hiç paket girişi yapmadım) 3,5 sene kullandığım için bu uygulamadan da esinlenerek "neden paçaları sıvayıp bir deneme yapmayayım ki?" dedim ve bu cürreti gösterdim.
Öncelikle SQL kodunun taşınması sırasında yaşanılan sıkıntılara biraz daha değinmek ve bu uygulamayı yapmamın nedenini biraz daha netleştirmek istiyorum. Küçük ve orta ölçekli firmalarda kod geliştirme işlemlerinin aşağı yukarı nasıl yapıldığını bu ortamlarda çalışıyor olan arkadaşlarım zaten biliyor. Bu ortamlarda genelde sadece bir tane Production SQL Server veritabanı oluyor ve yazılımcılar ya doğrudan geliştirme işlemlerini bu sunucuya RDP yaparak veya uzaktan SSMS ile bağlanarak yapıyorlar, ya da kendi bilgisayarlarında yaptıkları geliştirmeleri yine doğrudan SSMS ile herhangi bir denetime ve versiyonlamaya tabii olmadan yapıyorlar. Bunun neticesinde ne değişikliği geri almak için eski koda erişilmek istediğinde erişilebiliyor, ne taşımayı kimin, ne zaman yaptığı biliniyor, ne de kimin ne amaçla ne iş yaptığı biliniyor. Bu durum da hem güvenlik, hem performans, hem insan hatalarına zemin hazırlıyor.
İşte, SQL Paket Taşıma Yöneticisi bu yaralara çare olması için yapıldı! Ücretlendirilmesi ise küçük ve orta ölçekli şirketler için oldukça cazip olacak, çünkü uygulama özellikle de bu firmalar düşünülerek tasarlandı. Bunun yanında, uygulamanın büyük firmalarda da kullanılmaması için hiçbir sebep yok!
Geliştirme işlemleri ve testleri belli bir aşamaya geldiği için, yarından itibaren test işini birlikte çalıştığım yazılımcı arkadaşlarla yapmaya başlayacağız. SQL Paket Taşıma Yöneticisi'ni size aşağıda birkaç ekran görüntüsü ile tanıtmaya çalışacağım.
Şimdiki Beta versiyonda sizi aşağıdaki giriş ekranı karşılıyor:
|
Resim1: Giriş ekranı |
Resim1'deki Sunucu adı bölümünde, kullanıcıları doğrulatmak istediğiniz sunucu adı bulunuyor. Kullanıcıların doğrulatılmak istenmesinin nedeni, uygulamayı kullanan kişilerin kim olduğunun bilinmesi gerektiği. Çünkü veritabanı değişiklikleri, bu kişilerin girdiği paketlerle yapılıyor olacak. Bunun için hangi kişisel bilgilerin gerektiğine başka bir ekranda tekrar değineceğim. Bu ekrandan temel olarak Windows Authentication veya SQL Authentication yöntemleriyle giriş yapılabilir.
Resim1'deki ekrandan giriş yapıldıktan sonra aşağıdaki ekranla karşılaşıyorsunuz:
|
Resim2: Paket girişi |
Resim2'deki ekran, yazılımcıların paket girişi yapabilecekleri ekrandır. Bu ekrandan DELETE, UPDATE, INSERT, CREATE INDEX vb. işlemler için hem betik girişi yapılabilir, hem de SP, View, Trigger, Function, Table için nesne girişi yapılabilir. Nesne girişi ekranını Resim3'te göreceksiniz. Bu ekran temel olarak şöyle kullanılıyor. Önce sol üst köşede "Uygulama" kutusundan hangi uygulama işin taşıma yapacağınızı seçiyorsunuz. Daha sonra bu uygulamanın hangi ortamına taşıma yapmak istediğinizi, "Taşıma ortamı" kutusundan seçiyorsunuz. Bunların ne demek olduğuna "Uygulama yönetimi" sekmesinden bahsederken daha çok değineceğim. Bir sonraki seçiminiz ise "Taşıma tipi" olacak, ki buradaki Betik ve Nesne taşımalarına özetle yukarıda değindim. Aşağıda nesne ekleme ekranını görebilirsiniz. Bu ekranda, sol tarafta nesneleri görüyorsunuz. Bu nesneler gerçek zamanlı olarak, uygulamanızın (ki bu örnekte uygulama DrAdres uygulaması) test ortamına bağlanılıyor. Çünkü Taşıma ortamı olarak Test->Production seçilmiş. DrAdres uygulamasının test ortamı da yine ekran görüntüsünden görülebileceği gibi "localhost" isimli sunucudaki "test1" veritabanı.
|
Resim3: Paket girişi |
"Taşıma nedeni"nde taşımayı neden yaptığınızı belirtiyorsunuz, bunun için "Proje" veya "Sorun giderme" seçeneklerini seçebilirsiniz. Daha sonra "Paket önceliği" seçeneğiyle paketinizin ne kadar öncelikle çalıştırılmasını beklediğinizi belirtiyorsunuz. Eğer bu adımı çalıştıracak olan yöneticiye bir notunuz varsa, bunu da "Kullanıcı notu"na girebilirsiniz. "Betik içeriği" kutusuna çalıştırmak istediğiniz kodu girin ve eğer hala oluşturmadıysanız "Paket oluştur" düğmesine basarak paketi oluşturun. Daha sonra bu adımı pakete eklemek için "Pakete ekle" düğmesine tıklayın ve bu adımı pakete eklemiş olun. Buradaki mantık şöyle, bir pakette birden fazla adım olabilir. Çünkü yaptıracağınız kod taşıma işlemindeki kodlar biribiriyle doğrudan bağlantılı olabilir ve bu bağlantıyı eposta veya telefonla anlatmak istemezsiniz. Eğer Resim2 ve Resim3'te göreceğiniz "Paket içeriği" düğmesine tıklarsanız, şimdiye kadar "Paket ekle" düğmesine tıklayarak yaptığınız işlemleri göreceksiniz.
|
Resim4: Paketin içeriği |
Bu ekrandaki aşağı ve yukarı ok düğmeleriyle adımların hangi öncelikle çalıştırılacağını belirleyebilirsiniz. "Paketi kaydet" düğmesiyle artık bu paketle işinizin bittiğini ve yöneticinin paketi çalıştırması için hazır olduğunu belirtmiş olacaksınız. Bu noktaya kadar yönetici, bu giriş yaptığınız paketi görmüyordu. "Paketi kaydet" işlemiyle artık paket yöneticiye görünür hale gelecek. Eğer yanlışlıkla yaptığınız bir giriş varsa veya değiştirmek istediğiniz bir adım varsa o zaman "Paketten çıkar" düğmesine tıklayarak seçtiğiniz adımı paketten çıkarabilirsiniz. "Paketi iptal et" düğmesiyle de paketi komple silebilirsiniz.
|
Resim5: Paket onay |
"Paket onay" sekmesini sadece "Paket girebilir" yetkisi olan yazılımcılar da görebilir. Fakat sadece kendi paketlerini görebilirler ve "Paketi aç" işlevini kullanamazlar. "Paketi düzenle" düğmesini kullanarak, yöneticinin onayına sundukları bu paketi yönetici onayından geri alarak tekrar "Paket girişi" sekmesine geri dönebilir ve paketin içindeki adımları tekrar düzenleyebilirler. "Paketin tarihçesi" düğmesi ile kendi paketlerine ait gelişmeleri görebilirler. Örneğin hangi paketteki hangi adımlar çalışmış, hangileri hata almış veya yönetici tarafından reddedilmiş… "Listeleme kriterleri"nden hangi paketlerin listeleneceği seçilebilir. Örneğin sadece çalıştırılanlar veya sadece çalıştırılacaklar veya paket numarasını bildiğiniz ve aradığınız bir paketi de buradan bulabilirsiniz!
Listeyi otomatik yenile kutusu daha ziyade yöneticiler için kullanılabilecek bir özellik. Bu sayede yöneticiler yazılımcıların girdikleri yeni paketleri fark edebilecekler. SQL Paket Taşıma Yöneticisi arka planda kalmış olsa da, Windows'un Görev Çubuğu'nda, saatin de bulunduğu sistem tepsisinde SQL Paket Taşıma Yöneticisi'nin simgesini göreceksiniz. Yeni bir paket geldiğinde bu sekmede yöneticiye "Onaylanacak … kadar paket var" diye bir hatırlatma balonu çıkacak. Bu özellikler sadece yöneticilere görünüyor.
|
Resim7: Hatırlatıcı |
|
Resim7: Paketin içeriği |
Yönetici bir paketi çalıştırmak istediğinde o paketi seçer ve "Paketi aç" düğmesine tıklar. Daha sonra karşısına Resim7'de de gösterildiği gibi paket içeriği çıkar. Yönetici, bu adımları yazılımcıların belirlediği sıraya göre çalıştırır. Farklı bir sırada çalıştırma şansı yoktur, yoksa uygulama tarafından uyarılır. Veya yönetici "Paketi reddet" düğmesiyle paketi komple reddedebilir. Bununla birlikte çalıştırılan adım eğer bir nesneye aitse (yani bir SP, View, Function vd. ise) ve hedef veritabanında bu nesneden daha önce varsa, adım çalıştırılmadan önce bu nesnenin hedefteki yedeği alınır. Bunun sayesinde bir sorun anında "Adımı geri al" düğmesi ile çalıştırılan adım geri alınabilir. Paketi çalıştırmak için "Adımı aç" düğmesine tıklanır ve aşağıdaki ekran açılır:
|
Resim8: Çalıştır |
Betiklere ait paket çalıştırma ekranı Resim8'de gösterildiği gibidir. Aşağıda da nesnelere ait ekranı görebilirsiniz:
|
Resim9: Çalıştır |
Bu ekrandaki kod pencerelerine yönetici doğrudan müdahale edemez. Yani ekranlardaki kodları değiştiremez. Fakat bazı durumlarda çalıştırılacak olan Script'teki komutun CREATE değil de ALTER olması istenebilir diye "ALTER'a çevir" diye bir seçenek eklendi. Bu seçenek kod içerisindeki tüm CREATE'leri tek tek bulur ve size hangisini değiştirmek istediğinizi sorar ve işlemi buna göre yapar. "Reddet" düğmesi ile sadece bu adımı reddedebilirsiniz. "Çalıştır" düğmesi ile kodu hedef veritabanına taşımış olacaksınız. Resim9'da gördüğünüz nesne taşıma ekranı her zaman bu şekilde çıkmayacak karşınıza. Örneğin bu adımı daha önceden çalıştırdıysanız veya hedef veritabanında bu nesneye ait bir örnek zaten varsa o zaman böyle 2 pencere şeklinde göreceksiniz. Soldaki pencere taşıyacağınız yeni kodu, sağdaki pencere ise yapacağınız seçime göre ve eğer varsa eski kodu veya hedefteki güncel kodu gösterecek.
|
Resim10: Uygulama yönetimi |
"Uygulama yönetimi" ekranından, taşımasını yapacağınız uygulamalara ait ayrıntıları girebilirsiniz. Bu ekran sayesinde, sürekli sunucu adlarını, veritabanı adlarını hatırlamak ve aramak zorunda kalmazsınız. Bu ekrandan uygulamanız için uygulama adınızı, ortamını, kaynak sunucu ve veritabanını, hedef sunucu ve veritabanını bir kere belirlersiniz ve sonrasında "Paket girişi" sekmesinde sadece uygulama adını ve ortamını seçersiniz. Tüm bu ekranlar sıkı sıkıya birbirine entegredir.
|
Resim11: Kullanıcı yönetimi |
"Kullanıcı yönetimi" ekranında kullanıcılarınıza ait bilgileri bulabilirsiniz. Buradaki bilgiler, paket girişini kimin yaptığı açısından önemli. Buradaki bilgileri sizin girmeniz şart değil. Bir kullanıcı SQL Paket Taşıma Yöneticisi'ni ilk kez kullanmak istediğinde kendisinden bu bilgileri girmesi rica edilecek. Bilgilerin girilmesi zorunlu değil, fakat her uygulamayı açılışında sorulacağı için sadece 3 satırlık bu bilgiyi girmek isteyecektir =) Ayrıca, buradaki eposta bilgisi kullanılarak, paketini onayladığınız kullanıcıya, paketiyle ilgili ayrıntılar eposta yoluyla aşağıdaki gibi gönderiliyor.
|
Resim12: eposta |
Uygulama genel olarak böyle. "Genel olarak" diyorum, çünkü daha değinmediğim birçok ayrıntı var. Ayrıca bunun, uygulamanın sadece Beta v0.1 versiyonu olduğunu da hatırlatırım! Aklımda daha birçok şey var!
Lütfen yapıcı eleştirilerinizi ve önerilerinizi benden esirgemeyin.
Uzun bir aradan sonra, böyle uzun bir blog ile kendimi affettirmişimdir umarım.
Sevgiler!