Bir yazılımcı iseniz, SQL Server’a programlarınız içerisinden erişmek sizin için
hayati derecede önemlidir. Öncelikle, SQL Server’a erişmek için gerekli C# programcığına
göz atacağız. Arkasından, bu programın veritabanına erişmesini engelleyen noktalar
üstünde duracağız.
MS SQL Server orta seviye uygulamalarda özellikle tercih edilen bir büyük ve orta
ölçekli VTYS olarak kabul görmekte. Ücretsiz sürümü olan SQL Server Express Edition’ı
www.microsoft.com da aratarak, indirebilirsiniz.
Yazılımın en son 2005 versiyonu ve bu versiyon için de 2.servis paketi yayınlandı.
İlgili yamaları da üreticinin web adresinden indirebilirsiniz. Bu bölümde örnekler
için dilimiz C#. VB.NET ve benzeri kodlara rahatlıkla dönüşüm yapıp kullanabileceğinizi
düşünüyorum.
SQL Server’a erişim ve erişim sorunlarş ile başa çıkabilmek
SQL Server’a erişecek en basit bir C# kodu aşağıdaki gibi olabilir:
Bu kodlarda, ADO.NET temel nesnelerinden Connection, Command ve DataReader nesnelerini
kullandık.
Visual Studio kurulu ise, bir Console Application türünden proje başlatıp, Istemci.cs
adında yeni bir sınıf açarak örneğimizi çalıştırabilirsiniz.
|
|
Şekil-1: İstemci taraftan verilere erişimin programlanması
|
şayet işler yolunda ise, yukarıdaki şekilde bir sonuç ile karşılaşırsınız. Ancak
genelde aksi bir durum ile karşılaımanız muhtemeldir. Bu türden bir ekranı aşağıda
görebilirsiniz.
|
|
şekil-2: İstemci tarafın SQL Server’a erişememesi sonucu oluşan hatalardan biri.
|
Bu türden hataların nedenleri şunlardan biri olabilir:
- istemci bilgisayardaki bağlantı ifadesi yanlış yazılmıştır veya SQL Server erişim
uygulama arayüzü tarafından anlamlandırılamayan öğeler içeriyordur.
- SQL Server’da ilgili kullanıcı yoktur veya kullanıcı olmasına rağmen, SQL Server
sadece Windows kullanıcılarının erişimine açık, SQL Server kullanıcıların erişimine
kapalıdır.
- SQL Server ile istemci yazılım farklı bilgisayarlarda ise, SQL Server’ın üstünde
kurulu olduğu bilgisayarda Windows Firewall açıktır ve SQL Server’a erişilmesini
engelliyordur.
şimdi bütün bu sorunların çözümünü teker teker ele alalım:
1.Bağlantı İfadesi Problemlerine Çözüm Önerileri
Yukarıdaki örneğimizde, bağlantı ifadesi şu şekildedir:
Data Source=.\yukon;user ID=webuser;password=zor1~sifre;Initial Catalog=dukkan
Bu ifadede yer alan bilgiler aşağıda verilmiştir.
|
Parametre |
İşlev |
|
Data Source |
SQL Server’ın ağdaki adı. |
|
User ID |
SQL Server üstünde bir kullanıcı. |
|
ObjectDataSource |
İş nesnelerinden gelen verileri saklar. |
|
Password |
Kullanıcıya ait şifre. |
|
Initial Catalog |
Bağlanılacak olan veritabanı adı |
|
Tablo-1: Bağlantı ifadesi parametreleri ve işlevleri |
Bir bağlantı ifadesinde nokta yerel sunucuyu, .\yukon ise yerel sonucu üstünde kurulu
bir SQL Server yazılımını ifade etmekte.Ancak nokta(.) her zaman doğru bir ifade
olmayabilmektedir. Bunun yerine alternatif olarak aşağydaki değerleri teki tek yazarak
çalışıp test edebilirsiniz:
(local)
(localhost)
127.0.0.1
127.0.0.1,1433 (Burada 1433 SQL Server’yn kurulu olduğu portu ifade etmektedir.
Başka bir porta kurulu ise doğru port bilgisi ile değiştirebilirsiniz)
Halen erişim problemi varsa protokol olarak ek bilgi verebilirsiniz.
Network Library=DBMSSOCN
Bütün bunlardan sonra, bir bağlantı ifadesi aşağıdaki gibi olabilir:
Data Source=(local)\yukon;user ID=webuser;password=zor1~sifre;Initial Catalog=dukkan,
Network Library=DBMSSOCN
2.Kullanıcı Problemlerine Çözüm Önerileri
Bazı durumlarda SQL Server’a erişim ifadeleriniz doğru olmasına rağmen, erişim ifadesinde
yer alan kullanıcının haklarının yeterli olmaması veya şifresinin doğru olmaması
gibi sorunlar da istemci yazılımınızın kırılmasına neden olabilir.
SQL Server’ın yetkilendirme modunu kontrol etmek için, Management Studio aracını
kullanarak, SQL Server’i sa? tıklayıp properties menüsünden security yan sekmesini
tıklayarak aşağıdaki ekrana ulaşabilirsiniz. Bu ekranda seçili olarak Windows Authentication
seçili ise SQL Server and Windows Authentication yapın.
|
|
şekil-3: SQL Server’in yetkilendirme modunun değiştirilmesi
|
Bu ayarı yaptıktan sonra SQL Server’i yeniden başlatmanız gerekir. Aksi halde ayarlarınız
bir sonraki yeniden başlatım işlemine kadar geçerli olmayacaktır.
SQL Server erişim sorununuzun halen devam ettiğine inanıyorsanız ve buraya kadarki
seçenekler çözüm olmadı ise erişmeye çalıştığınız kullanıcının gerçekten var olup
olmadığına bakın. Bu kontrol için de Management Studio aracından yararlanacağız.
SQL Server ‘da açtığınız bir veritabanına erişim için iki aşamalı bir kullanıcı
oluşturma işlemi yapmak gerekir:
1. SQL Server’a erişecek bir login: Login bilgileri, sadece SQL Server alanına giriş
için kullanılabilir. Bir user ile ilişkilendirmek sureti ile dışarıdaki uygulamaların
bir veritabanına da erişim sağlanmasında kullanılır. SQL Server’da Security\Logins
sekmesinden erişilebilir.
2.İlgili veritabanına erişecek bir kullanıcı: Login bilgisi, bir kullanıcı tanımı
ile herhangi bir veritabanına erişebilir. Herhangi bir veritabanı içerisindeki Security\Users
menüsünden erişilebilir. Bir veritabanı kullanıcısının verileri görebilmesi için
en az seçme hakkının verilmesi gerekir. Veritabanı kullanıcısına bütün hakları vermek
için db_owner adlı database role’üne bağlayabilirsiniz. Ancak bu güvenlik açısından
oldukça büyük riskler taşır.
|
|
şekil-4: Bir veritabanı kullanıcısına db_owner rolünün verilmesi
|
Bütün bunların dışında, login aşamasında verdiğiniz şifre ile bağlantı ifadesinde
yer alan şifrenin aynı olması gerekir.
Bu konuda son olarak, bir veritabanını deattach edip uzaktaki bir SQL Server’a yeniden
attach ettinizse, kullanıcı ver logini silip yeniden oluşturmanız gerekir. Çünkü
login bilgisi bir sunucuya özgüdür ve veritabanı taşınsa bile karşıdaki sunucuda
aynı bilgilerle örtüşmeyebilir.
3.Firewall Problemlerine Çözüm Önerileri
Başka bir erişim sorunu kaynağı olarak Firewall engelini değerlendirmelisiniz. Buraya
kadar her şey yolunda ise firewall kaynaklı bir erişim sorunu olup olmadığını anlamak
için, SQL Server’ın üstünde kurulu olduğu bilgisayardaki Windows Güvenlik Duvarı
bileşenine denetim masası aracılığı ile erişin ve açık olup olmadığına bakın.
şayet bu firewall açık ise kapatabilirsiniz ancak bu da bir güvenlik açığına neden
olabilir. Bu türden riskli bir çözüme bir alternatif olarak güvenlik duvarına SQL
Server için istisnai durum ayarı girip sadece bu program tarafından kullanılan portları
açabilirsiniz. Bu türden bir durum için örnek resim olarak şekil-5 ‘e göz atabilirsiniz.
|
|
şekil-5: Bir sistemde güvenlik duvarının çalışıp çalışmadığına bakmak.
|
Firewall ayarlarından, özel durumları tıklayın ve bağlantı noktası ekle butonunu
tıkladıktan sonra açılan ekranı aşağıdaki şekilde doldurup Tamam’ı tıklayın. Böylelikle
sadece SQL Server’a gelen istekler için yetkilendirme yapmış olduk.
|
|
Şekil-6: Güvenlik duvarına bir istisnai durum eklemek.
|
Windows güvenlik duvarı dışında istemci uygulama ile SQL Server arasında başka firewall’lar
varsa ilgili ayarları bu firewall’lara da girmeniz gerektiğini unutmayın.
MS SQL Server’i Türkleştirmek
Genelde en çok karşılaşılan sorunlardan biri, uygulamanın geliştirme işlemi sırasında
veritabanı ile uygulama arasındaki dil uyumunun, uygulama çalışacağı sunucuya taşındığında
çeşitli karakterlerin sorunlu olarak görünmesi veya tarih formatının istenilen biçimde
olmaması gibi sorunlarla karşılaşmak muhtemeldir. Bu türden durumlarla yüzleşmemek
için, bir uygulamayı tasarlarken bazı noktalara dikkat etmeniz ilerleyen aşamalardaki
işlerinizi kolaylaştırabilir.
Karakter sorunları ile başa çıkmak
Karakter sorunları ile başa çıkabilmek için yapılması gereken ilk şey, işletim sistemi
seviyeli karakter ve dil ayarlarına güvenmeyip, veritabanı seviyeli collation ayarlarını
kullanmaktır. Aşağıdaki şekilde bu türden bir ayarlamanın açılmış bir veritabanı
için nasıl yapılması gerektiği gösterilmektedir. İlgili pencereye ulaşmak için,
Management Studio aracından, ilgili veritabanına sağ tıkladıktan sonra properties
menüsünü tıklamanız yeterlidir.
|
|
Şekil-7: Bir veritabanı için, verileri girmeden önce, dil ayarını Turkish_CI_AS
yapmak bir çok dil probleminden sizi kurtarabilir.
|
Ancak bu türden bir ayarlamanın tamamen sorununuzu çözebilmesi için yapılması gereken
başka ayarlamalar da gerekebilir. Bunlardan bir tanesi, metin girilecek alanlarınız
için özel Collation ayarlaması yapmayıp, <Database Default> ayarlaması ile
idare etmenizdir. şayet önceden kalma bir ayarlama mevcut ise sildiğiniz anda database
default olarak değişecektir. Bu türden bir örnek Şekil-8’de gösterilmiştir.
|
|
şekil-8: Metin girilecek alanlar için Collation ayarlarını veritabanı ile eşit hale
getirmek.
|
Bu iki ayarlamayı yapmanız, temel karakter sorunları ile baş edebilmeniz için yeterli
olacaktır.
Tarih formatı
En az Türkçe karakter sorununu kadar çok uğraştıran başka bir sorun olarak SQL Server
üstündeki tarih formatı sorunu da baş ağrıtabilmektedir. Bu türden bir sorunun varlığını
anlamak için geliştirdiğiniz istemciden 14.12.2005 gibi 12’den büyük bir gün içeren
tarih bilgisini veritabanına yazmaya çalışın(INSERT veya UPDATE ) bu durumda şayet
ifadeniz bir tarih formatı aşımı hatası veriyorsa muhtemelen tarih formatınız gg.aa.yyyy
yerine aa.gg.yyyy bekleniyor demektir.
Bu sorun ile başa çıkabilmek için yapılması gereken ayarlamaları bu kısımda ele
alacağız. ilk olarak 1.başlıkta login oluşturmak bahsinde ele aldığımız şekilde
bir uygulama logini oluştururken, bu logine ait dil ayarının Türkçe olarak seçilmesi,
veritabanına gönderdiğiniz tarihlerin gg.aa.yyyy formatında kabul edilmesini sağlayacaktır.
|
|
şekil-9: Veritabanınıza giden tarihlerin gg.aa.yyyy olarak algılanması için veritabanı
uygulama login bilgisi için dil ayarı yapılması.
|
Ancak bu ayarlama, veritabanından okuduğunuz tarihlerin Türkçe tarih formatı ile
gelmesini sağlamaya yetmeyebilir. İlgili veritabanı için default dil ayarını Turkish
olarak değiştirmeniz, bu türden bir sorunu da çözmek için yeterli olacaktır. Bu
türden bir ayarlama için şekil-9’a göz atabilirsiniz.
|
|
şekil-10: bir veritabanı için default dil ayarının Turkish yapılması.
|
Son olarak, herhangi bir tarih sütunundaki verileri CONVERT fonksiyonu ile de Türkiye
tarih formatına çevirebilirsiniz. Bunun için günün tarihini seçip, Türkiye formatı
ile gösteren bir sorgu aşağıdaki gibi olabilir. Buradaki 104 parametresi gösterim
formatını tayin etmektedir. GETDATE() ise SQL Server’in tarihini okuyan bir fonksiyondur.
SELECT CONVERT(VARCHAR(10),GETDATE(),104)
Sonuç
Sonuç olarak, bu bölümde SQL Server üstünde bir veritabanı uygulaması geliştirmeye
başlamanın ilk aşamasında veya ilerleyen bölümlerinde yüzleşilmesi muhtemel sorunları
sizlerle paylaşıp olayın en başında önlem alabilme yollarını özetlemeye çalıştım.
Bir sonraki bölümde görüşmek üzere…
Gelecek Bölümde, SQL Server’da alınması gereken temel güvenlik önlemlerinini ele
alacağız.