28 Haziran 2014 Cumartesi

TransSQL v1.0 BETA - Test çalışmaları 1. faz

Merhaba arkadaşlar,

Önceden "SQL Paket Taşıma Yöneticisi" adıyla sizlerle bazı haberlerini ve bazı özelliklerini paylaştığım çalışmamızın adını "TransSQL" olarak belirledik. Bu isimle SQL kodlarının Transfer edilmesi mesajını vermek istiyoruz. Transfer özü itibariyle Türkçe bir kelime olmasa da artık dilimize yerleşmiş, İngilizce de de kullanılan bir kelime.

www.transsql.com alan adını da almış durumdayız. Uygulama konusundaki çalışmalarımız yoğun bir şekilde devam ettiği için henüz site ile ilgilenemedik. Test çalışmaları belli bir noktaya geldikten sonra umuyorum ki internet sitemizi de devreye alacağız.

TransSQL, sıkı çalışmalarımız sonucu artık paket program haline geldi. Uygulamayı Türkçe ve İngilizceyi tam olarak destekleyecek hale getirmek istiyoruz, şu anda uygulama arayüzleri 2 dili destekliyor olsa da, dokümantasyon şimdilik sadece Türkçe. Zaman içinde bu noktadaki eksik de giderilecek ve uygulama artık yurtdışından arkadaşlar tarafından da kullanılabilecek.

Uygulama artık paket program durumuna geldiği için, başkalarının da test edebilmesi mümkün hale geldi. Eğer talip olanlarınız varsa lütfen benim gmail.com adresime bildirsin. Kendisine uygulamanın Setup'ının olduğu adresi vereceğim.

Test yapmak isteyenlerden ricam, lütfen:
- Karşılaşacağınız her olası sorunu not edin. Sorunla ne yaparken karşılaştınız; karşılaştığınız sorunun tam olarak tanımı, varsa hata mesajı nedir?
- "şu şöyle olsaydı çok daha iyi olurdu" diyebildiğiniz bir şey var mı?
- "şu da olsaydı çok daha iyi olurdu" diyebildiğiniz bir şey var mı?

Test ortamı gereksiniminiz:
- .Net 3.5 yüklü bir Windows OS (Client veya Server farketmez),
- SQL Server 2005 ve üstü versiyon, mümkünse Standard Edition ve üstü. Eğer bu, farklı bir makine olursa daha iyi; ama aynı makine de olsa sorun değil.

Desteğiniz için şimdiden çok teşekkürler!

Ekrem Önsoy

27 Haziran 2014 Cuma

Kerberos Configuration Manager for SQL Server

Merhaba!

Bugün günlük makaleleri okurken Kerberos Configuration Manager for SQL Server ile karşılaştım.

Daha sonra ilk defa 4-5 sene önce karşılaştığım aşağıdaki SQL Server Error Log mesajlarını hatırladım.

SQL Server is attempting to register a Service Principal Name (SPN) for the SQL Server service. Kerberos authentication will not be possible until a SPN is registered for the SQL Server service. This is an informational message. No user action is required.

The SQL Server Network Interface library could not register the Service Principal Name (SPN) [ MSSQLSvc/..com ] for the SQL Server service. Windows return code: 0x2098, state: 15. Failure to register a SPN might cause integrated authentication to use NTLM instead of Kerberos. This is an informational message. Further action is only required if Kerberos authentication is required by authentication policies and if the SPN has not been manually registered.

Bu mesajları ilk gördüğümüzde hemen SPN'in ne olduğunu internetten araştırmış ve öğrenmiştik. Akabinde Domain Administrator'ımızdan da SPN kayıtlarımızı yapmasını istemiştik.

Microsoft sonunda bu konu ile ilgili bir Tool üretmiş. Belki sizin de böyle bir ihtiyacınız olabilir diye paylaşmak istedim.

http://www.microsoft.com/en-us/download/details.aspx?id=39046

Kolay gelsin,
Ekrem Önsoy

18 Haziran 2014 Çarşamba

SQL Paket Taşıma Yöneticisi: Etkilenecek kayıt sayısı?



Merhaba!

SQL Paket Taşıma Yöneticisi uygulamasına beğeneceğinizi düşündüğüm bir özellik eklendi. Zaman zaman DELETE ve UPDATE gibi komutların çalıştırılması gerekiyor. Eğer bu komutu yazan siz değilseniz ve sadece çalıştırmanız gerekiyorsa, o zaman bu komutlar ile kaç tane kaydın etkileneceğini bilmeniz gerekir, ki buna göre bu komutu o anda çalıştırmanın uzun süreli Blocking'lere neden olmayacağından emin olasınız. Çoğu zaman da bu komutu çalıştırmanızı isteyen arkadaşlar, kaç kaydın etkileneceğini size söylemezler. Bu UPDATE ve DELETE komutlarını elle SELECT'lere çevirmek zorunda kalırsınız, aynı WHERE kriterlerini kullanarak kaç tane kaydın etkileneceğini görürsünüz. Örneğin:

Komutu yazan kişinin gönderdiği komut:
UPDATE dbo.tablo SET xxx = 'y' WHERE yyy='x'

Sizin bu komutu aşağıdaki gibi SELECT'e çevirip çalıştırmanız gerekir ki kaç tane kaydın etkileneceğini bilesiniz:
SELECT COUNT(*) FROM dbo.tablo WHERE yyy='x'

Elle taşıma yapmak zaten başlı başına tehlikeli bir iş iken, bir de böyle elle komutlar yazıp çalıştırmak durumu daha da tehlikeli bir hale sokar. Bazen UPDATE'e WHERE kriterinin eklenmesi unutulur ve tüm tablodaki kayıtlar değişiklikten etkilenir. Bu gibi durumların yaşandığını az çok tecrübesi olan herkes zaman zaman görüyor…

İşte yeni eklenen özellik tam da bu soruna parmak basıyor. Aşağıdaki ekran görüntüsünden de görebileceğiniz gibi paket girişi yapan kişi 2 UPDATE ve bir de DELETE komutu girmiş:

Resim1

Önceden de değindiğim gibi normal şartlar altında bu komutları çalıştırmadan önce SELECT'lerini tekrar yazmalı ve kaç kaydın etkileneceğini öğrenmeniz gerekirdi. Fakat SQL Paket Taşıma Yöneticisi'nin "Kayıt sayısını al" özelliği ile artık bu iş de otomatikleşmiş oluyor. "Kayıt sayısını al" düğmesine tıkladığınızda, betiğinizdeki tüm DELETE ve UPDATE komutlarının SELECT'leri otomatik olarak sizin için hazırlanıyor ve isteğinize göre çalıştırılıp kaç kayıt getirdikleri görülebiliyor. 

Resim2

Resim2'de görebileceğiniz gibi "Kayıt sayısını al" düğmesine tıklayınca aşağıda farklı bir bölüm daha açılıyor ve burada, betikteki tüm DELETE ve UPDATE komutları için otomatik olarak SELECT komutları yazılıyor. Olabilecek kritik ortamlar gözönüne alınarak bu işin kontrollü bir şekilde yapılması nedeniyle her SELECT komutunun yanına "Çalıştır" düğmeleri kondu. Her bir SELECT komutunu hemen yanındaki SELECT düğmesiyle çalıştırabilirsiniz. Bu komuttaki WHERE kriteriyle kaç kaydın etkilendiğini hemen düğmenin sağoldaki "Kayıt sayısı" bölümünde görebilirsiniz.

Bunun yanında, her bir SELECT komutunun betik içerisindeki hangi komuta ait olduğunu görmek için SELECT komutunun üstüne tıklayabilirsiniz. Resim2'de de görebileceğiniz gibi 2. SELECT komutuna tıkladığımda betik içerisindeki sonuncu satır da otomatik olarak işaretlendi.

Ekrem Önsoy

16 Haziran 2014 Pazartesi

SQL Paket Taşıma Yöneticisi ve havadisler

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!