Örnek Bölümler ve İçindekiler

Transkript

Örnek Bölümler ve İçindekiler
Yazılımcılar İçin SQL Server 2008
ve
Veritabanı Programlama
Yaşar Gözüdeli
YAZILIMCILAR İÇİN
SQL SERVER 2008
ve
VERİTABANI PROGRAMLAMA
4. BASKI
Ankara, 2009
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Yaşar Gözüdeli
Bilgisayar Kitapları Dizisi: 99
ISBN 978-975-02-1014-3
Dördüncü Baskı:
Haziran - 2009
© Seçkin Yayıncılık San. ve Tic. A.Ş.
Bu kitabın her türlü yayın hakkı Seçkin Yayıncılık San. ve Tic. A.Ş.'ye aittir. Yayınevinin yazılı izni olmadan, tanıtım amaçlı
toplam bir sayfayı geçmeyecek alıntılar hariç olmak üzere, hiçbir şekilde kitabın tümü veya bir kısmı herhangi bir mecrada
yayınlanamaz ve çoğaltılamaz.
Sayfa Tasarımı:
Seçkin Yayıncılık
Kapak Tasarımı:
İsmail Çam
Yayın ve Dağıtım:
Merkez: Seçkin Yayıncılık, Sağlık Sokak No: 19/B-21 06410 Sıhhiye, ANKARA
Tel: (0–312) 435 30 30 (Pbx), Faks: (0–312) 435 24 72
Şube: Ankara Adliye Sarayı K Blok Zemin Kat Sıhhiye, ANKARA Tel: (0-312) 309 52 48
Şube: Abide-i Hürriyet Caddesi 259/4 (Şişli Ceza Adliyesi Altı) Şişli - İSTANBUL Tel: (0-212) 234 34 77
Web Adresi: www.seckin.com.tr, E–posta: yayin@seckin.com.tr
Baskı:
Sözkesen Matbaacılık, Tel: (0–312) 395 21 10
Teşekkür
Bu kitabın ortaya çıkmasında en büyük fedakârlık şüphesiz ki aylarca, kendilerine ait
olan zamanda bilgisayarla baş başa kalmama tahammül edebilen eşim Lale'ye, kızım Neva'ya ve oğlum Yusuf Hakan'a aittir. Kendilerine teşekkür ederim.
Özellikle yeni nesil Microsoft teknolojileri konusunda beni yaşama bağlayan Özcan Koç'a; SQL Server'in gelişim sürecinde, kitap fikrimi sürekli taze tutan ve beni yüreklendiren, Sefer Algan ve Tolga Yaramış olmak üzere tüm arkadaşlarıma teşekkürlerimi sunarım. 9.Bölümde yer alan Uzaysal Veri Tipleri'ne olan katkılarından dolayı Mehmet Karaman'a, 10.Bölümde yer alan ADO.NET 2.0 yenilikleri bahsine katkılarından dolayı
Burak Selim Şenyurt'a teşekkür ederim. Kitap içeriğini sizlerden önce okuyarak, gerek
fikirleri gerekse değerlendirmeleri ile sizlere daha az hatalı bir kitap sunmam konusunda
bana yardımcı olan değerli yazılım geliştirici arkadaşlarım Volkan Verim, Oğuz Kağan
Yağmur ve Salih Bozkurt'a teker teker teşekkürlerimi sunarım.
Kitap içeriğinin ve müfredatının genel kabul görmüş bir müfredat haline gelmesinde,
INETA- MEA'nın Verivizyon'a verdiği destek şüphesiz yabana atılamaz. Bu kapsamda
INETA'ya teşekkürlerimi sunarım. Yine kitap müfredatına alınmış konuların anlatımlarının olgunlaşması Verivizyon aktiviteleri ile sağlanmıştır. Verivizyon tarafından düzenlenen seminer, eğitim ve benzeri etkinliklere emeği geçen ve katılan herkese teşekkürlerimi sunarım. Kitabın düzenlenmesi ve okunabilir hale gelmesinde emeği geçen Seçkin
Yayıncılık çalışanlarına ve desteklerinden dolayı bütün mesai arkadaşlarıma teşekkür
ederim.
Kitabın bundan önceki baskıları hakkında, teveccühlerini veya düzeltmelerini ileterek
daha iyiyi arama serüvenimde bana destek veren okurlarıma teşekkür ederim. Günlük
hayatta karşılaştıkları sorunları ve çözümlerini dolayısıyla da tecrübelerini benim aracılığımla siz okurlara ulaştıran yazılımcı dostlarıma, son olarak bu kitabı okumaya değer görüp elinize aldığınız için ve belki bana görüşlerinizi ileterek daha iyiyi bulmama yardımcı
olacağınız için size teşekkürlerimi sunarım.
INETA Hakkında
Kısa adı INETA olan International .NET Association, Microsoft .NET temelli yazılım
geliştiriciler için paylaşım alanı sağlayan bir oluşum. INETA'nın hedefi, dünyanın birçok
yerinde oluşturulmuş BT topluluklarının kendi üyelerini Microsoft. NET teknolojileri
konusunda eğitebilmeleri ve bu teknolojilerin tanıtımını yapabilmeleri için gerekli kaynak ve destekleri sağlamak. BT Profesyoneli, yazılım geliştirici veya mimar yahut ta proje
yöneticilerinden oluşan kullanıcı toplulukları INETA'nın destek verdiği topluluk kapsamında ele alınmakta.
Bir kullanıcı topluluğunun INETA çerçevesinde yer alabilmesi için, herhangi bir .NET
alanı veya .Net'in tüm alanları ile ilgileniyor olması veya birçok başka yazılım geliştirme
teknolojilerinin yanı sıra .NET ile de ilgileniyor olması gerekmekte.
Kâr amacı gütmeyen ve bağımsız bir kuruluş olan INETA, Microsoft ve diğer sponsorlarının desteğinde, dünyanın birçok yerindeki çok sayıda kullanıcı topluluklarının yöneticileri aracılığıyla yürütülmektedir.
INETA'YA Katılmak
INETA üyeliği, bütün kullanıcı toplulukları için şu anda, yer, ilgi odağı ve ilişki ayrımı
yapmaksızın ücretsiz yapılmakta. .NET ile ilgili bir grup için en etkin değer kazanımı aktif INETA katılımı ile mümkündür.
Bir yazılım geliştirici olarak, INETA çerçevesinde rol alabilmek için size en yakın
INETA topluluğunu www.ineta.org adresinden bulabileceğiniz gibi, uygun bir topluluk
bulamamanız halinde siz de etrafınızda .NET teknolojilerini kullanan yazılım geliştiricileri bir araya getirerek INETA olanaklarından faydalanıp, INETA içerisinde aktif rol üstlenebilirsiniz.
INETA, üyeliğe kabul ettiği bir topluluğun muntazaman gelişimini sürdürebilmesi için,
üyelerine yönelik düzenli aktivitelere teşvik etmektedir. Ayrıca üye kullanıcı topluluklarının seminer verebilmeleri için ortam ve konuşmacı sağlanması, seminer anında meşrubat ve pizza sunulması gibi konularda kullanıcı gruplarına destek olmakta, gerektiğinde
kitap türü bilgilendirici materyaller ile de onların küresel eğilimlerle bütünleşmiş kalması
hususunda destek sağlamaktadır.
INETA hakkında daha fazla bilgi için, www.ineta.org adresine göz atabilirsiniz.
INETA'nın Önsözü
Günümüzün kurumsal bilgi teknolojileri altyapılarını oluşturan bir çok veritabanı yönetim sistemi içerisinde SQL Server en yaygın kullanılanı olarak dikkat çekiyor. Her geçen
gün daha fazla uygulamanın, SQL Server uyumlu olarak pazarda kendisine sağlam bir yer
edindiğini görüyoruz.
Bu gelişim süreci, uygulama geliştiricilerden bilgi teknolojileri yöneticilerine kadar geniş
bir kitlenin MS SQL Server hakkında teknik bilgilere daha kolay ve örneklerle desteklenmiş olarak erişebileceği bir kaynak ihtiyacını doğuruyor. Yaşar Gözüdeli, SQL Server
2005 konusundaki kitabı ile başladığı yolculuğuna SQL Server 2008 ile devam ederek bu
ihtiyacı karşılıyor.
SQL Server ürününü gerçekleştiren yazılımcılar bir alan veya teknoloji üzerinde son derece detaylı bir uzmanlığa sahiptirler. Yazdıkları ürünün özelliklerini bilmenin ötesinde
yaşadıkları için çoğu zaman bu detayları kullanıcılar veya yazılımcılara basit bir açıdan
aktarmakta zorlanırlar. İşte bu noktada Yaşar Gözüdeli derin ve uzun araştırmalar gerektiren bilgileri özümseyip, onları sistematik bir şekilde okuyucusunun en çok yarar sağlayabileceği şekilde sunuyor.
SQL Server 2008 dendiğinde benim aklıma gelen ilk şey güvenlik; Diğer veritabanı yönetim sistemleri ile karşılaştırıldığında uzun senelerdir sıfır veya sıfıra yakın güvenlik açığı olmasını, kurumsal güvenlik politikalarından taviz vermeden SQL Server içinde uygulanabilir olarak çıkmasına bağlıyorum. Güvenlik tam anlamıyla sağlanmasının ötesinde
kolay şekilde de yönetilebilir olmalıdır. İlk kuruluşta güvenli olma, Veri kaynakları erişim
kontrolleri, Veri şifreleme, aktiviteleri izleme ve kaydetme özellikleri ve bunların yönetimi SQL Server 2008’i güvenlik konusunda rahatça rakiplerinin üstüne yerleştiriyor.
Yaşar Gözüdeli, SQL 2008 için yazdığı bu kitapta veritabanına girişten başlayarak sorgulamalar, Optimizasyon, T-SQL ve CLR, XML desteği, ortak zamanlı çalışma, Coğrafi
Tipler, harici sunucular ve Service Broker’lar ile çalışmalardan da bahseden, örneklerle
zenginleştirilmiş, takibi kolay bir kaynak hazırlamış. Kitap, profesyonel çalışmalarımızda
SQL Server 2008' den nasıl faydalanabileceğimizi akıcı ve kolay anlaşılabilir bir üslup ile
anlatıyor.
Bir önceki SQL Server 2005 kitabı 3 baskı yapan ve 3000 adet satan, alanında büyük
kabul gören kitabı kadar başarılı olacağına emin olduğumuz SQL Server 2008 kitabını
bize kazandıran Yaşar Gözüdeli'ye, kütüphanemizde en önlerinde yer alacak bu güncel
kaynağı hazırladığı için teşekkürlerimizi sunuyoruz.
Gökşin Bakır
İş Ortakları ve İstemci Grup Yöneticisi, Microsoft MEA
Önsöz
İnsanoğlu var olduğundan bugüne hep veriye gereksinim duydu. Ama belki bu gereksinimi hiç bugünkü kadar şiddetli değildi. Hiç şüphe yok ki bu gereksinim, yarın bugünkünden daha şiddetli olacak. Bu gereksinime paralel, verilerin birinci dereceden muhatabı olan Veritabanı Yönetim Sistemleri de sürekli olarak gelişmekte. SQL'in, standart
olarak ortaya atıldığından bu yana yaklaşık 20 yıldır popülerliğini kaybetmemiş bir dil
olması onun ne denli güçlü ve gereksinim duyulan bir şey olduğunu ortaya koyar. Belki
bunun en büyük sebeplerinden biri, "veri" kaydının ve sorgulamasının hayatın temel bir
parçası olmasındandır.
Veri işleme, her geçen gün yeni gereksinimlerle karşımıza çıkmakta. SQL standardı da
bu gelişmelere paralel olarak 1999, 2003, 2006 yayınlarıyla desteklendi. SQL Server
2008, bir VTYS olarak bu standartlardan payına düşeni fazlasıyla almış bir veri yönetim
aracı. 2000'den 2005'e geçmeye nazaran, 2005- 2008 geçişinin daha kolay bir geçiş olacağından emin olabilirsiniz.
Bu yeni sürümde, SQL Server programlamanın olmazsa olmazı olan Transact SQL ile ilgili birkaç iyileştirme yer almakta. Bir veritabanı programcısı iseniz, bu yenilikleri hızlı bir
şekilde öğrenmeniz sizin açınızdan hiç de zor olmayacaktır. Hatta kullanmaktan keyif
alacağınızı söyleyebilirim. Şayet 2008 sürümüne, SQL Server 2000'den geçiyorsanız, TSQL 'in sizi zorladığı hallerde CLR desteği sizin için bir kurtuluş olacaktır, mutlaka deneyin…
Şayet bir Coğrafi Bilgi Sistemi projesi geliştiriyorsanız, SQL Server 2008 ile birlikte gelen
Uzaysal(Spatial) tipler işlerinizi oldukça kolaylaştıracaktır. Yine Site haritası gibi verilerinizi tutmak için hierarchyid tipini kullanmaktan keyif alabilirsiniz.
SQL Server 2005 XML Web Servis desteğine yatırım yapan yazılımcılar, sizlere üzücü bir
haberim var; 'Bir sonraki SQL Server sürümünde aradığınız bu özelliği bulamayabilirisiniz!' Bu nedenle, ilgili üniteyi kitaptan çıkarttım.
Servis temelli çalışıyorsanız, veya çok fazla veri ile boğuşmanız gerektiğinden yük dağıtma ve ölçekleme yapma ihtiyacınız varsa, Service Brokers teknolojisi servislerinizin mesajlaşmasını veritabanının gücü ile buluşturacaktır. Bu konuda da bilgi edinmek sizin için
elzem olabilir.
Bütün bu yeni özellikleri bünyesinde barındıran bir tek ürün olarak karşımıza çıkan SQL
Server 2008, bütün verilerinizi tek merkezden idare edebileceğiniz gerçek manada bir
'Veri' tabanı Yönetim Sistemi…
Kitap yayına hazırlanırken etrafta halen SQL Server 2000 kullanan yazılımcıların da olduğunu gördük. Bu nedenle her ne kadar SQL Server 2008 sürümü için hazırlanmış bir
kitap olsa da 2000 ve 2005 sürümlerinden geçmek isteyenleri de cesaretlendirmek için
yer yer çapraz sürüm kıyaslamalarına yer verdim.
Veritabanı ile tanışmak için bu kitabı aldı iseniz, ilk aşamada kitap CD'lerinde yer alan
“Veritabanı Programlama 1-2” kitapçıklarını okuyarak başlamanızda yarar var. Çünkü
kitap bir seferde bitiremeyeceğiniz kadar büyük olduğundan büyük resmi kaçırabilirsiniz!.
Önsöz
9
Kitap kapsamı, başlangıçtan orta seviyeye olduğu için bu kitap, "Yazılımcılar için SQL
Server 2005 ve Veritabanı Programlama" adlı bir önceki kitabın SQL Server 2008 yenilikleri çerçevesinde yeniden düzenlenmiş halidir. Kitabı bitirdiğinizde, orta büyüklükte
bir veritabanı yönetim sistemi için yazılım ve yönetim işlemlerinin hemen hepsinin üstesinden gelecek birikime sahip olacağınızı söyleyebilirim. Ancak ekstrem projeler için kitabın kapsamı ölçekleme açısından yetersiz gelebilir.
Son olarak, konulara geçmeden önce, şayet SQL Server 2008'i bu kitapla öğrenmek
amacında iseniz, şunu bir prensip haline getirmiş olmanızda büyük yarar var; Bir dili veya
programlanabilir ortamı tanımak için bir satır kod çalıştırıp sonucunu görmek, bin satır
kodu okuyup geçmekten iyidir. Unutmayın ki bir yazılımcı için tecrübe, kaç saat kod
yazdığından öte, kod yazarken ne kadar problemle karşılaştığı ile ilgilidir. Kod çalıştırmadan, başkalarının yazdığı hazır kodları okuyarak(çalışmayan bir kod bile olabilir, sadece
okuyarak bunu nerden bilebilirsiniz ki!) asla problemlerle karşılaşamazsınız.
Başarı sizinle olsun…
Yaşar Gözüdeli
ygozudeli@verivizyon.com
Mayıs 2009-ANKARA
Genel İçindekiler
1. Bölüm: VERİTABANI KAVRAMINA GİRİŞ ..................................................................... 39 1. ÜNİTE: İlişkisel Veritabanının Temelleri .............................................................................. 39 2. ÜNİTE : SQL Server 2008'in Temelleri ................................................................................ 53 3. ÜNİTE: T-SQL'e Genel Bakış ............................................................................................... 69 2. Bölüm: VERİTABANI TASARIMI ................................................................................... 89 4. ÜNİTE: Veritabanı Tasarımına Genel Bakış ......................................................................... 89 5. ÜNİTE: Veritabanı Nesnesinin Temelleri ........................................................................... 107 6. ÜNİTE: Tabloları Tasarlamak ............................................................................................ 127 7. ÜNİTE: Veri Bütünlüğünü Sağlamak ................................................................................. 153 3. Bölüm: VERİLERİ SORGULAMAK ................................................................................ 175 8. ÜNİTE: Basit Sorgular ...................................................................................................... 175 9. ÜNİTE: Tabloları Birlikte Sorgulamak ve Özetlemek .......................................................... 201 10. ÜNİTE: İleri Veri Yönetim Teknikleri ................................................................................ 225 4. Bölüm: VERİ ERİŞİMİNİ İYİLEŞTİRMEK ...................................................................... 251 11. ÜNİTE: Viewlerle Çalışmak ............................................................................................. 251 12. ÜNİTE: Indeks Teorisi ..................................................................................................... 271 13. ÜNİTE: Indeks Yönetimi .................................................................................................. 289 5. Bölüm: T-SQL İLE PROGRAMATİK ÖĞELER KODLAMAK ............................................ 317 14. ÜNİTE: T-SQL ile Programlar Geliştirmek ........................................................................ 317 15. ÜNİTE: Stored Procedure'ler ........................................................................................... 345 16. ÜNİTE: İleri T-SQL Programlama..................................................................................... 369 17. ÜNİTE: Kullanıcı Tanımlı Fonksiyonlar ............................................................................ 387 6. Bölüm: XML İLE ÇALIŞMAK ........................................................................................ 399 18. ÜNİTE: Tip Olarak XML ................................................................................................... 399 19. ÜNİTE: XML-İlişkisel Dönüşümler ................................................................................... 427 7. Bölüm: ORTAK ZAMANLILIK VE TRANSACTION ........................................................ 441 20. ÜNİTE: Transaction'larla Çalışmak ve Ortak Zamanlılık ................................................... 441 21. ÜNİTE: Kilitlenmeleri Yönetmek ...................................................................................... 461 22. ÜNİTE: Triggerlar ............................................................................................................ 469 8. Bölüm: SQL SERVER İÇİNDE CLR ................................................................................ 493 23. ÜNİTE: CLR Genel........................................................................................................... 493 24. ÜNİTE: Basit Rutinler...................................................................................................... 511 25. ÜNİTE: İleri Rutinler ........................................................................................................ 533 12
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
9. Bölüm: VERİTABANI YETENEKLERİNİ GELİŞTİRMEK ................................................. 547 26. ÜNİTE: Bağlı Sunucularla Çalışmak ................................................................................ 547 27. ÜNİTE: İlişkisel Olmayan SQL Server Yetenekleri ........................................................... 555 28. ÜNİTE: Service Brokers .................................................................................................. 571 10. Bölüm: İSTEMCİ TARAFTA SQL SERVER ERİŞİMİ PROGRAMLAMA ....................... 591 29. ÜNİTE: ADO.NET Temelleri ............................................................................................. 591 30. ÜNİTE: ADO.NET'de Kopuk Veri Yönetimi ....................................................................... 617 31. ÜNİTE: SQL Server Management Objects'i Kullanmak .................................................... 639 EK A: VERİTABANI PROGRAMCILARINA İPUÇLARI....................................................... 649 EK B: C# VE OOP KILAVUZU ........................................................................................... 669 EK C: BÖLÜM SONU SORU CEVAPLARI.......................................................................... 695 EK D: DÜKKAN VERİTABANI ŞEMASI ............................................................................ 705 EK E: CD KULLANIM KILAVUZU ...................................................................................... 707 İçindekiler
Teşekkür .............................................................................................................................. 5
INETA Hakkında .................................................................................................................. 6
INETA'YA Katılmak ................................................................................................................... 6
INETA'nın Önsözü ................................................................................................................ 7
Önsöz ................................................................................................................................... 8
Genel İçindekiler................................................................................................................ 11
Giriş.................................................................................................................................... 33
Veritabanı Programlama Hakkında ......................................................................................... 33
Kitabın İçerdiği Örnekleri Test Edebilmek İçin ......................................................................... 33
Birikim Gereksinimleri ............................................................................................................ 34
Kimlere Hitabediyor ................................................................................................................ 34
Farklı Başlangıç Önerileri ........................................................................................................ 34
Kitap Neler İçeriyor ................................................................................................................ 36
Veritabanı Kavramına Giriş ...................................................................................................... 36
Veritabanı Tasarımı.................................................................................................................. 36
Veri Sorgulama ........................................................................................................................ 36
Veri Erişimini İyileştirmek ........................................................................................................ 36
T-SQL ile Programatik Öğeler Kodlamak .................................................................................. 36
XML ile Çalışmak ..................................................................................................................... 36
Ortak Zamanlılık ve Transaction............................................................................................... 37
SQL Server 2008 içinde CLR .................................................................................................... 37
Veritabanı Yeteneklerini Geliştirmek ........................................................................................ 37
İstemci Taraftan Veritabanı...................................................................................................... 37
EK A - Veritabanı Programcılarına İpuçları ............................................................................... 37
EK B - C# ve OOP Kılavuzu ...................................................................................................... 37
EK C - Dükkan Veritabanı Şeması ............................................................................................ 37
EK D - Bölüm Sonu Soru Cevapları........................................................................................... 38
EK E - CD Kullanım Kılavuzu ..................................................................................................... 38
Gösterimler ve İçerik Düzeni Hakkında ................................................................................... 38
Kaynak Dosyaları Destek ve Geri Bildirim ............................................................................... 38
1. Bölüm
VERİTABANI KAVRAMINA GİRİŞ
1. ÜNİTE: İlişkisel Veritabanının Temelleri ...........................................................39
TEMEL VERİTABANI KAVRAMLARI .................................................................................. 39
İlişkisel Veritabanı Kavramı .................................................................................................... 40
İlişkisel Veritabanı Yaklaşımına Basit Bir Örnek ....................................................................... 41
14
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
İlişkisel Cebirin Temel Operatörleri ......................................................................................... 43
Veritabanı Programlama Nerelerde Kullanılır? .......................................................................... 45
Temel Veritabanı Nesneleri ...................................................................................................... 45
Veritabanı Uygulamaları .......................................................................................................... 50
Üç N Katman Mimarisi...............................................................................................................50
Veritabanı Atelyesi 1.1 ............................................................................................................ 51
2. ÜNİTE: SQL Server 2008'in Temelleri ...............................................................53
SQL SERVER BİLEŞEN MİMARİSİ .......................................................................................... 53
Başlıca SQL Server 2008 Araçları .......................................................................................... 54
SQL Server Configuration Manager ......................................................................................... 54
Management Studio ................................................................................................................ 55
SqlCmd .................................................................................................................................... 56
SQL Server Surface Area Configuration ................................................................................... 58
SQL Profiler ............................................................................................................................. 59
Books Online ........................................................................................................................... 60
SQL Server Veritabanı Mimarisi ............................................................................................. 60
Standart Veritabanları .............................................................................................................. 60
Disk Yönetim Mimarisi ........................................................................................................... 62
SQL Server'de Disk Ölçümleri .................................................................................................. 62
SQL Server'de Tablo ve Indeks'lerin Yönetimi .......................................................................... 64
Heap ..........................................................................................................................................65
Clustered Indeks ........................................................................................................................65
Nonclustered Indeks ..................................................................................................................65
SQL Server Kullanıcı Yönetim Mimarisi .................................................................................. 65
Roller ....................................................................................................................................... 65
Kullanıcılar ............................................................................................................................... 66
İzinler ....................................................................................................................................... 67
Şemalar ................................................................................................................................... 67
SQL Server Properties\Security Sekmesi ...................................................................................67
Veritabanı Atölyesi 1.2 ........................................................................................................... 68
3. ÜNİTE: T-SQL'e Genel Bakış .............................................................................69
Veri Tanımlama Dili ................................................................................................................ 70
Nesne Oluşturmak: CREATE .................................................................................................... 70
Nesne ve Değişken (Tanımlayıcı) İsimlendirme Kuralları ............................................................71
Tanımlayıcı İsimlendirme Notasyonları ......................................................................................71
Tanımlayıcı İsimlendirmenin Töresi ............................................................................................71
Null Kavramı ..............................................................................................................................72
Nesnelerde Değişiklik Yapmak: ALTER .................................................................................... 72
Nesne Silmek: DROP ............................................................................................................... 73
Veri İşleme Dili ....................................................................................................................... 73
Veri Eklemek: INSERT .............................................................................................................. 73
İçindekiler
15
Veri Seçmek ve Filitrelemek: SELECT ..................................................................................... 74
Ulama ........................................................................................................................................74
Seçilen Kayıtları Sıralamak .........................................................................................................75
WHERE Cümleciği ile Kayıtları Filitrelemek .............................................................................. 75
Verilerde Değişiklik Yapmak: UPDATE ..................................................................................... 76
Veri Silmek: DELETE ................................................................................................................ 77
Fonksiyonlar ........................................................................................................................... 77
Aggregate (Grupsal) Fonksiyonlar ........................................................................................... 77
Rowset Fonksiyonlar ............................................................................................................... 79
Skaler Fonksiyonlar ................................................................................................................. 79
Deterministik Kavramı ................................................................................................................81
Veri Kontrol Dili ...................................................................................................................... 82
Yetki vermek: GRANT .............................................................................................................. 83
WITH GRANT OPTION Seçeneği ile Basamaklı Yetkilendirmek ..................................................84
Erişimi Engellemek: DENY ....................................................................................................... 84
Erişim Tanımını Kaldırmak: REVOKE ......................................................................................... 85
Veritabanı Atölyesi 1.3 ........................................................................................................... 86
Bölüm Sonu Özeti .............................................................................................................. 87
Bölüm Sonu Tekrar Soruları .............................................................................................. 87
2. Bölüm
VERİTABANI TASARIMI
4. ÜNİTE: Veritabanı Tasarımına Genel Bakış ......................................................89
Kavram Model ........................................................................................................................ 90
ORM ile Veritabanı Modelleme ................................................................................................ 91
ER ile Modelleme..................................................................................................................... 92
ER ile Modelleme Aşamaları ......................................................................................................93
UML ile Modelleme: ................................................................................................................ 94
Mantıksal Model .................................................................................................................... 95
Veri Normalizasyonu .............................................................................................................. 96
Normalizasyon Kuralları ........................................................................................................... 96
Kayıtların İlişkilendirilmesi ...................................................................................................... 99
Bire Bir İlişki (1-1).................................................................................................................... 99
Bire Çok İlişki (1-N) ............................................................................................................... 100
İlişkisel Ortamda Hiyerarşik Veriyi Modellemek .......................................................................100
Çoka Çok İlişki (N-N) ............................................................................................................. 101
ER Diyagram ile Mantıksal Model Oluşturmak ..................................................................... 102
Fiziksel Model ...................................................................................................................... 105
Veritabanı Atölyesi ............................................................................................................... 105
16
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
5. ÜNİTE: Veritabanı Nesnesinin Temelleri ........................................................107
Dosya ve Dosya Gruplarını Anlamak .................................................................................... 107
Veritabanı Oluşturmak .......................................................................................................... 108
Management Studio ile Yeni bir Veritabanı Oluşturmak ......................................................... 108
Transact SQL ile Veritabanı Oluşturmak................................................................................. 109
Çoklu Dosya ve Dosya Gruplarını Kullanmak ........................................................................ 111
Dosya Grubu (File Group) Kavramı ....................................................................................... 112
Default Dosya Grubu (Default File Group) .............................................................................. 113
Var Olan Bir Veritabanında Dosya ve Dosya Grubu Eklemek .................................................. 113
Veritabanına Erişecek Uygulama Kullanıcısını Ayarlamak..................................................... 115
Veritabanı İçerisinde Şema Kavramı ..................................................................................... 115
Şemaları Yönetmek................................................................................................................ 116
Veritabanını Yönetmek ......................................................................................................... 117
Veritabanı Seçeneklerini Ayarlamak ...................................................................................... 117
Veritabanı Seviyeli Collation Ayarı Yapmak ..............................................................................120
Veritabanı Dosyalarının Boyutunu Değiştirmek ...................................................................... 121
Veritabanı Dosyalarının Boyut Artımını Ayarlamak...................................................................121
Otomatik Artırmaya Ayarlama .................................................................................................. 121
Müdahale Ederek Artırmak ....................................................................................................... 121
Transaction Log Dosyasını Gözlemlemek ............................................................................... 122
Veritabanlarını Küçültmek (Shrinking) .................................................................................... 122
Veritabanlarını Silmek ............................................................................................................ 124
Veritabanı Atölyesi 2.2 ......................................................................................................... 125
6. ÜNİTE: Tabloları Tasarlamak ..........................................................................127
Nesne İsimlendirirken........................................................................................................... 127
Sütunları Tasarlamak ve Veri Türleri ..................................................................................... 128
Metin Veri Tipleri ................................................................................................................... 129
ASCII Veri Tipleri ......................................................................................................................129
Unicode ...................................................................................................................................130
Metinsel Veri Tiplerinden Seçim Yapmak .............................................................................. 130
Collation Ayarları ................................................................................................................... 131
Tarih-Zaman Veri Tipleri ......................................................................................................... 132
Numerik Sayılar ..................................................................................................................... 133
Yaklaşık Sayı Veri Tipleri ........................................................................................................ 133
Tamsayı Veri Tipleri ............................................................................................................... 134
IDENTITY() Fonksiyonu ile Otomatik Artan Sütunlar Tanımlamak .......................................... 134
Parasal Veri Tipleri ................................................................................................................. 136
Binary Veri Tipleri .................................................................................................................. 136
MAX İfadesi .......................................................................................................................... 136
Eski LOB Veri Tiplerini Dönüştürmek ........................................................................................137
XML Veri Tipi ve XML Verilerin Tasarlanması ........................................................................ 138
Özel Veri Tipleri ...................................................................................................................... 139
İçindekiler
17
Hesaplanmış Sütun................................................................................................................ 141
Hesaplanmış Sütunu Sabitlemek (Persist Etmek) ....................................................................141
Seyrek Sütun ve Seyrek Tablo Kavramı ................................................................................. 142
Kullanıcı Tanımlı Veri Tipleri ................................................................................................... 142
Kullanıcı Tanımlı Veri Tipleri (UDDT) ile Çalışmak................................................................... 143
CLR Kullanıcı Tanımlı Tipler .................................................................................................. 144
Tabloları Oluşturmak ............................................................................................................ 144
Tablo Tasarımında Satır Boyutuna Karar Vermek .....................................................................145
Tablolar Üstünde Değişiklik Yapmak..................................................................................... 147
Sütun Eklemek....................................................................................................................... 147
Sütun Değiştirmek ................................................................................................................. 147
Sütun Silmek ......................................................................................................................... 147
Tabloların veya Sütunların Adını Değiştirmek ........................................................................ 148
Tablo Silmek .......................................................................................................................... 148
Geçici Tablolarla Çalışmak ................................................................................................... 148
Nesnelerin T-SQL İfadelerini Almak ...................................................................................... 150
Veritabanı Atölyesi 2.3 .................................................................................................... 151
7. ÜNİTE: Veri Bütünlüğünü Sağlamak ...............................................................153
Veri Bütünlüğünü Kavramları ................................................................................................ 153
Tanımlamalı Veri Bütünlüğü ................................................................................................... 154
Prosedürel Veri Bütünlüğü ..................................................................................................... 157
Veri Bütünlüğü Tekniği Seçmek ............................................................................................. 157
Veritabanı Atölyesi ............................................................................................................... 158
Veri Bütünlüğünü Gerçeklemek ............................................................................................ 159
Sütun Seviyeli Veri Bütünlüğünü Sağlamak ........................................................................... 159
Primary Key Constraint Oluşturmak .........................................................................................159
Unique Key Constraint Oluşturmak ..........................................................................................161
Default Constraint Oluşturmak .................................................................................................162
Default Nesnesi Oluşturmak ....................................................................................................163
Check Constraint Oluşturmak ..................................................................................................163
Rule Oluşturmak ......................................................................................................................165
Tablo Seviyeli Veri Bütünlüğünü Sağlamak ............................................................................ 166
Sütunlar Arası Check Constraint Oluşturmak ...........................................................................166
Foreign Key Constraint Oluşturmak ..........................................................................................167
Ardışık Bütünlük (Cascading Integrity) ...................................................................................... 169
Constraint'leri Yönetmek ...................................................................................................... 171
Constraint'lere Göz Atmak ..................................................................................................... 171
Constraint'leri Silmek ............................................................................................................. 172
Constraint'leri Denetime Kapamak ve Açmak ........................................................................ 172
Veritabanı Atölyesi .......................................................................................................... 172
Bölüm Sonu Özeti ............................................................................................................ 173
Bölüm Sonu Tekrarı ......................................................................................................... 173
18
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
3. Bölüm
VERİLERİ SORGULAMAK
8. ÜNİTE: Basit Sorgular .....................................................................................175
Kayıtları Seçmek: SELECT .................................................................................................... 175
En Basit SELECT .................................................................................................................... 176
Sadece Belli Sütunları Seçmek .............................................................................................. 177
Tekrarlamaları Tekile İndirgemek: DISTINCT .......................................................................... 177
Türetilmiş (Calculated) Sütunlar ........................................................................................... 177
Aritmetik İşaretler .................................................................................................................. 177
Sütuna Takma Ad (Alias) ....................................................................................................... 178
Matematiksel Fonksiyonlar .................................................................................................. 179
WHERE ile Satırları Filitrelemek............................................................................................ 180
Karşılaştırma İşaretleri ........................................................................................................... 180
Mantıksal Operatörler ..............................................................................................................181
NULL Karşılaştırma............................................................................................................... 183
Aralık Sorgulama: BETWEN.... AND.... ................................................................................. 184
Kayıtları Sıralamak: ORDER BY ............................................................................................. 184
Dönen Kayıt Sayısını Kısıtlamak: TOP .................................................................................... 186
SQL'DE Karakter ve Tarih İşlemleri ......................................................................................... 187
Karakter Karşılaştırmaları: LIKE Deyimi ................................................................................. 187
Joker Karakterler ................................................................................................................... 188
Metinleri Ulamak (Concatenation) ......................................................................................... 190
Başlıca Karakter Fonksiyonları ............................................................................................. 191
Tarihleri Sorgulamak ............................................................................................................ 192
Tarih Fonksiyonları ................................................................................................................ 192
Alt Sorgularla Çalışmak................................................................................................... 194
IN ve NOT IN ........................................................................................................................ 195
Tekil Sonuçlar Döndüren Alt Sorgular ................................................................................... 195
Çoklu Sonuç Döndüren Altsorgular ........................................................................................ 196
Türetilmiş Tablolar ................................................................................................................. 197
İlintili (Corelated) Altsorgular ................................................................................................. 198
EXISTS, NOT EXISTS ............................................................................................................. 199
Veritabanı Atölyesi ............................................................................................................... 200
9. ÜNİTE: Tabloları Birlikte Sorgulamak ve Özetlemek ......................................201
Tabloları Birleştirerek Sorgulamak ................................................................................. 201
Tabloya Takma Ad (Alias) .................................................................................................... 203
Bir Tabloyu Kendisiyle Birlikte Sorgulamak .......................................................................... 203
INNER JOIN ......................................................................................................................... 204
İçindekiler
19
OUTER JOIN İfadeleri ........................................................................................................... 206
LEFT OUTER JOIN.................................................................................................................. 206
RIGHT OUTER JOIN ............................................................................................................... 207
FULL OUTER JOIN ................................................................................................................. 208
CROSS JOIN ........................................................................................................................ 208
SQL Server Açısından JOIN İşlemleri ................................................................................... 209
JOIN İçin İpucu Kullanmak ..................................................................................................... 210
Fark, Kesişim ve Birleşim Bulmak ........................................................................................ 210
Veritabanı Atölyesi .......................................................................................................... 212
Verileri Gruplamak ve Özetlemek .................................................................................... 214
Gruplamalı Fonksiyonlar (Aggregate Functions) ................................................................... 214
GROUP BY Deyimi ................................................................................................................ 216
Gruplamalar Üstünde Şart Koşmak: HAVING ........................................................................ 218
Gruplanmış Verileri Özetlemek.............................................................................................. 220
CUBE Deyimi ......................................................................................................................... 220
ROLLUP Deyimi ..................................................................................................................... 221
GROUPING ile Özetleri Düzenlemek ....................................................................................... 222
COMPUTE BY ve COMPUTE deyimi ....................................................................................... 222
Veritabanı Atölyesi 3.2 ......................................................................................................... 223
10. ÜNİTE: İleri Veri Yönetim Teknikleri .............................................................225
CTE ve Rekürsif Sorgular ...................................................................................................... 225
CTE ........................................................................................................................................ 226
Hiyerarşik Sorgu için CTE'nin Rekürsif Kullanımı .................................................................... 228
PIVOT ve UNPIVOT Operatörleri ile Veri Analizi .................................................................... 231
PIVOT .................................................................................................................................... 231
UNPIVOT ............................................................................................................................... 235
Rütbeleme Fonksiyonları ile Kayıtları Sıralamak ................................................................... 236
ROW_NUMBER() .................................................................................................................. 237
Parçalı Satır Numaraları Vermek ..............................................................................................238
RANK() ve DENSE_RANK() Fonksiyonları .............................................................................. 239
Sonuçları n Gruba Ayırmak: NTILE (ifade) .............................................................................. 240
Veri Değişimi Yönetimi ......................................................................................................... 241
Yeni Veri Eklemek Hakkında Püf Noktaları ............................................................................. 241
Sorgu Sonucunu Yeni Tabloda Saklamak .................................................................................242
Bir Sorgunun Sonucunu Varolan Tabloya Eklemek ...................................................................242
Verileri Güncellemek .............................................................................................................. 243
Tabloları Birleştirerek Veri Güncellemek ...................................................................................243
Alt Sorgular Kullanarak Veri Güncellemek ................................................................................244
Verileri Silmek ....................................................................................................................... 244
Tabloları Birleştirerek Veri Silmek ............................................................................................244
Alt Sorgular Kullanarak Veri Silmek ..........................................................................................245
20
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
TOP İfadesi ........................................................................................................................... 246
Etkin Olarak Veri Silmek: TRUNCATE TABLE ............................................................................246
Veritabanı Atölyesi 3.3 .................................................................................................... 247
Bölüm Sonu Özeti ............................................................................................................ 249
Bölüm Sonu Tekrarı-6 ...................................................................................................... 249
4. Bölüm
VERİ ERİŞİMİNİ İYİLEŞTİRMEK
11. ÜNİTE: Viewlerle Çalışmak...........................................................................251
VIEW'LERLE ÇALIŞMAK .................................................................................................. 251
View'lere Neden İhtiyaç Duyarız ..................................................................................... 252
View İçin Alternatifler ............................................................................................................ 252
View Oluşturmak .................................................................................................................. 253
Kısıtlamalar .......................................................................................................................... 254
İzinler ve Sahiplik Zinciri ....................................................................................................... 254
Birden Fazla Tablodan Veri Çeken View'ler ........................................................................... 255
View'leri Yönetmek ......................................................................................................... 256
View Üstünde Değişiklik Yapmak ......................................................................................... 256
Tanımlanan View'leri Görmek ve Sistem View'leri ................................................................ 257
View Tanımlarını Gizlemek ................................................................................................... 257
View Temel Tablolarının Şemasını Kilitlemek: SCHEMABINDING ......................................... 258
View'leri Silmek.................................................................................................................... 259
View'ler ve INSERT, UPDATE, DELETE İfadeleri .................................................................... 259
Parçalı View Yapıları............................................................................................................. 262
Parçalı Tablolar Oluşturmak.................................................................................................. 265
Nesnelere Takma Ad: Synonymuslarla Çalışmak ................................................................. 269
Veritabanı Atölyesi .......................................................................................................... 270
12. ÜNİTE: Indeks Teorisi ...................................................................................271
INDEKSLERLE ÇALIŞMAK ............................................................................................... 271
VTYS'ler Indeks'leri Nerelerde Kullanır? ......................................................................... 273
INDEKS MİMARİSİ .......................................................................................................... 275
Dengeli Ağaç (β-tree) Yapısı ........................................................................................... 276
Heap Yapı ......................................................................................................................... 278
Clustered Indeks.............................................................................................................. 278
Nonclustered Indeks ....................................................................................................... 279
İçindekiler
21
SQL Server Indeks Türleri ............................................................................................... 281
Unique Index ........................................................................................................................ 281
Karma (Composite) Indeks ................................................................................................... 281
Kapsam (Covering) Indeks ................................................................................................... 281
Parçalı Indeksler ................................................................................................................... 282
Eklenti Sütunlu İndeksler ...................................................................................................... 282
Filtreli İndeksler .................................................................................................................... 282
XML Indeksler ...................................................................................................................... 282
Full-Text Indeksler ................................................................................................................ 282
Veri Değişim İşlemlerinin Indekslere Etkisi .................................................................... 283
FILLFACTOR ve PAD_INDEX Parametrelerine Karar Vermek ................................................ 284
Indeks Tanımlama Yaklaşımları ...................................................................................... 284
Clustred Tanımlarken ........................................................................................................... 284
Non-Clustred Indeks Tanımlarken......................................................................................... 285
Veritabanı Atölyesi 8.1 .................................................................................................... 286
13. ÜNİTE: Indeks Yönetimi ................................................................................289
INDEKS OLUŞTURMAK ................................................................................................... 289
Unique Index ........................................................................................................................ 291
Kapsam (Covering) Indeks Oluşturmak................................................................................. 292
INCLUDE Deyimi ile Eklenti Sütunlu Indeks Tanımlamak ...................................................... 293
WHERE Deyimi ile Filtreli İndeks Tanımalak ......................................................................... 293
Indeks Seçeneklerini Ayarlamak .......................................................................................... 294
Parçalı Indeksler Oluşturmak ................................................................................................ 296
FILLFACTOR ve PAD_INDEX Parametrelerini Ayarlamak...................................................... 296
View Üstünde Clustered Indeks Tanımlamak ....................................................................... 297
Indeksler Hakkında Bilgi Almak ...................................................................................... 298
Indeksler Üstünde Değişiklik Yapmak ............................................................................ 299
Indeksleri Yeniden Derlemek: REBUILD ................................................................................ 300
Indeksleri Yeniden Düzenlemek: REORGANIZE ..................................................................... 300
Indeksleri Kapatmak ............................................................................................................. 301
Indeks Seçeneklerini Değiştirmek ........................................................................................ 301
Indeksleri Silmek ............................................................................................................. 302
Indekslere Bakım Yapmak............................................................................................... 303
Indekslerin Dağınıklıklarını Gözlemlemek .............................................................................. 304
Indeksleri Düzenlemek .................................................................................................... 305
İstatistiklerin Veri Erişimine Etkisi .................................................................................. 306
İstatistik Oluşturmak ............................................................................................................ 307
22
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
İstatistikleri Güncellemek ..................................................................................................... 308
Veritabanı Performans Araçlarını Kullanmak ................................................................. 308
SQL Profiler ile Veritabanını Takip Etmek .............................................................................. 308
Database Tuning Advisor ile Veritabanı İyileştirmesi ............................................................ 310
Veritabanı Atölyesi 8.3 .................................................................................................... 314
Bölüm Sonu Özeti ............................................................................................................ 315
Bölüm Sonu Tekrarı-8 ...................................................................................................... 315
5. Bölüm
T-SQL İLE PROGRAMATİK ÖĞELER KODLAMAK
14. ÜNİTE: T-SQL ile Programlar Geliştirmek .....................................................317
Programlama Dili Olarak T-SQL ............................................................................................ 317
Değişken Tanımlama ve Kullanma ......................................................................................... 318
Birleşik Operatörler ..................................................................................................................320
Bit Seviye Operatörler ..............................................................................................................321
Kod İçerisine Açıklamalar Eklemek ..........................................................................................322
Global Değişkenler ve Sistem Fonksiyonları .............................................................................. 322
Yığın Kavramı ve GO bölümleyicisi......................................................................................... 323
Print Komutu ............................................................................................................................. 324
Tablo Tipi Değişkenler Kullanmak.............................................................................................325
DML ifadeden Çıktı Veri Almak ................................................................................................325
Akış Kontrolleri ...................................................................................................................... 327
IF ... ELSE Karar Yapısı .............................................................................................................. 328
CASE Deyimi ...........................................................................................................................330
CASE ile PIVOT Gerçeklemek .................................................................................................... 331
While Döngüsü ........................................................................................................................332
BREAK Komutu ......................................................................................................................... 332
CONTINUE Komutu ................................................................................................................... 333
Cursorlerle Veri Yönetimi ...................................................................................................... 333
Transact-SQL Sunucu Cursor'ler ............................................................................................ 334
Cursor'lerin Seçeneklerini Ayarlamak ........................................................................................ 340
Cursor'lerle Satırları Dolaşmak ............................................................................................... 340
Cursor Üstünden Kayıtları Düzenlemek ....................................................................................341
Ortak Zamanlı (Concurrent) çalışma ve Cursor'ler .................................................................. 342
Veritabanı Atölyesi 5.1 .................................................................................................... 342
15. ÜNİTE: Stored Procedure'ler ........................................................................345
Stored Procedure'lerle Çalışmak..................................................................................... 345
Stored Procedure'ler Oluşturmak .......................................................................................... 349
Stored Procedure'ü Çalıştırmak.............................................................................................. 350
NOCOUNT Oturum Parametresi'nin Kullanımı ........................................................................ 352
İçindekiler
23
Stored Procedure'leri Yönetmek ........................................................................................... 353
Stored Procedure'lerde Değişiklik Yapmak ............................................................................. 353
Stored Procedurelerde Parametrelerle Çalışmak ........................................................... 356
Girdi Parametreler (Input Parameter).................................................................................... 356
Girdi Parametre ile Stored Procedure Çağırmak ..................................................................... 356
Tablo Tipi Parametre Alan Stored Procedure'ler Kodlamak .................................................... 358
Parametre Geçerliliğini Denetlemek ....................................................................................... 359
Çıktı Parametrelerle Çalışmak .............................................................................................. 361
Çıkış Parametrelerini Almak ................................................................................................. 361
RETURN deyimi.................................................................................................................... 362
Modül Çalıştırma Bağlamları: EXECUTE AS .......................................................................... 364
EXECUTE AS CALLER ............................................................................................................ 365
EXECUTE AS 'kullanici'........................................................................................................... 365
EXECUTE AS SELF ................................................................................................................. 366
EXECUTE AS OWNER ............................................................................................................ 366
Veritabanı Atölyesi .......................................................................................................... 367
16. ÜNİTE: İleri T-SQL Programlama ..................................................................369
SQL Server 2008 T-SQL Ortamını Etkin Kullanmak ......................................................... 369
Dinamik SQL Çalıştırmak ...................................................................................................... 369
EXEC Fonksiyonu ile Dinamik SQL Çalıştırmak....................................................................... 370
sp_executesql ile Dinamik Sorgu Çalıştırmak ........................................................................ 372
T-SQL'de Hata Yakalama Mimarisi ....................................................................................... 373
Sistem Mesajları: sys.messages ........................................................................................... 373
Sisteme Yeni Mesaj Eklemek ............................................................................................... 374
Sistemden Kullanıcı Tanımlı Mesaj Silmek ........................................................................... 376
Hata Mesajlarını Kullanmak: RAISERROR .............................................................................. 376
Parametreli Hata Mesajları Tanımlamak ................................................................................ 378
Oluşan Son Hatanın Kodunu Yakalamak: @@ERROR ........................................................... 379
Hata Kontrolü ve TRY-CATCH Yapısı..................................................................................... 381
Uygulama için Veritabanı Hata Yakalama Mimari Tasarımı .................................................. 382
dbo.tbHataGecmis Tablosu ......................................................................................................383
sp$HataYakala Stored Procedure'ü ..........................................................................................383
sp$HataYazdir Stored Prosedürü..............................................................................................384
Hata Yakalama Mimarisi Kullanım Örneği ................................................................................385
Veritabanı Atölyesi ............................................................................................................... 386
17. ÜNİTE: Kullanıcı Tanımlı Fonksiyonlar .........................................................387
Kullanıcı Tanımlı Fonksiyonlarla Çalışmak ..................................................................... 387
Kullanıcı Tanımlı Fonksiyonlarla Neler Yapabiliriz.................................................................. 388
Skaler Kullanıcı Tanımlı Fonksiyonlar.................................................................................... 388
Türetilmiş Sütun Olarak Skaler Fonksiyon.............................................................................. 390
24
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Satırdan Tablo Döndüren Fonksiyonlar ................................................................................. 391
Çoklu İfade ile Tablo Döndüren Fonksiyonlar ........................................................................ 392
Rekürsif Sorgu için Örnek Fonksiyon ..................................................................................... 393
Tablolarla Tablo Tipi Fonksiyonları Bileştirmek: APPLY ........................................................ 395
CROSS APPLY ....................................................................................................................... 396
OUTER APPLY........................................................................................................................ 397
Veritabanı Atölyesi ............................................................................................................... 397
Bölüm Sonu Özeti ............................................................................................................ 398
Bölüm Sonu Tekrar Soruları ............................................................................................ 398
6. Bölüm
XML İLE ÇALIŞMAK
18. ÜNİTE: Tip Olarak XML .................................................................................399
XML Desteği .................................................................................................................... 399
Hibrit Veritabanı Gereksinimi ...................................................................................................400
XML Veri Tipini Kullanmak .............................................................................................. 401
Değişken ve Parametre Olarak XML Tipi .............................................................................. 402
Tablolarda XML Veri Tipi ...................................................................................................... 402
Tip Tanımsız XML Veri İle Çalışmak...................................................................................... 403
Tip Tanımlı XML Veri İle Çalışmak ........................................................................................ 403
XSD ve Schema Collections Nesneleri................................................................................... 403
Şemalar Hakkında Bilgi Almak .................................................................................................405
Tip Tanımlı XML Sütunlar Oluşturmak ......................................................................................406
İlişkisel Seviye XML Tanımlamaları Kullanmak ..................................................................... 408
Kısıtlanmış (Constrainted) XML Veri Kullanmak ..................................................................... 408
XML Veri Üstünde Hesaplanmış Sütun Tanımlamak ................................................................408
XML Veriyi Yönetmek ve Sorgulamak ............................................................................. 408
Bir Bakışta XML Sorgu Dili: XQuery ..................................................................................... 409
XML Veri Tipi Metodları ....................................................................................................... 413
xml.query (string XQuery) ..................................................................................................... 413
xml.exist (string XQuery) ..................................................................................................... 415
xml.value (string XQuery, string SQLVeriTipi)....................................................................... 415
xml.nodes (string XQuery) ................................................................................................... 416
XML Veriyi Düzenlemek: xml.modify() ................................................................................. 418
insert İfadesi ile Yeni Bilgi Eklemek ....................................................................................... 419
delete İfadesi ile Bir Bilgi Silmek............................................................................................ 420
replace value of İfadesi ile Düğüm Üstünde Düzenlemeler Yapmak ....................................... 420
Veritabanı Atölyesi ............................................................................................................... 421
İçindekiler
25
XML Sütunlarda Indeks Tanımlamak .............................................................................. 422
Birincil XML Indeks Oluşturmak ........................................................................................... 422
İkincil XML Indeks Oluşturmak ............................................................................................. 423
Değer Temelli XML Indeksler ................................................................................................. 423
Yol Temelli XML Indeksler ..................................................................................................... 423
XML Sütunlar Üstünde Hesaplanmış Alan ve İlişkisel Indeksler Tanımlamak ......................... 424
Veritabanı Atölyesi ............................................................................................................... 425
19. ÜNİTE: XML-İlişkisel Dönüşümler ................................................................427
İlişkisel-XML Veri Dönüşümleri ....................................................................................... 427
OPEN XML ........................................................................................................................... 427
FOR XML .............................................................................................................................. 430
RAW Mod ile XML Veri Çekmek ............................................................................................ 431
AUTO Modda XML Veri Çekmek............................................................................................ 432
EXPLICIT (Bilinçli) Modda XML Veri Çekmek ......................................................................... 434
PATH Modda XML Veri Çekmek ............................................................................................ 436
Veritabanı Atölyesi ............................................................................................................... 438
Bölüm Sonu Özeti ............................................................................................................ 439
Bölüm Sonu Tekrar Soruları ............................................................................................ 439
7. Bölüm
ORTAK ZAMANLILIK VE TRANSACTION
20. ÜNİTE: Transaction'larla Çalışmak ve Ortak Zamanlılık ..............................441
Transaction ve Ortak Zamanlılık ..................................................................................... 441
Transaction Bloğu Nasıl Ele Alınır? ....................................................................................... 443
Transaction Kavramı ve Transaction Modlarını Anlamak ...................................................... 443
Harici (Explict) Transaction Modunda Çalışmak ................................................................... 444
Harici Transaction Yönetimi ................................................................................................... 444
TRY-CATCH Yapısı ile Transaction Hatası Yakalamak ............................................................ 445
Sabitleme Noktaları (Save Points) ......................................................................................... 447
Dahili (Implicit) Transaction Modu ve Yönetimi .................................................................... 448
Ortak Zamanlılığı ve İzolasyon Seviyelerini Anlamak ............................................................ 448
İzolasyon Sağlamak ............................................................................................................... 448
Ortak Zamanlı (Concurrent) Erişim Anomalileri ...................................................................... 449
İzolasyon Seviyeleri .............................................................................................................. 450
Snapshot izolasyon Seviyesi ve Satır Versiyonlama ............................................................. 455
Transaction Bazlı Snapshot İzolasyon .................................................................................... 456
İfade Bazlı Snapshot İzolasyon............................................................................................... 458
Snapshot İzolasyonun Kazanım ve Maliyetleri ....................................................................... 459
Veritabanı Atölyesi ............................................................................................................... 459
26
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
21. ÜNİTE: Kilitlenmeleri Yönetmek ...................................................................461
Kilitlemeleri Yönetmek .................................................................................................... 461
Kilitlemeleri Gözlemlemek ............................................................................................... 461
Management Studio ile Kilitlenmeleri Takip Etmek ve Process Öldürmek .............................. 464
Zaman Aşımı Ayarlamak ................................................................................................. 465
Tablo Seviyeli Kilitlemeler ............................................................................................... 466
Kilitleme İpucu Vermek .......................................................................................................... 466
Kilitleme Çıkmazı: Deadlock ............................................................................................ 467
Veritabanı Atölyesi ............................................................................................................... 468
22. ÜNİTE: Triggerlar ..........................................................................................469
TRIGGER'LARI KAVRAMAK ............................................................................................. 469
Trigger Ne Zaman Kullanılmalıdır .................................................................................... 470
Trigger Ne Zaman Kullanılmamalıdır ............................................................................... 471
Klasik Trigger'ın Özellikleri ve Kısıtlamaları ........................................................................... 471
Trigger'lar Nasıl Çalışır? ........................................................................................................ 472
TRIGGER OLUŞTURMAK.................................................................................................. 472
INSERT Trigger'i .............................................................................................................. 475
DELETE Trigger'i .............................................................................................................. 477
UPDATE Trigger'i ............................................................................................................. 478
INSTEAD OF Trigger'ı ...................................................................................................... 480
KOMPLEKS TRIGGER'LAR................................................................................................ 482
Nested Trigger'lar Tanımlamak ....................................................................................... 482
Recursive Trigger Tanımlamak ....................................................................................... 483
DDL Trigger'lar................................................................................................................. 483
Veritabanı Seviye DDL Trigger'larla Çalışmak ....................................................................... 484
Sunucu Seviyeli DDL Trigger'lar ........................................................................................... 487
TRIGGER YÖNETİMİ......................................................................................................... 488
Trigger'ları Silmek ........................................................................................................... 488
Veritabanı Seviyeli DDL Trigger'ları Silmek ............................................................................ 489
Sunucu Seviyeli DDL Trigger'ları Silmek ................................................................................ 489
Trigger'ları Tepkimeye Kapatmak ................................................................................... 489
Veritabanı Atölyesi ............................................................................................................... 490
Bölüm Sonu Özeti ............................................................................................................ 491
Bölüm Sonu Tekrarı ......................................................................................................... 491
İçindekiler
8. Bölüm
27
SQL SERVER İÇİNDE CLR
23. ÜNİTE: CLR Genel .........................................................................................493
CLR ile Çalışmak .............................................................................................................. 493
SQL Server İçerisinde CLR .............................................................................................. 495
Assembly Kavramı ............................................................................................................... 496
Kodların Kaynak Erişim Hakları ............................................................................................. 496
.NET Assembly'leri SQL Server'a Yüklemek .......................................................................... 497
T-SQL ile CLR Arasında Seçim Yapmak ................................................................................ 501
Veritabanında Assembly Yönetimi........................................................................................ 502
Assembly'ler Hakkında Bilgi Almak........................................................................................ 502
Assembly'leri Değiştirmek ve Silmek ..................................................................................... 503
Assembly'ler Üstünde Değişiklik Yapmak.................................................................................503
Assembly'nin İçeriğini Değiştirmek ..........................................................................................503
Assembly'nin Seçeneklerini Değiştirmek .................................................................................504
Assembly Değişikliğinin Verilere Etkisi...................................................................................... 505
Assemblylere Ek Kaynaklar Eklemek ve Çıkartmak ..................................................................505
Assembly'leri Silmek................................................................................................................506
SQL Server için CLR Bileşenler Programlamak ..................................................................... 507
Visual Studio'da SQL Server Projesi Oluşturmak .................................................................... 507
Veritabanı Atölyesi-8.1 ......................................................................................................... 510
24. ÜNİTE: Basit Rutinler ....................................................................................511
SQL Server içerisinde Basit CLR Rutinleri Kodlamak ..................................................... 511
SQL Server için CLR Kütüphanelerini Anlamak ..................................................................... 511
T-SQL ve CLR Tip Geçişi: System.Data.SqlTypes .................................................................. 512
SQL CLR için Veri Sağlayıcıları ............................................................................................... 513
SqlContext ...............................................................................................................................514
SqlConnection..........................................................................................................................515
In-Process (Dahili İşlem) ve Out-Of-Process (Harici İşlem) Kavramları ...................................... 515
SqlCommand ...........................................................................................................................517
SqlParameter ...........................................................................................................................517
SqlPipe ....................................................................................................................................518
SqlDataReader .........................................................................................................................520
SqlDataRecord .........................................................................................................................520
SqlTransaction .........................................................................................................................521
System.Transaction .................................................................................................................522
SqlTriggerContext ....................................................................................................................522
CLR Stored Procedure'ler Oluşturmak................................................................................... 522
CLR'da RETURN Deyimi ile SP'den Değer Döndürmek ........................................................... 524
Stored Procedure'ler ile Transaction Kullanımı ....................................................................... 526
CLR Trigger'larla Çalışmak .................................................................................................... 526
28
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
CLR Kullanıcı Tanımlı Fonksiyonlar Oluşturmak .................................................................... 528
Skaler Tipli Kullanıcı Tanımlı Fonksiyonlar.............................................................................. 530
Veritabanı Atölyesi ............................................................................................................... 532
25. ÜNİTE: İleri Rutinler ......................................................................................533
CLR ile İleri Rutinler Kodlamak........................................................................................ 533
Tablo Tipli Kullanıcı Tanımlı Fonksiyonlar Kodlamak ............................................................. 533
Kullanıcı Tanımlı Grupsallar Oluşturmak ............................................................................... 535
Serializable Kavramı ve Gereksinimi ...................................................................................... 537
CLR Kullanıcı Tipleri Oluşturmak ........................................................................................... 540
Veritabanı Atölyesi ............................................................................................................... 544
Bölüm Sonu Özeti ............................................................................................................ 545
Bölüm Sonu Tekrar Soruları ............................................................................................ 545
9. Bölüm
VERİTABANI YETENEKLERİNİ GELİŞTİRMEK
26. ÜNİTE: Bağlı Sunucularla Çalışmak .............................................................547
Dağıtık Sunucularla Bağlantı Tanımlamak ...................................................................... 547
Bir Bağlı Sunucu Tanımlama ve Yönetme ............................................................................. 548
Bağlı Sunucularda Güvenlik ve Erişim .................................................................................. 550
Dağıtık Sorgularla Çalışmak ............................................................................................ 551
Bağlı Sunucular Üstünden Dağıtık Sorgular Çalıştırmak ....................................................... 551
Dağıtık Sorgularda Transaction ve MSDTC........................................................................... 553
Doğaçlama Dağıtık Sorgular (Ad-Hoc Distributed Queries)................................................... 553
Veritabanı Atölyesi .......................................................................................................... 554
27. ÜNİTE: İlişkisel Olmayan SQL Server Yetenekleri........................................555
HierarchyID Veri Tipini Anlamak ..................................................................................... 555
Hiyerarşik veriye kavramsal bakış ........................................................................................ 555
HierarchyID Veri Tipi ve Metotları ....................................................................................... 556
Hiyerarşik Veriyi Eklemek ..................................................................................................... 557
Bir Düğümün Atalarını Listelemek ........................................................................................ 558
Bir Düğümün Çocuklarını Listelemek .................................................................................... 560
Bir Düğümün Ana Düğümünü Değiştirmek ........................................................................... 560
Bir Seviyedeki Düğümleri Döndürmek .................................................................................. 561
Bir Düğümün Altına Düğüm Eklemek.................................................................................... 562
Uzaysal Veri Türlerini Anlamak ....................................................................................... 563
Uzaysal Veri Kavramı ve Coğrafi Bilgi Sistemlerine Genel Bakış ........................................... 563
İçindekiler
29
Uzaysal Veri Tiplerine Genel Bakış ....................................................................................... 564
Uzaysal Veri Tipleri Metotları................................................................................................ 565
Uzaysal Veriyi Kaydetmek .................................................................................................... 566
Uzaysal Veriyi Sorgulamak ................................................................................................... 567
Alan Bulmak .......................................................................................................................... 567
Kesişim Bulmak ..................................................................................................................... 568
Mesafe Bulmak ..................................................................................................................... 569
Veritabanı Atölyesi ............................................................................................................... 570
28. ÜNİTE: Service Brokers ................................................................................571
Service Brokers Mimarisini Anlamak ............................................................................. 571
Service Broker Altyapısının Sağladığı Bazı Önemli Özellikleri................................................ 573
Bir Veritabanında Service Broker Desteğini Açmak .............................................................. 573
Service Broker Nesnelerini Anlamak.............................................................................. 574
Service Broker Nesneleri ...................................................................................................... 574
Type ...................................................................................................................................... 574
Contract ................................................................................................................................ 575
Queue .................................................................................................................................... 576
Service Program .................................................................................................................... 577
Service .................................................................................................................................. 577
Servisleri Konuşturmak ........................................................................................................ 577
Dialog (Diyalog) Nesnesi ve Mesajlaşmayı Anlamak ............................................................. 577
Service Broker Uygulaması Gerçeklemek ...................................................................... 579
Gerekli Nesnelerin Oluşturulması ......................................................................................... 580
Kullanıcı Kayıt İşlemleri Servisinin Kodlanması ..................................................................... 580
E-Posta Servisinin Bileşenlerinin Kodlanması ....................................................................... 582
Servislerin Aktifleştirilmesi ................................................................................................... 587
Servislerin Çalışmalarının Test Edilmesi ve Gözlemlenmesi .................................................. 587
Veritabanı Atölyesi ............................................................................................................... 588
Bölüm Sonu Özeti ............................................................................................................ 589
Bölüm Sonu Tekrarı Soruları ........................................................................................... 589
10. Bölüm İSTEMCİ TARAFTA SQL SERVER ERİŞİMİ PROGRAMLAMA
29. ÜNİTE: ADO.NET Temelleri ...........................................................................591
İstemci Taraf Veritabanı Uygulamaları Geliştirmek........................................................ 591
ADO.NET 2.0'ı Kavramak ................................................................................................. 592
Online (Bağlı) Veri Erişim Modeli .......................................................................................... 592
30
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
SqlConnection ....................................................................................................................... 594
Bağlantı Havuzlama (Connection Pooling) ................................................................................. 596
SqlCommand ile Veri Yönetimi............................................................................................... 596
SqlDataReader ve SqlServer'dan Veri Çekmek .........................................................................598
SqlParameter ...........................................................................................................................599
SQL Server 2005'de MARS Desteğini Kullanmak .....................................................................602
Yoğun Veri Kopyalamak: SqlBulkCopy .....................................................................................604
Veri Değişimini Yönetmek ...................................................................................................... 606
SqlTransaction ile İstemci Taraflı Transaction Yönetimi ...........................................................608
CLR Kullanıcı Tanımlı Tipleri İstemci Tarafta Kullanmak ...........................................................612
Xml.XmlReader Sınıfı ve İstemci Tarafta Bağlantılı XML İşlemleri ............................................613
Veritabanı Atölyesi .......................................................................................................... 616
30. ÜNİTE: ADO.NET'de Kopuk Veri Yönetimi ....................................................617
Offline (Kopuk) Veri Erişim Modeli .................................................................................. 617
DataSet Nesne Modelini Anlamak ......................................................................................... 618
DataTable ve Veritabanından Veri Çekmek...............................................................................619
DataTable'larda Veri Bütünlüğü ve Constraint'ler ....................................................................... 620
DataSet içerisinde Birden Fazla DataTable İlişkilendirme ve Relations Kavramı ........................ 621
SqlDataAdapter ile Kopuk Modelde Veri Erişimi ................................................................... 622
Kopuk Modelde Veri Değişimini Yönetmek ............................................................................ 625
DataTable Açısından Veri Değişimi ..........................................................................................625
Değişimleri Veritabanına Geri Yansıtmak .................................................................................627
ASP.NET Uygulamaları ve Veri Bağlamaya Hızlı Bakış .................................................. 630
Veritabanı Atölyesi ............................................................................................................... 637
31. ÜNİTE: SQL Server Management Objects'i Kullanmak ................................639
SMO Nesne Modelini tanımak ............................................................................................. 640
SMO Nesne Modelini Uygulamalarda Kullanmak ................................................................. 640
Server Nesnesininin Özelliklerini Almak ................................................................................. 642
SMO ile Veritabanında Nesneleri Yönetmek .......................................................................... 644
Yeni Bir Nesne Oluşturmak ......................................................................................................644
Var Olan Nesneyi Değiştirmek .................................................................................................645
Nesne Silmek...........................................................................................................................645
SMO Utility Class'ları Kullanmak ............................................................................................ 646
Veritabanı Atölyesi ............................................................................................................... 647
Bölüm Sonu Özeti ............................................................................................................ 648
Bölüm Sonu Tekrar Soruları ............................................................................................ 648
İçindekiler
EK A
31
VERİTABANI PROGRAMCILARINA İPUÇLARI
SQL SERVER'DAN DAHA FAZLA YARARLANMAK.......................................................... 649
Veri Sunum Katmanı Hakkında ............................................................................................. 649
Veri Erişim Katmanı Hakkında .............................................................................................. 649
Veritabanı Yönetimi .............................................................................................................. 649
SQL Server'in Diğer Yetenekleri Hakkında............................................................................. 650
Reporting Services ................................................................................................................ 650
Veri Ambarlama ve OLAP ...................................................................................................... 650
SQL Server Integration Services (SSIS) ................................................................................. 650
XML Sütunları Full-Text Aramaya açmak ............................................................................. 651
SQL SERVER'DE VERİ ALIŞVERİŞİ ................................................................................... 651
Veri Dosyalarıyla Veritabanını Taşımak: Attach-Deattch ...................................................... 652
Uygulama Verilerini Yedeklemek ve Yedekten Geri Dönmek Hakkında ................................... 652
BCP ile Metin Dosyalarından Veri Alışverişi ......................................................................... 655
SQL Server Import and Export Wizard Kullanarak Veri Aktarımı ........................................... 657
Replication ........................................................................................................................... 660
SQL Server 2000 veya 2005 Veritabanını SQL Server 2008'e Aktarmak Hakkında ....... 661
Aktarım Seçenekleri ............................................................................................................. 661
GÜVENLİK VE YETKİLENDİRME HAKKINDA ................................................................... 663
Genel Güvenlik Önlemleri ..................................................................................................... 663
Hassas Bir Uygulama için Veritabanı Güvenlik Kontrol Listesi .............................................. 664
SQL Enjeksiyonu ve Karşı Önlemler ....................................................................................... 665
Tektırnak Saldırılar ...................................................................................................................665
Hata Verdirmeye Dayalı Saldırılar.............................................................................................666
Stored Procedure Kullanan Saldırılar ........................................................................................667
Genel SQL Enjeksiyon'larından Korunma Tedbirleri...................................................................668
Sadece İyileri Kabul Etmek ........................................................................................................ 668
Kötüleri Reddetmek................................................................................................................... 668
Kötüleri Filitreleyerek Kabul Etmek ............................................................................................ 668
EK B
C# VE OOP KILAVUZU
C# İLE PROGRAMLAMAYA GİRİŞ KILAVUZU ................................................................ 669
C# ile Merhaba Dünya......................................................................................................... 669
Sınıflar Yazmak ..................................................................................................................... 670
Değişkenler Değerler ve Veri Tipleri ....................................................................................... 672
Tür Dönüşümleri ......................................................................................................................674
Değer ve Referans Tipler Arası Dönüşüm: Boxing ve Unboxing ................................................ 675
32
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Döngüler ve Karar Yapıları ........................................................................................................675
if-else Karar Yapısı .................................................................................................................... 676
for Döngü Yapısı........................................................................................................................ 676
while Yapısı .............................................................................................................................. 676
Nesnelerle Çalışmak............................................................................................................. 676
Sınıflarda Erişim Seviyelerini Anlamak ................................................................................... 677
Yapıcı (Constructor) Kavramını Anlamak ............................................................................... 679
Metodları Aşırı Yüklemek....................................................................................................... 681
Static Kavramını Anlamak ..................................................................................................... 682
Özetle Nesneye Dayalı Programlama ..................................................................................... 684
3n Katmanlı Mimari ve Sınıfların Rolü................................................................................... 685
Üç Katmanı Tasarlamak ......................................................................................................... 685
İş Katmanını Tasarlamak........................................................................................................ 686
Sunum Katmanını Tasarlamak ............................................................................................... 691
EK C: BÖLÜM SONU SORU CEVAPLARI .............................................................695
EK D: DÜKKAN VERİTABANI ŞEMASI ................................................................705
EK E
CD KULLANIM KILAVUZU
CD Kullanım Kılavuzu....................................................................................................... 707
Araçlar ................................................................................................................................. 707
SQL Server Express Edition ................................................................................................... 707
SQL Server 2008 Bileşenleri .................................................................................................. 707
Örnek Veritabanları ve Kurulumları ....................................................................................... 707
SQL Server Veritabanı Sürüm Yükseltme Kılavuzu ................................................................ 708
Çalışma Dökümleri ............................................................................................................... 708
Kaynakça ......................................................................................................................... 709
Dizin ................................................................................................................................. 711
Giriş
Kitap kapsamında veri işleme ile ilgili iki temel standarttan bahsedilmekte; SQL ve
XML. SQL veritabanı sorgulamak için kullanılan bir dil olup, ANSI tarafından kabul
edilmiş bir standarttır. Standardın tam metnini farklı yıllardaki gözden geçirilmiş halleriyle birlikte, ANSI'den satın alabilirsiniz. Bunun için http://webstore.ansi.org adresinde
SQL kelimesini aratın ve çıkan ekrandan dilediğiniz standart için karşılığı olan ücreti
ödedikten sonra PDF dosyasına sahip olabilirsiniz. Standartların bazılarına ücretsiz de
ulaşabilirsiniz. Genel olarak SQL, veritabanı yönetim sistemine verilerle ilgili ifadeleri
bildirmek ve sonuçlarını almak için kullanılabilen bir standart tanımıdır.
XML, yazılım ve donanımdan bağımsız veri taşıma ve saklama standardı olup eXtensible
Markup Language (Genişletilebilir İşaretleme Dili) kelimelerinden elde edilmiş bir kısaltmadır. XML ile işaretlenmiş bir bilgi, bir cep telefonunda bir PC'de gösterildiği kadar kolay gösterilebilir. XML ayrıca farklı platformlarda çalışan uygulamalar arasında veri paylaşımı için ve
HTML'den arındırılmış olarak bilgilerin Web'e açılması için de kullanılır. XML de verinin görünümü ve sunumu ile ilgilenen işaretleme dili HTML (Hiper Metin İşaretleme Dili) gibi
SGML (Standard Generalized Markup Language)'den türetilmiştir. SGML çok geniş bir dil
olduğundan Web'de tam olarak kullanılması oldukça zordur. Bu nedenle bu türden geliştirmelere gidilerek amaca özel kısıtlı elemanlardan oluşan işaretleme dilleri elde edilmiştir. XML
standardının son haline www.w3c.org/TR/XML adresinden ücretsiz olarak ulaşabilirsiniz.
Veritabanı Programlama Hakkında
Herhangi bir dil (C#, VB.NET, Delphi, C++, Java…) ile yazılmış ve en basitinden düz
metin dosyasına erişip içerisinde verilerini saklayan ve daha sonra erişip bu verileri okuyan uygulama bir veritabanı uygulamasıdır. En gelişmiş anlamda veritabanı uygulaması,
milyonlarca satırdan oluşan tabloları yöneten ve raporlayan uygulamalardır. N katmanlı
yaklaşımda en alt katmana Veri katmanı denir ve bu katman veritabanına karşılık gelir.
Uygulamalarda veritabanı kullanılmasındaki temel hedef, veri ile onu işleyen yazılımının
birbirinden soyutlanması ve veri erişimi, raporlama gibi işlemlerin hızlandırılmasıdır. Veritabanı ayrıca veriye erişimi izne bağlar ve veri güvenliğini sağlar.
Genellikle, kurumların çeşitli kaynaklardan ürettikleri verileri yönetmelerini sağlamak
üzere geliştirdikleri uygulamalar, verilerini veritabanı ortamında saklar. Veritabanı ortamı, üstüne inşa edilen uygulamanın verilere daha hızlı erişmesini, raporlamasını sağlayarak performans artışı ve kolay veri yönetim ortamı sağlar.
Kurumsal ihtiyaçlar çerçevesinde geliştirilen programlar için yazılan kodların dışında, veritabanı ile etkileşim ve veritabanı seviyesinde karar mekanizması geliştirme gibi amaçlar
için veritabanı programlama kullanılır. Güncel veritabanı programlamada kullanılan veritabanı seviyeli diller, SQL, XML ve Nesne sorgulama dili standartları çerçevesinde şekillenmiştir.
Kitabın İçerdiği Örnekleri Test Edebilmek İçin
"Yazılımcılar için MS SQL Server 2008 ve Veritabanı Programlama" kitabının içerdiği
örnekleri test edebilmek için, sisteminizde standart olarak kurulumu yapılmış SQL Ser-
34
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
ver 2008 Developer Edition olması yeterlidir. Yer yer, Books Online(kısaca BOL) adı verilen SQL Server 2008 yardım kitabına atıfta bulunulmuş olabilir. Kitapta ele alınan projeye ait dosyaları, CD içeriğinde bulabileceğiniz gibi, destek sayfalarından indirebilirsiniz.
Ayrıca www.microsoft.com/sql adresinden ücretsiz indirebileceğiniz 180 günlük(ki yarım
yıl demek) ücretsiz SQL Server 2008 Enterprise Edition da kitap içeriğini test etmek için
fazlasıyla yeterli bir SQL Server sürümüdür.
Kitapta verilen kodlamalar, aksi belirtilmediği sürece 'Management Studio' adı verilen
SQL Server istemci aracının Query ekranları kullanılarak test edilebilir.
Birikim Gereksinimleri
Kitap içeriği, programlama dünyasına yeni adım atmış ve Microsoft temelli yazılım geliştirme ortamını öğrenmeyi amaçlamış okurlar için düzenlenmiştir. Bunun dışında bir veritabanı yönetim sistemi için temel bilgileri verebilecek bir kitap olsa da ek bir adaptasyon
süreci gerektirebilir.
Kitap içeriği, SQL dışında bir uygulama geliştirme dili gerektiğinde bunun C# olması
durumuna göre düzenlenmiştir. Bu nedenle C# dili hakkında yüzeysel bir birikiminizin
olması, kitap kapsamını bir çırpıda sindirebilmeniz için faydalı olabilir. Daha önce bir dil
ile uygulama geliştirdiniz ama C# size biraz yabancı geliyorsa, kitabın ek kısımları size yol
gösterecektir. Hiçbir dil bilmeden bu kitaba başlıyorsanız, yer yer bir C# kitabı ile desteklenmesinde yarar olabilir.
Kimlere Hitabediyor
Kitap, ASP.NET ve/veya .NET ile SQL Server 2008 üstünde uygulama geliştirenlere hitap etmektedir. Bilgisayar Mühendisliklerinde okutulan 'Veritabanı Yönetim Sistemleri',
Endüstri Mühendisliklerinde veya Yönetim Bilişim Sistemlerinde okutulan 'Veritabanı
Tasarımı ve Gerçekleme' derslerine asıl veya yardımcı kitap olarak kullanılması mümkündür. Ayrıca, programlama dünyasından daha önce haberdar olan ve programlamaya
bir orta ve büyük ölçekli veritabanını uygulaması tasarlamayı çözerek başlamak isteyenlere yol göstermek üzere hazırlanmıştır.
Ancak kitap programlama hakkında hiçbir altyapısı olmayanlar için hazırlanmış ve her
şeyi hiçbir şey bilmeyen biri için en baştan alan bir kaynak değildir. Programlama hakkında hiç bir deneyiminiz olmaması halinde, kitabın kapsamı sizin için ağır ve anlamsız
gelebilir.
Yine, bir uygulama geliştirmek isteyenler için, bu kitabı tek başına yeterli kaynak olarak
görmek iyi bir seçim olmaz. Kitap, bir veritabanına bağlı uygulama geliştirmenin ağırlıklı
olarak veri katmanını, fikir verecek kadar da veri erişim katmanını ele almaktadır. Diğer
katmanlar için başka kaynaklarla birlikte takip edilmesi gerekebilir.
Farklı Başlangıç Önerileri
Kitabı yapacağınız işe ve birikiminize göre farklı noktalardan başlayarak okuyabilirsiniz.
Bu konuda aşağıdaki tablo size yol göstermek üzere düzenlenmiştir.
Giriş
Yaptığınızyapacağınız iş
Başlangıç Seviye SQL
Server 2005-2008 Veritabanı Programcısı
İleri - Orta Seviye SQL
Server 2005-2008 Veritabanı Programcısı
Daha Önceden
Bilmeniz gerekenler
Kitabı kullanmak için öneri
İlişkisel Veritabanı
Hakkında genel bilgi
1. İlk üç bölüm sizi veritabanı ortamına alıştıracaktır.
2. Ek-A'daki teknikler veri taşımanızı kolaylaştırabilir.
SQL Server 2000 veya
eşdeğeri bir VTYS ile
proje geliştirmiş olmak
1.
2.
3.
4.
5.
Raporlama Uzmanı
Raporlama Ortamınızı
Kullanmak
SQL Server 2005 Programcılar için Yenilikler
SQL Server 2000 Programlamayı iyi seviyede
bilmek
SQL Server 2008 Yenilikler SQL Server 2005 Programcısı
35
SQL Server 2005 yenilikleri hakkında fakir sahibi değilseniz ilk 3 bölüme göz atın
Takip eden 4 bölümden ihtiyacınız olanları okuyun
C# veya eşdeğeri bir dil bilmiyorsanız EK-B'yi okuyun
8. Bölümü okuyun
Veritabanı ortamında servis temelli bileşenler kurgulamanız gerekiyorsa 9. bölümü
okuyun.
6. İstemci taraf uygulamalar geliştirme konusunda fikir edinmek için 10. bölümü okuyun
1. SQL Server 2008'e veya İlişkisel Veritabanı Kavramına yabancı iseniz 1.bölüme göz
atın
2. SQL ifadelerini yazmakta güçlük çekiyorsanız 3. Bölümü okuyun
3. Bazı sorgularınızı hızlandırmak veya basitleştirmek için 4. Bölümü okuyun
4. Sorgularınızda sunucu taraflı programatik bileşen gereksinimleriniz varsa 5. Bölümü
okuyun.
5. Sunucu taraflı bileşen ihtiyacınız arttıkça takip eden bölümlerden uygun olanlara da
göz atabilirsiniz.
1. İlk bölüme göz gezdirin ve yeni eklenen servisler, eski servislerin yeni isimleri hakkında fikir sahibi olun
2. 2.2'de yeni veritabanı seçenekleri hakkında
2.3'de yeni tiplerin kullanımı hakkında
2.4'de yeni veri bütünlüğü seçenekleri hakkındaki değişikliklere göz atın.
3. 3.2.3'de yer alan veri sorgulamaya dair yeniliklere göz atın
4. 3.3'ün ilk üç konusunu okuyun
5. 4.1'de parçalı tablolar bahsini okuyun
6. 4.3'de yeni indeks seçeneklerine göz atın
7. 5.2'de rutinleri başkalarının adına çalıştırmak bahsine göz atın
5.3'de TRY-CATCH yapısını öğrenin.
5.4'ün son iki başlığını okuyun
8. 6.Bölümün tamamını okuyun
9. 7.1.2'yi okuyun
10. 8.Bölümün tamamını okuyun
11. 9.Bölümün tamamını okuyun
12. 10.Bölümün ilk iki ünitesindeki yeniliklere göz gezdirin.
13. 10.3'ün tamamını okuyun.
14. Veritabanınızı SQL Server 2000'den 2005'e aktaracaksanız, EK-A'daki ipuçları
bahsine göz atın.
1. SQL Server araçlarına göz atın. SAC'ın yeni yerini öğrenin
2. 6.Ünite'de Sparse column özelliğine bakın
3. 8.Ünite'de Tarih Zaman tipi ile ilgili yenilikleri okuyun
4. 9.Ünite'de “Gruplanmış verileri özetlemek” bahsini okuyun
5. 10.Ünite'de VALUES ifadesi ile çoklu satır üretimine ve MERGE ifadesine göz atın
6. 13.Ünite'de filtreli indekslere ve sıkıştırılmış indeks kullanımına göz atın
7. 14.Ünite'de T-SQL değişken tanımlama ve operatör yeniliklerine göz atın
8. 15.Ünite'de Tablo Tip parametre alan Stored Procedure konusuna göz atın
9. 18.Ünite'de XQuery ve let ifadesine göz atın
10. 27.Ünite'de hiyerarşik ve uzaysal veri tiplerine göz atın. XML Web Service desteği
kaldırılacak özellik olarak işaretlendiği için kitaptan çıkartıldı.
36
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Kitap Neler İçeriyor
Kitap genel olarak veritabanı programlama konusunu ele almakta. Konu, bir veritabanı
yönetim sisteminin tanıtımı yapmaktan öte, onu bir veritabanı yönetim sistemi olarak
nasıl programlayabileceğiniz noktasında ele alınmakta. Elbette veritabanı programlamaya
dair ne varsa bu kadar sayfada anlatmak mümkün değil. Burada, bir veritabanı uygulamasını geliştirme sırasında gerekli bilgileri başlangıçtan itibaren aşama aşama ele alarak,
basitlik ve yalınlık kısıtları dâhilinde yeni bir yazılım geliştiriciye temel veritabanı disiplinlerinin aktarılması hedeflenmekte.
Veritabanı Kavramına Giriş
Bu bölümde, temel olarak ilişkisel veritabanı kavramları ve SQL Server'ın temel bileşenleri ele alınmakta. Arkasından gelecek bölümlerdeki ifadeleri anlayacak kadar T-SQL dilinden bahsedilmekte.
Veritabanı Tasarımı
Bu bölümde, sıfırdan bir veritabanı projesinin nasıl tasarlanacağına dair fikir edinmeye çalışacağız. Arkasından, bir veritabanı nesnesinin özelliklerinin belirlenmesi ele alınmakta. Son
olarak, tabloların hangi kurallara göre tasarlanacağı ele alınmakta. Veritabanı tasarımı, kavramsal, mantıksal ve fiziksel olmak üzere üç aşamalı bir süreç içerisinde ele alınmakta.
Veri Sorgulama
Bu bölümde, bir tablodan verilerin nasıl çekilebileceğinden başlanıp, tabloların birlikte
sorgulanması, verilerin özetlenmesi, CTE ile rekürsif sorguların yazılması ve verilerin sıraya sokulması gibi işlemler ele alınmakta. Özellikle raporlar geliştirmeniz gerekiyorsa bu
bölümdeki üç üniteyi kavramak sizin için elzem olabilir.
Veri Erişimini İyileştirmek
Verileri sorgularken, performans artışına gereksinim duyarız. Bu durumda alınabilecek
önlemler bu bölümde incelenmekte. Yavaş çalışan raporlarınız varsa, veritabanına gelen
sorguları takip etmeniz ve iyileştirme konusunda SQL Server'dan fikir almak istiyorsanız,
bu bölüme göz atmanız faydalı olabilir.
T-SQL ile Programatik Öğeler Kodlamak
T-SQL dilini bir programlama dili olarak öğrenmek, böylece SQL Server 2005 içerisinde ihtiyaca binaen kodlar yazmak istiyorsanız bu bölümdeki üniteler size yol gösterecektir. Kodlarınızı veritabanında tekrardan kullanım amaçlı olarak kaydetmek ve veritabanı seviyeli kodlarınızdaki hataları daha sonra gözlemlemek üzere takibata almak bu bölümde ele alınmakta.
XML ile Çalışmak
Veritabanında XML veri saklamak ve XML veri üstünde yapılabilen işlemlerle ilgili
programatik konular bu bölümde ele alınmakta. Gerektiğinde tablolarınızdaki verileri
XML'e dönüştürerek çekmek ve XML verilerinizi tablolara aktarmak da burada ele
alınmakta.
Giriş
37
Ortak Zamanlılık ve Transaction
Veritabanı içerisinde birden fazla işlemin mantıksal olarak aynı anda olmuş gibi yürümesini sağlamanız gerekiyorsa, transaction blokları kullanmak sizin için kaçınılmaz olacaktır. Bu bölümde, transaction blokları oluşturmak, transaction bloklarını birbirinden izole
etmek ve veri değişimlerine duyarlı T-SQL programcıkları geliştirmek ele alınmakta.
SQL Server 2008 içinde CLR
Bu bölüme başlamadan önce en azından yazılmış kodları anlamlandıracak kadar C# bilginizin olması gerekir. Şayet daha önce hiç C# veya benzeri bir dil ile program geliştirmedi iseniz,
kitabın Ek-B kısmına göz atmanız yararlı olacaktır. Bölüm içerisinde, C# dilinin ve Microsoft. NET ortamının T-SQL'e yardımcı bir enstrüman olarak kullanılması ele alınmakta.
Veritabanı Yeteneklerini Geliştirmek
Bu bölümde, veritabanınızdan daha fazla yararlanabilmeniz için yapabileceğiniz programsal işlemler ele alınmakta. Bu çerçevede, SQL Server'ın bir veri yönetim merkezi olarak
kullanılması ve text, Excel, Access, başka veritabanı yönetim sistemleri içerisindeki verileri tek bir merkezden yönetmesi için ayarlamalar yapmak ele alınmakta.
Ayrıca, SQL Server 2008 ile birlikte eklenen Hiyerarşik ve Uzaysal Veritipleri ele alınmakta.
Yine bu bölümde, Servis Temelli Programlama kapsamında, birbirinden bağımsız çalışan
ama gerektiğinde birbirini tetikleyen SQL Server içerisinde program blokları oluşturmayı
ele alacağız.
İstemci Taraftan Veritabanı
Bu bölüm de yine 'ölmeyecek kadar' C# bilgisi gerektiren bir bölüm. İstemci taraftan veritabanı erişimi konusunda yeni başlamış programcılara fikir vermek ve vizyon çizmek
için kitaba eklenmiştir.
Ayrıca, SQL Server 2008'e veri dışında yönetimsel hedefler için erişimde bulunacak uygulamaların geliştirilmesi için gerekli kütüphaneler de bu bölümde ele alınmakta.
EK A - Veritabanı Programcılarına İpuçları
Elinizdeki kitap her ne kadar geniş kapsamlı bir veritabanı programlama kitabı olsa da,
veritabanı programlama aşamasında ihtiyaç duyacağınız temel işlemlerden konunun akışı
içerisinde yer verilememiş olanlar burada toparlanarak, bilginize sunulmuştur.
EK B - C# ve OOP Kılavuzu
Henüz C# ve OOP ile yeterince vakit geçirmemişseniz bu ünite size gerekli yüzeysel bilgiyi vermek üzere düzenlenmiştir.
EK C - Dükkan Veritabanı Şeması
Kitap içerisinde sürekli olarak kullanılan Dukkan veritabanının bu bölümde bir şeması
verilmiştir. Yer yer bu şemaya göz atmak veritabanı yapısını kavramak adına işlerinizi kolaylaştırabilir.
38
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
EK D - Bölüm Sonu Soru Cevapları
Kitap ekinde gelen CD'nin içeriği ve kullanımı konusunda bu bölümde bilgi bulabilirsiniz.
EK E - CD Kullanım Kılavuzu
Kitap ekinde gelen CD'nin içeriği ve kullanımı konusunda bu bölümde bilgi bulabilirsiniz.
Gösterimler ve İçerik Düzeni Hakkında
Kitap içerisinde, kodlar daktilo formatında verilmiştir. İki farklı şekilde örnek kodlar yer
almaktadır: Formül-açıklama niteliğinde olan kodlar ve çalıştırılabilir kodlar. Formülaçıklama niteliğindeki kodlarda satırların başında düşey çizgi yer almamaktadır. Ayrıca,
yerine bir şeyler yazmanız gereken yerler, altı çizgili olarak verilmiştir. Bunun dışında, {}
arasına alınan yerler, mutlaka bir şeyler yazmanız gerektiğini gösterirken, [] içerisindeki
ifadelerin isteğe bağlı olduğunu ifade eder. | işareti veya anlamında olup bir yere yazılabilecek alternatifleri belirtmek için kullanılmaktadır.
Bu türden kodlar doğrudan çalıştıramazsınız!
Formül seviyesindeki {gösterimler[dir]}
Çalıştırılabilir kodların başında düşey bir çizgi yer almaktadır. Ayrıca, çalıştırılabilir kodlar içerisinde vurgulanmasında yarar görülen ifadeler koyulaştırılmak suretiyle, daha hızlı
görmeniz sağlanmaya çalışılmıştır.
Çalışabilir kodları göstermektedir.
İpucu: Burada bahsedilen şey, hayati derecede önemli olmasa da programlama yaparken hayatınızı
kolaylaştıracak nitelikte olabilir veya konunun anlatımı bozmamak adına yüzeysel ele alındığını
detaylarını nerede bulabileceğinizi gösterir.
Dikkat: Burada bahsedilen şeyler, hayati derecede önemlidir. Dikkat edilmemesi halinde veri kayıplarına neden olabilir veya tekniği tam olarak uygulayabilmeniz buraları gözden kaçırmamanıza bağlıdır.
Kaynak Dosyaları Destek ve Geri Bildirim
www.verivizyon.com/sql2008 adresinde kitap ve kapsamı hakkında ek bilgiler, kaynak
dosyaları ve sunumlar bulabilirsiniz.
Kitap hakkındaki fikirlerinizi doğrudan yayınevine iletebileceğiniz
ygozudeli@verivizyon.com adresinden okumaktan büyük zevk duyarım.
gibi,
Birinci Bölümden EK A'ya Kadar Olan
31 Ünite Basılı Halde
Kitap İçerisinde Bulunmaktadır.
EK A
VERİTABANI PROGRAMCILARINA İPUÇLARI
Bu kısımda, veritabanını daha etkin kullanabilmek için ihtiyaç duyacağımız, ama kitap akışı
içerisinde, akışı dağıtmamak adına yer verilememiş önemli hususların özeti yer almakta. Bu
çerçevede SQL Server 2000 ve 2005'teki verilerinizi 2005'e aktarma konusu da ele alınmakta.
Ayrıca bölüm içerisinde size çeşitli gereksinimleriniz için ufuk açmayı hedefleyen, gerek duyduğunuzda başka kaynaklardan detaylandırmanız gereken önemli hususlara yer verilmiştir.
SQL SERVER'DAN DAHA FAZLA YARARLANMAK
Veri Sunum Katmanı Hakkında
SQL Server 2008 ile parelel zamanlarda Microsoft tarafından duyurulan Silverlight ve
WPF gibi arayüz tanımlama teknolojilerini yakından takip etmenizde yarar var. Çünkü
ilerleyen zamanlarda bu iki teknolojinin vektör temelli, estetik kullanıcı arayüzleri geliştirmekte hayli yaygın bir kullanım bulacağı öngörülmekte.
Veri Erişim Katmanı Hakkında
SQL Server'a erişim için Entity Framework adı verilen ve Microsoft tarafından geliştirilen
Nesne-İlişkisel Veri Eşleme(ORM veya Object-Relational Mapping) kütüphanelerini kullanarak kolayca erişebilirsiniz. Bu kütüphane, ilişkisel veritabanını bir nesneler kümesi imiş gibi
otomatik olarak projelerinizden sorgulama ve değiştirme olanağı sağlamaktadır.
Ayrıca, Microsoft tarafından çeşitli ortamlardaki verilerin SQL'e benzer bir söz dizimi ile
sorgulanması sağlayan LINQ kütüphanesini, hafızadaki bilgilerinizi sorgulamak için; bu
kütüphanenin bir alt kütüphanesi olan LINQ to SQL kütüphanesini kullanarak, veritabanındaki tablolara bir nesneler kümesi gibi erişim sağlayabilirsiniz.
Bu iki kütüphaneyi özellikle şu amaç için tercih edebilirisiniz:
SQL Server verileri ilişkisel bir ortam olduğu için tablolarda tutar. C# gibi bir dil ile geliştirdiğiniz kullanıcı arayüzleri vs. veritabanı dışındaki kodlama ortamları genellikle nesne tabanlıdır ve nesne temelli bir veri modeli kullanırlar. Nesne temelli veri modelinin
ilişkisel temelli bir veri ortamında saklanması veya ilişkisel verinin nesne modeline dönüştürülmesi, program geliştirirken ek maliyet olarak karşınıza çıkar. İşte bu iki kütüphane, sizin yerinize nesne-tablo dönüşümlerini yaparak maliyetlerinizi azaltır.
Veritabanı Yönetimi
Veritabanında yedek alma, yedekten dönme, hata kurtarma, Replication yapılandırma,
Mirroring ve Clustred olarak sunucuları paralel çalıştırma gibi konularda bilgi gereksiniminiz
varsa, SQL Server Yönetimi ile ilgili bilgi kaynaklarına göz atmanızda yarar olabilir.
650
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
SQL Server'in Diğer Yetenekleri Hakkında
Notification Services ile Veri Dağıtım Abonelikleri Kurgulamak için Notification
Services bileşenini yapılandırabilirsiniz. Bu servisi verilerinizdeki belli değişimlere abone
olan kullanıcılarınıza olay dahilinde çeşitli kanallardan mesaj iletmek için yapılandırabilirsiniz. Ayrıntılı bilgi için Notification Services hakkında bir kitap okuyabilirisiniz.
Reporting Services
SQL Server 2005 için geliştirilen "Reporting Service" adlı program, SQL Server 2000 ile
de uyumlu olarak kullanılabilmektedir. Bu araç sayesinde, Web Sayfası, PDF, Excel gibi
ortamlara verilerin raporları aktarılabilmektedir. Ücretsiz olan bu aracı olarak rapor sunucusu olarak kullanabilirsiniz.
Veri Ambarlama ve OLAP
Veri Ambarlama, Veri Madenciliği ve OLAP gibi konular hakkında ayrıntılı bir çalışmaya
gereksinimizin varsa, bu konuda yazılmış kitaplara başvurabilirsiniz. SQL Server'in Enterprise
Sürümünde yeralan Analysis Services bileşenleri bu konuda size destek olacaktır.
OLAP konusunda, ciddi bir çalışma planlıyorsanız, SQL'in yanı sıra MDX (Çok boyutlu
İfadeler- multidimentional Expretions) konusunda da bilgi edinmeniz gerekecektir.
SQL Server Integration Services (SSIS)
SQL Server 7.0'dan bu yana kullanılagelen Data Transformation Services SQL Servre
2005'den itibaren yeniden şekillendirilerek SSIS adı verilmiştir. SSIS ile veri bütünleştirme çözümleri geliştirmede kullanılır. SSIS veri birleştirme ve dönüşüm paketleri oluşturmak için grafik arayüzler, sihirbazlar ve araçlar içerir. Veri akışı paketleri programlarken, FTP ile veri çekme ve ver gönderme, e-mail mesajları gönderme gibi ek destekler
sağlar. Ayrıca SSIS bileşenlerine, SMO gibi programsal olarak erişmek mümkündür.
Şayet veritabanınıza düzenli olarak çeşitli kaynaklardan veriler aktarmanız veya rutin
olarak veri dönüşümü işlemleri yapmanız uygulamanızın bir parçası olacaksa SSIS programlama konusunda ayrıntılı bilgi edinmeniz gerekebilir.
Şekil A.1:
Integration
Services'in diğer
servislerle olan
8
ilişkisi
8
Şekil http://msdn.microsoft.com/ adresinden alınmıştır.
Ek A: Veritabanı Programcılarına İpuçları
651
XML Sütunları Full-Text Aramaya açmak
TEXT, NTEXT veya XML gibi LOB türden bir sütun üstünde, metin aramaları için etkin bir
yol olan full-text aramalar yapılabilmesi, full-text indeks tanımlanması ile mümkündür.
Örnek Durum 1:
Şu şekilde bir tablo içerisinde kitap içerikleri olsun.
CREATE TABLE tbKitapDetay
(kitapKod INT PRIMARY KEY,
xKitap XML)
Basit bir Full-text indeksini şu şekilde tanımlayabiliriz:
Bir tabloda Full-text indeks oluşturmadan önce, katalog oluşturmak için bir clustred indeks tanımlamak gerekir.
Burada, PK__tbKitapDetay__1A14E395 adı ile bir indeks, SQL Server tarafından, bizim birincil anahtarımızı gerçeklemek için otomatik oluşturuldu. Siz de oluşturulan
anahtara ait indeksin tam adını öğrenmek için,
sp_helpindex tbKitapDetay
sorgusunu çalıştırdıktan sonra, bu ismi görebilirsiniz.
CREATE FULLTEXT CATALOG ft AS DEFAULT
CREATE FULLTEXT INDEX ON dbo.tbKitapDetay ( xkitap )
KEY INDEX PK__tbKitapDetay__1A14E395
Ardından, bu indeks üstünden bir CONTAINS sorgusunu şu şekilde gerçekleştirmek
mümkündür:
SELECT R . xKitap . query ( '//bolum' )FROM ( SELECT kitapKod ,
xKitap FROM tbKitapDetay WHERE contains ( xKitap , 'veritabani'
)) R ( kitapKod , xKitap )
Şekil A.2:
Full-Text arama
işleminin sonucu
İpucu: Contains yapısı ile XML veri Full-text arama için sorgulanırken, XML elemanlarının etiketleri ve
öznitelikleri (tags, attributes) bir filtreden geçirilerek, aramaya yansıtılmaz.
SQL SERVER'DE VERİ ALIŞVERİŞİ
SQL Server'de zaman zaman verileri bir yerden bir yere aktarma gereksinimi doğabilir. SQL
Server bu konuda bir çok yöntem sunar. Burada özet olarak bu yöntemleri ele alacağız.
652
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Veri Dosyalarıyla Veritabanını Taşımak: Attach-Deattch
Herhangi bir veritabanı'nı bir sistemden başka bir sisteme aktarmanız gerektiğinde, bu iki sunucu arasında doğrudan bir iletişim kurulamıyorsa veya kurulması zorsa, SQL Server
2005'den veritabanını take offline menüsü ile hizmet dışı hale getirip, ilgili veritabanına ait
(*.mdf, *.ldf veya *.ndf uzantılı) dosyaları kopyalayarak bir diğer sisteme aktarabiliriz.
Diğer sisteme aktarılan bu iki veya daha fazla dosya, databases sağ tıklandıktan sonra,
"all tasks\attach" databeses menüsü kullanılarak, gerekli kontrolleri otomatik yaptırılıp,
yeni sunucuda bir veritabanı olarak kullanıma hazır hale getirilebilir.
İpucu: Bir veritabanının sadece nesnelerini almak için script oluşturma seçeneğini tercih edebilirsiniz.
Veritabanı nesnelerinin script'lerini almak hakkında bilgiyi "Tabloları Tasarlamak" başlıklı ünitede
bulabilirsiniz.
Uygulama Verilerini Yedeklemek ve Yedekten Geri Dönmek Hakkında
Bir uygulama geliştirilip gerçek verilerle çalışmaya başladığında, uygulamaya dair düzenli
bir yedek alma politikası geliştirmek gerekir. Örneğin, en basitinden bir UPDATE veya
DELETE işleminde, WHERE şartı koymayı unutsak bütün veriler aynı değere eşitlenir ve
veri kaybı meydana gelir. Geliştirdiğiniz uygulamanın çalıştırıldığı ortamın hassasiyetine
göre birkaç satır için bu kaybın pek önemi olmayabilir ama milyonlarca satıra hitabeden
bir uygulama için bu durum bir felakettir. Bu türden durumlarda, yedek indirmek kaçınılmaz bir hal alır.
Ayrıca, yedek almak transaction log dosyasını otomatik olarak boşalttığı için gereksinim
duyabilirsiniz.
Yedek almadan önce, SQL Server için bir yedekleme aygıtı (device) tanımlamış olmanız
gerekir. Yedekleme aygıtı, disk olabileceği gibi, type türünden bir yedekleme ünitesi de
olabilir.
Bir yedekleme aygıtı duruma göre şu ifadelerle tanımlanabilir:
-- disk ortamında yedekleme aygıtı tanımlamak için
sp_addumpdevice 'disk' , 'diskyedekAygiti' ,
'E:\SQLBackups\Full.bak'
--yedekleme ünitesinden aygıt tanımlama
sp_addumpdevice 'tape' , 'kasetYedekAygiti' , '\\.\tape0'
-- ağ üstünde başka bir bilgisayarın yedekleme aygıtı olarak
tanımlanması
sp_addumpdevice 'disk','agYedekDiskAygiti',
'\\Netsunucu\SQLBak\TLog.bak'
Daha sonra, yedek aygıtları hakkında bilgi almak gerektiğinde şu genel ifade çalıştırılabilir:
sp_helpdevice
Ek A: Veritabanı Programcılarına İpuçları
653
Yanlışlıkla tanımlanmış bir yedekleme aygıtını silmek mümkündür:
---Yedekleme Aygıtı silinsin ama yedek dosyaları kalsın
sp_dropdevice 'FullBackupDevice'
--!!! Aynı anda yedek dosyası da gider!...
Sp_dropdevice 'FullBackupDevice' , 'DELFILE'
İpucu: Yedekleme aygıtını, Enterprise Manager'den Management\Backup'ı sağ tıklanarak [New
Backup Device] seçeneği ile de oluşturup, silebilirsiniz
Yedek almak için Management Studio\Object Browser'dan ilgili veritabanını sağ tıklayın. İlgili yönergeleri takip ederek, kolayca yedek alabilirsiniz. (Hiç anlamıyorsanız, sadece "Next" butonlarını tıklayarak ilerleyin.)
Şekil A.3:
Veritabanınızın
her ihtimale karşı
yedeğini almanız
faydalı olur.
Şekil A.4:
Yeni bir Veritabanı yedeği hedefi
tanımlamak oldukça kolaydır.
654
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Ayrıca, yedek almak T-SQL ifadeleri ile de mümkündür:
Daha önceden bir yedekleme aygıtı tanımlamadan diske doğrudan yedek almanız gerekiyorsa, şu örnekteki gibi bir ifade kullanabilirsiniz:
BACKUP DATABASE Northwind TO DISK = 'D:\Temp.bak'
Veya daha önceden tanımladığınız bir yedekleme aygıtına yedek almak için aşağıdaki
örnektekine benzer bir ifade kullanabilirsiniz:
BACKUP DATABASE Northwind TO NorthwindFullBackup
Bir uygulamanın log dosyalarını T-SQL ile yedeklemek için:
BACKUP LOG Northwind TO NorthwindTLogBackup
Log dosyalarını silmeden yedekleme yapmak için:
BACKUP LOG Northwind
TO NorthwindTLogBackup WITH NO_TRUNCATE
Diğer yedekleme seçenekleri için BOL'a bakabilirsiniz.
Ardından indirmek istediğiniz veritabanı nesnesini sağ tıklayıp, "Tasks\Restore
\Database" seçeneğini tıklayarak, ilgili ayarlamalara ihtiyaç duyuyorsanız yaptıktan sonra,
duymuyorsanız hiçbir işlem yapmadan "OK" butonunu tıklayarak veritabanını, yedek aldığınız hale geri döndürebilirsiniz.
Şekil A.5: Veritabanındaki verilerde bir sorun
çıkması halinde,
alınan yedekleri
indirerek en son
yedek aldığınız
zamandaki duruma geri dönebilirisiniz.
T-SQL ifadeleri ile de yedekten dönmek mümkündür. Bu durumda da veritabanına erişimin
kısıtlanmış olması gerekir. Bu türden işlemler için genel ifadeleri şu şekilde verebiliriz:
Ek A: Veritabanı Programcılarına İpuçları
655
Doğrudan bir yedekleme dosyasındaki yedeği indirmek için:
RESTORE DATABASE Northwind FROM DISK = 'C:\SQLBackups\Temp.bak'
Bir yedekleme aygıtındaki yedekten geri dönmek için:
RESTORE DATABASE Northwind FROM NorthwindFullBackup
İpucu: Genellikle bir veri bozulması sonucunda yedekten dönmeniz gerekirse, asıl veritabanının yanına
ikinci bir veritabanı olarak yedeklerinizi indirip verilerinizi karşılaştırmak, sadece bozulan verileri
eski veritabanınızda değiştirmek, diğer verilerinizi kaldığı yerden devam ettirmek akıllıca olabilir.
SQL Server üstünde veritabanını deployment (programın kullanılacağı yere yerleştirilmesi)
amaçlı taşırken, yedek alıp yedeği taşımayı da tercih edebilirsiniz. SMO ile bir veritabanı yedek
alma programının C# ile nasıl kodlanabileceği SMO ile ilgili ünitede yeralmaktadır.
BCP ile Metin Dosyalarından Veri Alışverişi
BCP bir komut satırı aracıdır. Verileri dosyalara aktarmak veya dosyalardan veri almak
için kullanılabilir.
BULK INSERT ile bir instance'dan veri dosyaları aracılığıyla veri alınabilir. Ancak verilerin satır ve sütunlardan oluşan bir formatta ve düzmetin veya binary olarak veri dosyasına aktarılmış olması gerekir. Toplu olarak veritabanına alınan veriler, eski verilere eklenirken, Bir SQL Server instance'i tarafından veri dosyasına aktarılan toplu kayıtlar, eski veri dosyasını sildikten sonra yeniden kayıtları veri dosyasına aktarabilir.
İpucu: Toplu (Bulk) olarak veritabanına aktarılan veriler, veritabanında daha önceden bulunmayan bir
tabloya aktarılamaz. Ama veritabanından veri dosyasına aktarım esnasında, adı geçen dosya
yoksa oluşturulur.
Veri dosyası ile veritabanındaki tabloda yer alan sütunların aynı sırada veya sayıda olması bir zorunluluk değilken veri aktarılacak sütunların özdeş olması gerekir. Örneğin, INT
kabuleden bir sütuna harf eklemeye çalışmak hataya neden olacaktır.
Toplu olarak bir veritabanı ile bir veri dosyası üstünde veri alışverişi yaparken, şu hakların verilmiş olması gerekir:
¾
Veritabanından veri dosyasına aktarım için, tablolar üstünde SELECT hakkı
¾
Veri dosyasından veritabanına veri aktarırken, tablo üstünde SELECT ve INSERT hakkı
Örnek Durum 2:
Markalarımızın yeraldığı tblMarka tablosundaki kayıtları, marka.txt dosyasına aktarmamız gerektiğini düşünelim ve bunu bcp ile gerçekleştirelim
bcp dukkan.dbo.tblMarka out marka.txt -c -T
656
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Şekil A.6:
bcp aracı kullanılarak, bir tablodaki
verilerin dışarıdaki
bir metin dosyasına aktarılması.
İlgili dosya, ifadeler çalışırken
bulunulan dizinden görülebilir.
Tablonun tam yolunun verildiğine dikkat edin. out deyimi, veri aktarım işleminin veritabanına göre yönünü tayin etmektedir. marka.txt verilerin aktarılacağı veri dosyasıdır. –c karakter formatta aktarım yapılacağını gösterir. –T erişim için güvenli bağlantı
(Trusted Connection) kullanılacağını gösterir.
Verileri bu şekilde aktardıktan sonra marka.txt dosyasına notepad gibi bir programla
gözatabilirsiniz.
marka.txt dosyasında yeralan kayıtları, bcp kullanarak veritabanına aktarmak mümkündür.
Bunun için tblmarka2 adında bir tablonun daha önceden oluşturulduğunu varsayarsak:
bcp dukkan.dbo.tblMarka2 in marka.txt -c -T
demek yeterli olacaktır. Burada, out kelimesinin in olarak değiştiğine dikkat edin.
Bu işlem, BULK INSERT yöntemi kullanılarak, Query Analyzer gibi bir T-SQL ortamından da gerçekleştirilebilir.
USE dukkan
BULK INSERT tblMarka2
FROM 'c:\documnents and setings\ygozudeli\marka.txt'
WITH (DATAFILETYPE = 'CHAR')
Her iki yöntemde de tablonun önceden oluşturulmuş olması gerekir. Burada, WITH deyiminden sonra, DATAFILETYPE parametresi kullanılarak, verilerin bulunduğu format
belirtilmektedir.
Tablo A.1:
Bulk Insert parametreleri
BULK INSERT
Parametresi
BCP
Parametresi
Açıklama
NATIVE
-n
Native formattaki bir veri sadece bcp tarafından okunabilir.
Native ile kastedilen, veritabanının verileri sakladığı formattır.
Hızlı şekilde bir yerden bir yere veri aktarmak için kullanılabilir.
CHAR
-c
Karakter veri formatını belirtmek için kullanılır. Tab'larla ayrılmış satırlar halinde saklanır. Veri, bcp dışında Excel gibi başka
bir program tarafından da ele alınacaksa tercih edilebilir.
WIDECHAR
-w
CHAR'dan farklı olarak verileri unicode standardında ele alır.
WIDENATIVE
-N
Karakterle ifade edilmeyen sütunları, veritabanının kullandığı formatta, metin (varchar, char, nvarchar ve ntext, text vs.)
sütunları ise Unicode formatında saklamak için kullanılır.
Ek A: Veritabanı Programcılarına İpuçları
657
SQL Server Import and Export Wizard Kullanarak Veri Aktarımı
SQL Server Import and Export Wizard, SSIS araçlarından biri olup hızlı ve kolay bir şekilde SSIS paketleri oluşturabileceğiniz gibi, MS Access, başka bir SQL Server, Excel,
virgülle bölünmüş düz metin dosyası gibi veri kayakları ile veri alış-verişi yapabileceğiniz
bir araçtır.
Örnek Durum 3:
Daha önceden, bir düz metin dosyasında yer alan döviz kayıtlarımızı, SQL Server'e aktarmak istiyoruz.
1.
Management Studio'da ilgili veritabanını sağ tıklayın ve açılan menüden,
Tasks\Import Data seçeniğini tıklayın.
2.
Uygun olan kaynak seçilir. Örneğin biz düz metin dosyasına (*.txt) bağlanacağız.
Şekil A.7:
Data ImportExport Wizard'ın
başlatılması
Şekil A.8:
dovizler.txt dosyasının veri kaynağı olarak seçilmesi
658
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Şekil A.9:
Columns sekmesinden sütunları
görebilirsiniz.
Advenced sekmesinden sütunların
adını ve tipini,
sütun silme ekleme gibi işlemleri
yapabilirsiniz.
3.
Uygun olan hedef seçilir. Örneğin metin dosyasından SQL Server'e veri alacaksak,
hedef SQL Server'dir.
4.
Kaynakta var olan tablolar getirilir ve kullanıcının hangi tabloları aktarmak istediği
sorulur. İstediğiniz tabloları işaretleyin.
Şekil A.10:
Hedef olarak SQL
Server içerisindeki
dukkan veritabanının seçilmesi
Şekil A.11:
Kaynaktaki
verilern hedefte
hangi tablo(lara)
aktarılacağına
karar verin.
Ek A: Veritabanı Programcılarına İpuçları
659
Şekil A.12:
Daha önceden var
olan bir nesne
varsa, hangi
sütunun hangi
sütuna aktarılacağını eşleyebilirsiniz. Edit SQL
butonu ile nesne
oluşturma scripti
üstünde değişiklik
yapabilirsiniz.
5.
Şekil A.13:
Elde edilen veri
aktarımı planı için
son ayarlamaları
yapın.
Şekil A.14:
Veri aktarımı
işlemi özet ekranı.
Her şeyin yolunda
olduğunu kontrol
edin ve Finish
butonunu tıklayın.
Hemen çalıştırmak için Execute Immediately seçeneğini kullanın. Paket oluşturup daha
sonra da bu veri taşıma işlemini kullanacaksanız, SSIS paketi olarak sakla seçeneğini
uygun saklama ortamını ve hassas verilerin saklanması ile ilgili önlemleri ayarlayın.
660
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
6.
Bir sonuç ekranı ile size kaç tablonun aktarıldığı gösterilecektir.
SQL Server'den başka bir formata veri aktarmak için de yapılması gereken işlemler aynıdır. Değişen tek şey hedef ile kaynak türlerinin değişmesinden ibarettir.
Şekil A.15:
İşlemlerin çalıştırılmasını raporlayan sonuç ekranı.
İpucu: SSIS'i programlamak ve dağıtık veri kaynaklarınız arasında dönüşüm, aktarım işlemlerinizde daha
fazla kullanabilmek için http://msdn.microsoft.com/sql/bi/integration/ adresine göz atabilirsiniz.
Replication
Replication, aynı anda birbiri ile bağlantılı ve her biri veri üretebilen siteler (birimler) arasında anlık olarak verilerin aktarılması için sağlanmış bir VTYS özelliğidir. Bu özelliğin kurgulanması ve gerçeklenmesi, daha çok veritabanı yönetimi konuları arasında yer almakta.
Replication ile canlı olarak veri aktarım işlemleri sadece SQL Server-SQL Server arasında olmak durumunda değildir. SQL Server, heterojen replicaiton'a destek sağlar. Gerektiğinde, bir MS Access, Oracle, Sybase gibi sunucularla da verileri uygulama çalışır durumda iken bir birimden başka bir birime aktarabilir.
Replication ile verilerin bir birimden başka bir birime dağıtılması iki temel terime dayalıdır;
publication (yayın) ve subscription (abonelik). Aslında bu iki kavram, günlük hayatta bir dergi ve
bu dergiye abone olmak şeklinde düşünüldüğünde hiç de yanlış bir model kurgulanmış olmaz.
Bir publication, günlük hayatta dergide olduğu gibi, article (makale)'lerden oluşur. Her bir makale, bir tablo aktarım tanımı olarak ele alınabilir. Publication'ın diğer sunuculara iletilebilmesi
için, publication yapan sunucu (primary side-birincil taraf)'a diğer sunucuların abone olması gerekir. Bu işleme de subscription denir. Ancak abonelik günlük hayattaki ile biraz farklıdır. Bir
abonelik sadece bir tek makale için olabileceği gibi, yayındaki bütün makalelere de olabilir.
Publication'ın üstünde tanımlı olduğu sunucuya publisher (yayıncı) denir. Bu yayınlara
abone olan sunuculara ise subscriber (abone) denir.
Distributor (dağıtıcı) Bir sunucudur. Bu sunucu, veri geçmişini ve transaction'ları tutar.
tercih edilen replication yöntemine göre, publisher veya subscriber üstünde de
yeralabilir. Bu verileri subscriber'lere dağıtır.
Ek A: Veritabanı Programcılarına İpuçları
661
SQL Server, publisher, subscriber ve distributor'n durumuna göre 4 temel replication
mimarisine destek verir. Bunlardan üç tanesinde, distributor için bir ayrı sunucu kullanılmazken, ağ hızının düşük olması veya maliyetinin yüksek olması halinde, maliyeti
azaltmak üzere, tek publisher ile birlikte ayrık distributor kullanılabilir.
¾
Central Publisher, multiple Subscribers
¾
Multiple Publishers, multiple Subscribers
¾
Multiple Publishers, single Subscriber
¾
Single Publisher, remote Distributor
İpucu: Master, tempdb, Model, msdb gibi Sistem veritabanları ve syslogins, sysobject... vs sistem
nesneleri replication tarafından aktarılamaz.
SQL Server, 3 temel Replication Metoduna Destek verir:
1.
Snapshot Replication: Birincil taraftaki verileri belli peryotla alır ve ikincil taraftaki
verilerin üstüne yazar. Bir birincil anahtar sütuna gereksinim duymaz. Default olarak, Mssql\Repldata dizininde yer alan veriler, gereksinim olduğunda CD gibi offline ortamda da ilgili sitelere aktarılabilir.
2.
Transactional Replication: En başta bir snapshot alınarak başlatılır. Çok az bir gecikme ile değişimler diğer sitelere dağıtılabilir. Değişikliklerin eşzamanlı olması ihtiyacı için iyi bir yaklaşımdır.
3.
Merge Replication: Verilerin aynı anda iki sunucuda değiştirilmesine müsaade edebilen bir yaklaşımdır. Herhangi bir sunucuda yapılan değişiklik, diğer tarafa yansıtılabilir. Her iki kaynakta da değiştirildiği için çakışan kayıtlar için standart veya değiştirilebilir çözümler önerebilir. Özellikle bağlantının nitelikli olmadığı mobil cihazlar için tercih edilebilir.
SQL Server 2000 veya 2005 Veritabanını SQL Server 2008'e Aktarmak Hakkında
Konu burada fikir vermek maksatlı, küçük veritabanları için nasıl yapılabileceğini anlatmak
üzere ele alınmıştır. Daha büyük ve kritik uygulamalarda, verilerinizin yanı sıra bütün bir sistemin upgrade edilmesi gerektiğinde çok daha karmaşık bir süreç ortaya çıkmakta. Bu türden
bir süreci nasıl ele alabileceğiniz ve planlayabileceğiniz konusunda ayrıntılı bilgiyi,
www.microsoft.com/sql adresinde "SQL Server 2008 Upgrade Technical Reference Guide"
aratarak bulabileceğiniz SQL2008UpgradeTechnicalReferenceGuide.docx adlı dokümanda bulabilirsiniz. Ayrıca CD içerisinde bu dokümanın bir PDF kopyası yer almaktadır. Burada
anlatılanlar, bu dokümanın bir özeti olarak derlenmiştir.
Aktarım Seçenekleri
SQL Server 200 veya 2005'de kurulu Bir sistemi SQL Server 2008'e aktarmak için iki
farklı temel strateji mevcuttur:
¾
Yan Yana Aktarım(Side-by-side Upgrade)
662
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Bu türden bir aktarımda, eski sürümün yanına yeni bir SQL Server 2005 instance'i kurularak, eski sistemin varlığını devam ettirmesinin yanında yeni bir veritabanı yönetim sistemi üstünden devam edilebilir hale getirebilirsiniz.
¾
Yerinde Aktarım(In-Place Upgrade)
Bu türden bir aktarımda, eski sürümün çalıştığı yere doğrudan SQL Server 2005'i kurabilirsiniz. Ancak eski sistem tamamıyla yok olduğu için sadece yeni sistemi devam ettirebilirsiniz.
Tablo A.2:
SQL Server
2000/2005'ten
2008 sürümüne
geçiş için yerinde
ve yan yana
aktarım stratejilere
bağlı karakteristiklerin karşılaştırılması.
Karakteristik
Yerinde Aktarım
Yan Yana Aktarım
Sonuç SQL kurulum (instance)
sayısı
Sadece bir adet
İki adet (eski ve yeni
instace)
Gerekli server sayısı
Bir adet
Bir veya daha fazla
Veri Dosyası Transferi (mdf, ldf…)
Otomatik
El ile
Sunucu SQL instance ayarlaması
Otomatik
El ile
Destek Araçları
SQL Server
Farklı aktarım ve veri transKurulum Programı fer metodları
Her iki temel stratejinin de kendine göre avantaj ve zaafları olsa da yan yana aktarım yerinde
aktarıma göre genellikle tercih edilir. Yerinde aktarımı sadece test temelli veya çok küçük,
kritikliği bulunmayan uygulamalarda, daha az kaynak kullanımı için tercih edebilirsiniz.
Ayrıca, 32 Bit SQL Server sürümlerinden 64 Bit SQL Sürümlerine geçiş gibi komplike parametrelere bağlı aktarım seçeneklerini yukarıda bahsi geçen dokümanda bulabilirsiniz.
Upgrade etmeniz gereken şey, sadece veritabanı ise bunun için pratik olarak birkaç yöntemden birini tercih edebilirsiniz.
¾
Eski server'in üstünde direk SQL Server 2008 kurarak upgrade edebilirsiniz. Bu durumda
gerekli dosya dönüşüm işlemlerini SQL Server yapar ancak eski sisteme dönme ihtimaliniz
varsa, SQL Server 2008'i yeni bir instance olarak kurmanızda fayda olabilir.
¾
SQL Server 2000-2005'te aldığınız bir yedeği SQL Server 2008'de restore edebilirsiniz.
¾
SQL Server 2000-2005'teki mdf ve ldf dosyalarını deattach edip, SQL Server
2008'e getirip attach edebilirsiniz.
İpucu: Bu durumda SQL Server 2008 otomatik olarak dosyaların dönüşümünü yapacaktır. Ancak bu
türden bir veri dönüşümünden sonra veritabanınızın uyumluluk seviyesi (Compability Level) 80
veya 90(SQL Server 2005 ise) olacaktır. Yani 8.0 ile eşdeğer özellikleri kullanabilirsiniz.
SQL Server 2008'e has özellikleri kullanabilmeniz için, uyumluluk seviyesini 10.0 sürüm eşdeğeri olan 100'e getirmeniz gerekir.
Dikkat: Bu tür bir upgrade'de dosyaları tekrardan eski sürüme attach edemezsiniz!
¾
Eski sunucu dururken yeni bir SQL Server 2008 kurup verilerinizi SSIS ile aktarabilirsiniz. Ancak bunu yaparken çok fazla önlem almanız gerekebilir.
Ek A: Veritabanı Programcılarına İpuçları
663
Basit bir Attach- Deattach işlemi için Adım Adım Upgrade şu şekilde olabilir
1.
SQL Server 2008'i kurun
2.
SQL Server 2000-2005'deki veritabanı dosyalarınızı kopyayabilmek için öncelikle
ilgili veritabanı dosyalarının hangi yolda olduğunu öğrenin. Enterprise manager'den
veritabanını sağ tıklayıp doyalar sekmesinden bunu görebilirsiniz.
3.
İlgili veritabanını deattach edin.
4.
Belirlediğiniz veritabanına ait dosyalarınızı SQL Server 2008'in data dosyalarının
bulunduğu dizine kopyalayıp yapıştırın.
5.
SQL Server 2008'den ilgili dosyaları attach edin.
6.
Arkasından yeni veritabanında aşağıdaki düzenlemeleri yapın:
a.
SQL Server 2000-2005'deki veritabanında geçerli bir uygulama kullanıcısı varsaydı,
bunu SQL Server 2008 dosyasında da göreceksiniz. İlgili veritabanı kullanıcısını silin
b.
SQL Server 2008'de uygulama erişimi için gerekli sunucu seviyeli login bilgisini tanımlayın
c.
Arkasından bu login bilgisinin taşınan veritabanına erişecek kullanıcısını oluşturun
ve yeteri kadar hak verin.
d.
SQL Server 2008'e aktardığınız veritabanının uyumluluk seviyesini Management
Studio'dan veritabanını sağ tıklayarak, veritabanı özelliklerinden gerekli seviyeye
getirin. Geri dönüş yapma ihtimaliniz varsa 80 uyumlulukta kalabilir ama kesin olarak SQL Server 2008 kullanacaksanız 100 yapmanız daha avantajlı olacaktır.
GÜVENLİK VE YETKİLENDİRME HAKKINDA
Kitabın konusu, güvenlik'ten uzak olsa da bir programcı olarak, güvenliğe ihtiyacı olan
hassas bir proje üstünde çalışıyorsanız, size SQL Server için alınabilecek güvenlik önlemleri hakkında fikir vermesi açısından, bu bölüm hazırlanmıştır.
Genel Güvenlik Önlemleri
Microsoft tarafından yerine getirilmesinde fayda görülen 10 güvenlik önlemi burada özet
olarak ele alınmıştır: Her bir önlem hakkındaki ayrıntılı ve açıklayıcı bilgiyi,
www.microsoft.com/sql adresinden edinebilirsiniz.
1.
En güncel Service Pack'leri takip edip kurulumunu yapın.
2.
Sisteminizi ücretsiz olan MBSA kullanarak açıklara karşı denetleyin.
3.
Windows Authentication Mode'u kullanın.
4.
SQL Server'inizi izole edin ve düzenli olarak yedek almayı ihmal etmeyin
5.
Güçlü bir sa şifresi kullanın.
6.
SQL Server Service'lerinin ayrıcalık seviyesine sınırlama getirin
7.
Firewall'ınız varsa, SQL Server'e ait portları dışarıdan erişime kapatın. TCP port
1433 ve UDP port 1434 SQL Server tarafından kullanılmaktadır.
664
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
8.
NTFS gibi güçlü dosya sistemlerini tercih edin.
9.
Kurulum parametreleri veya eski setup dosyalarını silmeyi ihmal etmeyin.
10. SQL Server'e erişen uygulamalarınızı ve kullanıcılarınızı denetleyin.
11. Veritabanı tasarımı yaparken, şemaları ve şema bazlı yetkilendirmeyi kullanın.
Hassas Bir Uygulama için Veritabanı Güvenlik Kontrol Listesi
1.
Asla yazdığınız kodun güvenli olduğuna kendinizi inandırmayın. Unutmayın ki her
geçen gün yeni saldırı teknikleri gelişmektedir. Uygulamanızdaki güvenlik açıklarının başkalarından duymanız, sizin açınızdan çok daha acı neticeler doğurabilir.
2.
Uygulamanızın veri yazma ve veri okuma işlemleri için stored prosedürler dışında veritabanına erişmediğinden emin olun. Asla Ad-Hoc sorgu olarak kullanılmak üzere,
uygulamaya T-SQL kodları gömmeyin. Bu güvenliğin yanı sıra uygulamanızın sorgu
süresini de kısaltma, karmaşıklaştırma gibi dezavantajları da beraberinde getirir.
Stored Procedure'leriniz içerisinde EXEC deyimi ile dışarıdan parametre ile alınan statik
SQL ifadeleri çalıştırmaktan kaçının.
Stored Procedure'leri, Transact-SQL kullanarak doğrudan çalıştırmak yerine, ADO veya
ADO.NET'in sağladığı bir ara nesne kullanarak parametre aktarın (command nesnesi).
3.
sa kullanıcı adını sadece veritabanı ayarları ve nesne oluşturma işlemleri için SQL
Server'in kendi istemci programları (Enterprise Manager, Query Analyzer, osql vs.)
ile bağlanırken kullanın. Uygulamalarınızın veritabanına erişmesi için asla kullanmayın. sa kullanıcısının, boş veya kolay bir şifreye sahip olmadığından emin olun.
4.
SQL Server üstünde mümkün olduğunca az hesap bulundurun. Unutmayın kullanıcı arttıkça erişim denetimi de zorlaşır. Gereksiz hesaplar varsa silin. Her bir hesabın, gerekenden daha fazla haklara sahip olmadığından emin olun.
5.
Uygulamalarınızın bir standart kullanıcı ile SQL Server'e erişmesi gerekiyorsa, uygulamaya özgü bir kullanıcı oluşturun. Bu kullanıcıya verilen haklarının asgari seviyede olduğundan emin olun hatta 1. adımı uyguladınız ise, sadece stored prosedürlere erişim
izni verin, asla tablolara doğrudan erişim izni vermeyin. Kullanıcıyı, SQL Server kullanıcısı ya da yerel sistem kullanıcısı olarak tanımlamak yerine domain kullanıcısı olarak tanımlayın. Kullanıcıyı bütünleşik (Entegrated) kullanıcı olarak yetkilendirin.
6.
SQL Server makinesi ile Uygulama sunucusu arasında IPSec tanımlaması yaparak
başka makinelerden aynı hesabın SQL Server'e bağlanmasını kısıtlayabilirsiniz. Gereksiz bağlı sunucu varsa, kaldırın.
7.
Uygulamanın Veritabanına erişimi için bir bağlantı ifadesi kullanıyorsanız, mutlaka
şifreli olarak saklayın. Bunun için Windows Registry'i kullanabilirsiniz. DPAPI gibi
arayüzler, şifreleme için tercih edilebilir güvenlik seviyesi sunmaktadır.
8.
Uygulamanızı kullanacaklar, sadece dostlarınız değildir. Uygulamanızdan gelen ifadeleri doğrudan SQL ifadenize ekleyip SQL ifadenizi çalıştırmaktan kaçının. SQL
Server'e kaydedilmek üzere kullanıcıdan aldığınız veriler için gereğinden uzun girdi
kabul etmeyen yapılar kullanın. Tablo tasarımlarında ve procedure, fonksiyon ve
değişken tanımlamalarında alan uzunluklarını gereğinden fazla uzun tutmayın. Kul-
Ek A: Veritabanı Programcılarına İpuçları
665
lanıcıdan gelen bilgilerde kötü niyetli ifadeler olup olmadığını kontrol etmek üzere
bir yaklaşım geliştirin. Bu konuda, maruz kalabileceğiniz saldırılar ve yaklaşımlar
hakkındaki geniş bilgi, "SQL Enjeksiyonu Karşı Önlemleri" başlığı altında ele alınmıştır. Uygulama geliştirirken, bu türden saldırıları aklınızdan çıkarmayın.
9.
Güvenlik yönünden güçlü bir uygulamanın nasıl geliştirildiği hakkında e-week tarafından
düzenlenen
yarışmalar
ve
edinilen
tecrübeler
hakkında,
http://www.eweek.com adresinden "OpenHack" kelimesini aratarak bilgi alabilirsiniz.
10. Güncel saldırı ve korunma yöntemleri
www.sqlsecurity.com adresini takip edebilirsiniz.
hakkında
bilgi
almak
için
SQL Enjeksiyonu ve Karşı Önlemler
Kullanıcıdan gelen değerleri, doğrudan SQL ifadesine dahil edip sorguyu çalıştırmak, kötü niyetli kullanıcıların sisteme zarar vermesi için bulunmaz fırsattır. Basit bir parametrik
değer beklediğimiz yerden, zararlı bir SQL ifadesi gelebilir. Burada, bu türden yaklaşımların neler olduğunu ve bu yaklaşımlara nasıl karşı koyabileceğimizi ele alacağız.
Tektırnak Saldırılar
tblKullanici tablosunda yer alan kullaniciAd, yetkiSeviye ve sifre sütunlarını kullanarak,
yetkilendirme yaptığımızı varsayalım. Bu sütunlar için, dışarıdan gelen kullanıcı ad ve şifre değerlini alıp, veritabanındakilerle eşit olup olmadığını karşılaştırdığımızı varsayıyoruz.
Şöyle bir SQL ifadesi kullanmamız gerekir:
SELECT kullaniciKod,kullaniciAd, yetkiSeviye
FROM tblKullanici
WHERE kullaniciAd='volkanverim@verivizyon.com' and sifre=0xffaa
Burada, 'volkanverim@verivizyon.com' ve 0xffaa değerleri kullanıcı tarafından girilmesi
beklenen değerlerdir. Bizim sitemize gelen bütün ziyaretçiler, sadece siteye giriş yapmayı
düşünmeyebilirler. Örneğin, kullaniciAd='volkan' OR 1=1 OR 1='' şeklinde bir değer girilirse nasıl bir ifade ortaya çıkar?
SELECT kullaniciKod,kullaniciAd, yetkiSeviye
FROM tblKullanici
WHERE kullaniciAd='volkan' OR 1=1 OR 1='' and sifre=0xffaa
Bu sorgu, şifre ve kullanıcı adı doğru olsun veya olmasın her zaman kullanıcı adı, şifre ve
yetki seviyesi bilgilerinden ilk kayda ait olanları kullanarak yetkilendirme yapacaktır.
Çünkü, OR 1=1 her zaman doğrudur ve diğer bütün şartlar yanlış olsa bile, tüm kayıtları
seçmek için yeterlidir (bkz. örnek 6.11)
Bu durumda, şansımız varsa, en başta yer alan kullanıcımızın, sitedeki haklarının kısıtlı
olması hali ortaya çıkar ve sadece bir kişi zarar görür.
Çözüm olarak, tektırnak(') geçen ifadeleri temizlemek ilk akla gelen yöntemdir. Ancak
bunun tam olarak yeterli olmadığını, sadece başlangıç seviyesindeki saldırıları kesebileceğini ilerleyen kısımlarda ele alacağız.
666
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Tek tırnakların temizlendiğini varsayalım. Bunun için, basit bir fonksiyon VBScript ile şu
şekilde yazılabilir:
Function saldiriOnle(sSQL)
sSQL=replace(sSQL,"'","''")
' tek tırnakları kabul etme
sSQL=replace(sSQL,"--","")
' açıklama satırlarını kaldırarak
' saldırıları engelleyelim
sSQL=replace(sSQL,";","")
' ; ifadelerini kaldıralım.
End function
Tablo A.3:
bazı ASCII kodları
ve sembol karşılıkları
ASCII Kod
Değer
32
boşluk
39
'
45
-
49
1
61
=
79
O
82
R
Bu durumda, kötü niyetli kişi şöyle bir ifade girebilir: kullaniciAd='CHAR(49)
+CHR(39)+CHR(32)+CHR(39)+CHR(79)+CHR(82)+CHR(32)+CHR(49)+CH
R(61)+CHR(49)+ CHR(45)+CHR(45)'
Şekil A.16:
Yukarıdaki ifadenin neticesini görmek isterseniz, resimdeki ifadeyi çalıştırabilirsiniz (1'
OR 1=1-- ifadesi
elde edilmiştir.)
Bu durumda, yukarıdaki saldırı önleyici fonksiyonda bazı düzeltmeler yapılarak kurtulmak mümkündür. Örneğin, + işaretini kullanıcıdan kabul etmeyebilirsiniz. Ya da CHR
değerini boşlukla filtreletebilirsiniz vb. gibi.
Hata Verdirmeye Dayalı Saldırılar
Bir sayısal sütun varsa, hata verdirmek oldukça kolaydır. SQL enjeksiyonunda en önemli
saldırı yöntemlerinden biri de sisteme hata verdirmektir. Hata mesajları, genellikle tablo
adı, sütun adı, prosedür adı, parametre adı ve tipi hakkında fikir edinilmesine yardımcı
olur. Öte yandan, UNION ve HAVING gibi cümleciklerle, sayısal ve metin veriler bir
sütunda ele aldırılmaya çalışıldığında hata mesajları sayesinde, tabloda yer alan verilere
de erişmek mümkün olur. Bu nedenle, hata mesajlarınızı mümkünse kullanıcılardan gizlemeniz önerilir. Bu saldırganı durduramasa da yavaşlatacak bir yöntemdir.
Ancak hata mesajlarını gizlemek saldırılara karşı %100 güvenli bir yol değildir. Çünkü
WAITFOR deyimi, SQL Server'in sorguyu çalıştırmadan önce, belli bir süre susmasını sağ-
Ek A: Veritabanı Programcılarına İpuçları
667
layan bir operatör olduğundan, saldırgan denemelerini doğrulatmak üzere belli bir süre
SQL Server'i bekletme yöntemini tercih edebilmektedir. SQL Server şayet beklerse, Web
Server da ondan gelen yanıtı bekleyeceği için geç yanıt verecektir. Bu ipucunu değerlendirerek, saldırgan WAITFOR ile AND'lediği ifadenin doğru olup olmadığını anlayabilir.
Burada, çok zararlı olmayan ama bu durum geçerli ise, saldırganın ağzını sulandıracak bir
teknik ile örnek verelim: Saldırgan, bizim sitemizde kullandığımız uygulama hesabının sa
ile bağlanıp bağlanmadığını merak ediyor olsun:
IF SUSER_SNAME()='sa' WAITFOR DELAY '0:0:7'
Bu ifade, hiçbir sonuç döndürmez. Sadece verilen eşitlik doğru ise, SQL Server 7 saniye
bekler. Bu ifade bir batch'in içerisinde ise (ki Enjeksiyon bu demek), bütün batch tamamlanana kadar, SQL Server Web Server'e veri yollamaz.
Şayet uygulama, webuser gibi bir kullanıcı ile bağlandırılmıyor da sa ile bağlanıyorsa,
Web borwser sayfayı normalden 7 saniye daha geç yükleyecektir. Aksi halde hiçbir süre
farkı oluşmayacaktır.
Dikkat: Yeterli zamanı olan bir saldırgan, WAITFOR DELAY ... ile birçok bilgiyi sisteme teyid ettirebilir.
Stored Procedure Kullanan Saldırılar
Stored Procedure kullanılması, tek başında SQL Enjeksiyonundan korunmak için yeterli
değildir. Özellikle, içerisinde EXEC deyimini kullanarak statik olarak SQL ifadeleri çalıştıran stored procedure'ler, sistemin güvenliği açısından ciddi tehlikeler doğurabilir. Çünkü bu türden bir stored procedure de sql enjeksiyonuna maruz kalabilir.
Örneğin, bu türden basit bir sistem stored procedure'üne gözatalım. Bu procedure normal ayarlarda public rolü için erişilebilirdir.
CREATE PROCEDURE sp_MSdropretry (@tname sysname, @pname sysname)
as
declare @retcode int
/*
** To public
*/
exec ('drop table ' + @tname)
if @@ERROR <> 0 return(1)
exec ('drop procedure ' + @pname)
if @@ERROR <> 0 return(1)
return (0)
Bu procedure'e erişim hakkı elde eden saldırgan, kötü niyetleri için kullanabilir.
Dikkat: Bu derece tehlikeli bir sistem stored procedure'ü olan sp_MSdropretry default ayarlarda,
public rolü için erişilebilirdir.
668
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Stored procedure'ler bir güvenlik unsuru olarak kullanılıyorsa, mutlaka API'lerin ilgili nesne
ya da fonksiyonları kullanılarak parametre aktarımı yapılmalıdır. Doğrudan Transact-SQL
ifadesi olarak çağrılan stored procedure'ler de sistem güvenliği açısından tehlikelidir.
Bu konuya çözüm olarak nasıl yaklaşılacağı, ADO ve ADO.NET ile stored procedure
çalıştırma bahsinde ele alınmıştır.
Genel SQL Enjeksiyon'larından Korunma Tedbirleri
SQL Enjeksiyonundan korunmak için kabul görmüş, üç temel yaklaşım vardır. Sizin için
en uygun olanına kendiniz karar verebilirsiniz.
Sadece İyileri Kabul Etmek
En yüksek seviyede korunma için bu yöntemi tercih edebilirsiniz. Ancak, kullanıcılarınızla etkileşiminizde çeşitli kısıtlamalar yansıyacaktır.
Kullanıcının sadece "abcçdefgğhıijklmnoöpqrsştuüwxvyz1234567890
@_/[]()" şeklinde belli bir alfabe ile kısıtlayabilir, dışındaki değerler kabul etmeyebilirsiniz. Bazı bankalarımız güvenlikte bu yöntemi tercih etmektedir.
Bu yöntemi gerçeklemek için, kullanıcıdan gelen girdi ifadeyi bir string değişkene atıp,
her seferinde sadece bir tane karakter alarak, bu harfin yukarıdaki değerler arasında yer
alıp alınmadığına bakılır. Bütün karakter bu alfabeden geliyorsa, kullanıcı girdisi zararsız
kabul edilir. Aksi halde, istek yanıtlanmadan sona erdirilebilir (ASP için
Response.End()) veya başka bir kaynağa yönlendirilebilir (ASP için
Response.Redirect()).
Kötüleri Reddetmek
Bu yaklaşım da güvenli kabul edilebilir. Ancak bazı durumlarda, kullanıcı hatasının nedenini anlamayabilir.
İçerisinde, "SELECT", "INSERT", "UPDATE","DELETE","DROP","
","CHAR (" gibi ifadeler geçen kullanıcı girdileri varsa kabul edilmeyebilir.
OR
Bu yöntemi gerçeklemek için, kötü olduğu varsayılan ifadeler bir diziye atıldıktan sonra,
bu dizideki her bir ifade için kullanıcı girdisi kontrol edilebilir. İçerisinde bu ifade geçen
bir kullanıcı girdisi olması halinde, istek yanıtlanmadan sona erdirilebilir veya başka bir
kaynağa yönlendirilebilir.
Kötüleri Filitreleyerek Kabul Etmek
En basit korunma yaklaşımıdır.
Yukarıdaki ifadelerle birlikte, "--", ";", "'" gibi işaret ve ifadeleri (Replace
fonksiyonu gibi br fonksiyon yardımıyla) filtreleme yaptıktan sonra, bütün girdileri kabul
etmek bir yaklaşım olarak kullanılabilir.
Burada anlatılanlar, bir çok seminerde bir çok kişiye aktarılmış başlangıç seviyesindeki
teknikler olup hemen her sistemin maruz kalabileceği cinstendir. Bir saldırgan, SQL
Server'i ele geçirdikten sonra, üstünde kurulu olduğu bilgisayarın işletim sistemini, bütün
ağı ele geçirmesi işten bile değildir. Bu nedenle, SQL Server düştükten sonra saldırganın
daha fazla zarar vermesini engelleyecek önlemler almak akıllıca olur ki bunlar, kitabın
konusunu aşmaktadır.
EK B
C# VE OOP KILAVUZU
Bu kısım, T-SQL'i bir programlama dili olarak bilenler için C# diline hızlı bir başlangıç maksatlı eklenmiştir. Ünitenin sonlarına doğru nesneye dayalı programlamanın genel bir özetini ve takip eden sayfalarda da 3N katman mimarisi için örnek bir uygulama bulabilirsiniz.
C# İLE PROGRAMLAMAYA GİRİŞ KILAVUZU
Bu bölüm, daha önceden herhangi bir dilde (ki buraya kadar okudunuzsa en azından TSQL diye bir dili kullanmayı biliyor olmalısınız) kodlar yazmış ama C# ile henüz tanışmamış programcılar için hızlı bir başlangıç kılavuzu olarak hazırlanmıştır.
Bu bölüm C# dili gibi geniş bir kavramın sadece kitap içeriğindeki program parçacıklarını kodlayabilecek kadarını kapsamaktadır. Kitap içeriği C#'ı sadece yönetilmiş olarak
(.NET Framework dahilinde) ele almaktadır.
C# ile dört farklı çalışabilir program yazılabilir: Komut satırı uygulaması, ASP.NET uygulaması Windows Formları Uygulaması. ve WPF uygulamaları Bunun dışında, C# ile
.Net platformu için kendiliğinden çalışamayacak ama bir başka program tarafından yüklenebilecek programlar (dll uzantılı assembly'ler) kodlamak mümkündür. SQL Server
içerisindeki CLR bileşeni bu türden kodları çalıştırabilen ortamlardan biridir.
C# ile Merhaba Dünya
CLR ortamı, C# dili ile de programlanabilen bir yönetilmiş (managed) ortamdır.
Managed ortam, sistem kaynaklarını programcı yerine kontrol eden ortam demektir.
.NET CLR ortamını kullanarak çalışacak en basit komut satırı C# programı aşağıdaki
şekilde kodlanabilir:
using System;
public class MerhabaCSharp{
public static void Main(){
Console.WriteLine("Merhaba C#");
}
}
İlk örneği yazıp derleyip çalıştırabilmek, bir dili öğrenmenin yarısıdır denir. İlk C# örneğinizi test etmek için, Visual Studio.NET ile bir komut satırı uygulaması başlatabileceğiniz gibi, .NET Framework SDK kurulumuyla birlikte gelen csc.exe C# derleyicisini kullanabilirsiniz.
670
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Şekil B.1:
MerhabaCsharp
projesinin başlatılması
Şekil B.2:
İlk C# programının çalıştırılması.
Bir dili güçlü kılan noktalardan biri de kendisi ile birlikte gelen hazır kütüphanenin genişliğidir. Çünkü bu kütüphane sayesinde programcı daha az kod yazarak daha fazla iş
çıkartabilir. Bu şekilde bir dil ile gelen hazır kütüphaneye temel kütüphane (base library)
denir. C#, .NET Framework ile gelen C# kütüphanesini temel kütüphane olarak kullanır.
Bir dil ile programlar geliştirirken, dil içerisinde yer alan sınıfların hiyerarşik olarak düzenlenmesi gerekebilir. Bu tür durumlar için C# isim uzayı (namespace) deyimini destekler. Mesela System.Data isim uzayı içerisinde veri yönetimi ile ilgili sınıflar yer alır.
Bir sistem kütüphanesini, sadece kod yazarken kendi programımızın parçasıymış gibi kullanabilmek için, using deyimi ile ihtiyaç duyduğumuz kütüphaneyi içeren isim uzayına
atıfta bulunmak yeterlidir.
C# nesneye dayalı bir dildir. Bu nedenle, C# içerisinde yazılan bütün programların bir
tür içerisinde bulunması zorunluluktur. Bizim örneğimizde bu nedenle MerhabaCSharp
sınıfı yer almakta.
Sınıflar Yazmak
Bir sınıfın dışarıdan bakıldığında iki temel türden elemanı olabilir: alan ve metot. Alan,
bir değer atanabilen ve değeri okunabilen sınıf bileşenidir. Sınıf içerisinde fonksiyonellikleri yerine getirecek bileşene de metot denir. Nesneye dayalı programlamada metot, bir
sınıf içerisinde yazılmış stored procedure'ler gibi düşünülebilir.
Özellikler için örnek vermek gerekirse, bir nesnenin Boy, En, Renk gibi parametrik değerler alacak bileşenleridir.
Ek B: C# ve OOP Kılavuzu
671
Metodlar bir işlevi yerine getirirler. Yazdır, Topla, Çarp, Çıkart, Birlestir… gibi
C#'da bir programın çalıştırılabilir olması için bir sınıfının Main() adlı metodu olması
gerekir. Yukarıdaki örnekte bu türden bir metot yer almaktadır.
Örnek 1:
En basit olarak marka bilgilerini saklayacak bir Class şu şekilde tanımlanabilir:
//Marka.cs
public class Marka{
public int markaKod;
public string markaAd;
public MarkaBilgileriniYaz(){
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
markaKod, markaAd);
}
}
Örneğimizde, markaKod ve markaAd birer özellik iken MarkaBilgileriniYaz() bir
metoddur.
Yazmış olduğunuz sınıflar Int gibi yeni bir türdür. Bu türlerde değişkenler tanımlayabilirsiniz. Herhangi bir sınıf türünden tanımlanan değişkene nesne denir.
İpucu: C#'da açıklama tek satır eklemek için // ve çok satır açıklama eklemek çin /*…..*/ işaretlerini
kullanabilirsiniz. Bloklar tanımlamak için {} şeklinde açılır kapanır kıvırcıklar kullanılır.
Örnek 2:
Çalıştırabildiğimiz ilk nesne içeren örneğimizi şu şekilde değiştirelim:
using System;
public class MerhabaCSharp{
public static void Main()
{
Marka yeniMarka = new Marka();
yeniMarka.markaKod=500;
yeniMarka.markaAd="Verivizyon";
yeniMarka.MarkaBilgileriniYaz();
}
}
public class Marka{
public int markaKod;
public string markaAd;
public void MarkaBilgileriniYaz(){
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
markaKod,
markaAd);
}
}
672
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Örneğimizde, Marka sınıfının özelliklerinin ve metodunun kullanılmasını görebilirsiniz.
Şekil B.3:
Marka sınıfının
kullanılması
Değişkenler Değerler ve Veri Tipleri
Sınıflarda özellik tanımlarken ve kod yazarken, değişkenler kullanılır. Değişkenlerin ne amaçla
kullanıdlığını T-SQL ile Programlamak adlı bölümde öğrenmiştik; kendilerine aktarılan değeri
tutup kendi adı ile bu değere erişim tanımlamak. Değişkenin adı değişmez ama değerine her
zaman atama yapılabilir. T-SQL'de olduğu gibi, C# için de değişkenlerin tipi vardır.
C#'ta veri tipleri iki farklı grupta ele alınır: Değer tipler ve Referans tipler.
Değer tiplerin değerleri de kendileri ile birlikte Stack denilen bölgede tutulur. Bu bölge
hızlı erişim sağlar ancak, bu bölgede saklanacak bir tipin ne kadar alan gerektirdiğini tam
olarak bilmek gerekir.
Tablo B.1:
C#'da yer alan
değer tipleri
Değişken Türü
Açıklama
sbyte
8-bit işaretli tam sayı
short
16-bit işaretli tam sayı
int
32-bit işaretli tam sayı
long
64-bit işaretli tam sayı
byte
8-bit işaretsiz tam sayı
ushort
16-bit işaretsiz tam sayı
uint
32- bit işaretsiz tam sayı
ulong
64-bit işaretsiz tam sayı
float
Tek duyarlıklı kayan noktalı sayı (yaklaşık değer ondalık)
double
Çift duyarlıklı kayan noktalı sayı (daha büyük yaklaşık değer ondalık)
char
2-bytelık Unicode temelli tek harf saklayabilen değişken
decimal
28 basamak duyarlıklı kesin değer kaydedebilen ondalık sayı.
bool
true veya false değeri alabilir.
Değer tipli bir değişkene doğrudan değer ataması yapılabilir.
Örnek 3:
a değişkenine a=0 değeri atanabilir.
int a;
a=0;
Ek B: C# ve OOP Kılavuzu
673
Dikkat: C#'da bir değişken, ilk olarak değer atanmadan, başka bir işlemde kullanılamaz, sadece tanımlanabilir.
Referans tipler, sınıf gibi boyutu her atamada farklı değerler alabilecek tipler için idealdir. Referans tiplere doğrudan atama yapılamaz. Çünkü referans tipler, değerlerini Heap
denilen özel bir bölgede tutarak o bölgedeki değere referans içerirler. new operatörü,
heap bölgesinden yeni bir adres tahsis ederek bu bölgenin adresini, atıfta bulunulan değişkenin değeri ile eşleştirir.
Şekil B.4:
CLR ortamında bir
değer tip değişken
stack bölgesinde
tutulurken, referans tip değişkenin sadece kendisi
stack bölgesinde
tutulur. Değeri
Heap bölgesinde
tutulur ve değişken buraya bir
refarans içerir.
Örnek 4:
yeniMarka adında bir değişkenin stack bölgesinde tanımlanması ve heap bölgesinden
yeni bir adres alınması.
int x, y;
int z=0;
Marka yeniMarka ;
// marka türünde bir değişkeni stack bölgesine at
yeniMarka = new Marka();
// heap bölgesinden bir adresi bu değişkene tahsis et.
Şekil B.5:
Stack ve Heap
bölgelerindeki
değişken ve
değerlerin davranışları
Stack bölgesindeki değikenlere doğrudan null değeri atanabilir veya saha dışına çıkıldığında bu değişkenler silinebilir. Bu tür durumlarda, Heap bölgesindeki ayrılmış alan öksüz kalacaktır. Heap bölgesindeki öksüz alanlar, hafıza limitleri zorlanmaya başlandığında
Garbage Collector adı verilen özel .NET Framework bileşeni tarafından otomatik olarak
temizlenirler. Temizlenme esnasında nesnelerin Finalize() metodları çalıştırılır.
674
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
İpucu: String tipi, C#'ta referans tipli olmasına rağmen, değer tipli gibi davranır. Bunun arka planda
yansıması olarak sık değişen string tipteki veriler fazla hafıza tüketirler. Bu nedenle, fazla değişen
string değişkenler yerine System.Text sınıfı içerisinde yer alan StringBuilder sınıfını kullanabilirsiniz.
String tiplerin başlangıç ve bitişleri "" ile belirtilir. Ancak string ifadenin kendi içerisinde
de bir " geçerse, bu derleyicinin sentaksı anlamasını imkansız kılar. Bu nedenle bazı durumları uç durumlar olarak ele almak gerekir. Bu türden karakterler ve işlevlerini aşağıdaki tabloda bulabilirsiniz.
Tablo B.2:
Uç (escape)
karakter ve karşılıkları.
Uç Karakter
Karşılığı
\'
Tek tırnak
\"
Çift Tırnak
\\
Ters bölü
\0
Null
\a
Alert (bip sesi)
\b
Backspace
\f
form besleme
\n
Alt satır
r
Satır başı
t
Yatay tab (3 karkater boşluk)
v
Düşey tab (3 satır alta geçme)
Uç karakterleri doğrudan bir string ifade içerisinde vermek istiyorsanız string ifadenin
başına@ işareti koymak gerekir.
Örnek 5:
string ucKarakterler = @"\, ' ve \t gibi karakterler
her zaman bir metin
içinde geçmeyebilir"
Tür Dönüşümleri
C# açısından tür dönüşümlerini iki ana başlık altında ele alabiliriz: Bilinçsiz Tür Dönüşümü ve Bilinçli Tür Dönüşümleri.
Bilinçsiz tür dönüşümü, doğrudan bir atama işlemi ile dönüşümün yapılabilmesidir.
Örnek 6:
Bilinçsiz dönüşüm, sadece uygun tiplerden büyük olan küçük olana atandığında yapılabilir.
Ek B: C# ve OOP Kılavuzu
675
int i =0;
sbyte j=1;
i=j; // j sbyte değeri bir int türden değişkene atandığı için
kendiliğinden dönüştü.
Bu türden dönüşümü büyük türün küçük türe atanması halinde problem çıkartacaktır.
Uyumlu tipleri birbirine doğrudan tür belirterek de dönüştürmek mümkündür:
Örnek 7:
int i =5000;
sbyte j=1;
j=(sbyte)i;
// i önce sbyte türüne dönüştürüldü. Arkasından j sbyte tipli
değişkene aktarıldı.
Ancak bu türden dönüşümler yaparken, veri kaybına özellikle dikkat etmek gerekir.
C#'da uyumsuz türleri birbirine dönüştürmek için Convert sınıfını kullanabilirsiniz.
Convert sınıfının hemen her türü bir diğer türe dönüştürecek uygun metodları vardır.
Örnek 8:
String türden, sayı içeren bir değeri Int türüne dönüştürebiliriz.
string sYas="23";
int iYas;
iYas = Convert.ToInt32(sYas);
// veya Int32.Parse(sYas) da eşdeğer bir yöntemdir.
Değer ve Referans Tipler Arası Dönüşüm: Boxing ve Unboxing
Bazen, adres temelli bir değişkeni değer tipli gibi veya tam tersi değer tipli bir değişkeni
adres temelli gibi kullanmak gerekebilir. Mesela bir metot, dışarıdan nesne bekliyordur
ama elimizdeki değer int (Stack değişken)dir veya bir nesne int bekliyordur ama elimizdeki int değeri bir nesnede tutuluyordur.
Değer tipli bir değişkenin adres tipe (Object) çevrilmesine Boxing denir.
Örnek 9:
int x=3;
object o = x; // artık 3 değeri heap'te tutulmuyor
Adres temelli değer taşıyan bir değişkeni, değer türüne döndürmeye de Unboxing denir.
Örnek 10:
int y= (int) o;
Döngüler ve Karar Yapıları
T-SQL'de gördüğümüz döngü ve karar yapılarının çok daha gelişmişleri C# dilinde de
vardır. Kitap içerisindeki örnekleri anlayabilmeniz için, sadece if-else, for ve while yapılarının kullanımını bilmeniz yeterli olacaktır.
676
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
if-else Karar Yapısı
Belli şartlarda çalışacak program parçacıkları oluşturmak için şu şekilde kullanabilirsiniz.
int x=20
if (x == 20)
{
Console.WriteLine("x == 20 imiş");
}
else
{
Console.WriteLine("x != 20 imiş");
}
for Döngü Yapısı
Bazı ifadelerin n kere çalışması gerekiyorsa for yapısı kullanılır.
Örnek 11:
Ekrana 1-20 arasındaki sayıları yazdıracak şekilde bir C# programı şu şekilde yazılabilir:
for (int i = 0; i < 20; i++)
{
System.Console.WriteLine (i);
}
while Yapısı
Bazen, belli şartların hâsıl olması için kaç döngü atılacağı belli olmayan ifadeler olabilir.
Bu tür ifadeleri while yapısı ile şartlar oluşuncaya kadar tekrarlatabiliriz.
int x = 99;
while (x > 36)
{
System.Console.WriteLine(
"Henüz x değeri 36dan büyük.. ");
x--;
}
İpucu: Döngüleri bir defaya mahsus yarıda kesmek için continue ve geri kalan tüm döngüleri bırakıp
döngüyü kesmek için break ifadelerini kullanabilirsiniz.
Nesnelerle Çalışmak
Yazmış olduğunuz sınıflar Int gibi yeni bir türdür. Bu türlerde değişkenler tanımlayabilirsiniz. Herhangi bir sınıf türünden tanımlanan değişkene nesne denir. Programlamada
Nesnel Yaklaşım, günlük hayatta etrafımızdaki araçları kullanmaya bakış açımızı yansıtmak üzere geliştirilmiştir.
¾
Günlük hayatta, belli amaç için kullandığımız her şey nesnedir.
Ek B: C# ve OOP Kılavuzu
¾
677
Program geliştirirken, aslında gerçek dünyadan problemleri modelleriz.
Nesne, "kapalı bir kutudur". Belli bir işlevi yerine getirmek için tasarlanmıştır. Nesneyi
kullanabilmek için girdiler veririz. Nesne işleyişi, bizim değil tasarlayanların bilgisi dahilindedir. Biz iç işeyişini bilmeden ne verdiğimizde ne alacağımızı bilerek kullanırız. Yani
nesne, bilmediğimiz işlemler yapar ve bize bir çıktı verir.
Sınıflarda Erişim Seviyelerini Anlamak
Nesneler sınıflar halinde programlanırlar. Yani nesnelerin tanımları, sınıflarda saklıdır.
Ya da tersten bakacak olursak, bir sınıftan nüsha çıkartıldığında bunun adı nesne olur.
¾
Bir "kapalı kutunun" iç işleyişini problemsiz olarak yerine getirebilmesi, dış dünyadan soyutlanmış olmasına bağlıdır.
Mesela bir cep telefonunu düşünün. Kablolarına erişip kısa devreler yaptırarak da pekâlâ
bir şeyler yaptırabilirsiniz. Ama üretici firması, bu 'kapalı kutu' yani telefon'un işlevini istikrarlı olarak yerine getirebilmesi için, bir çok iç işleyişini bir kılıfın arkasında saklamış
ve bize sadece tutarlı, amaca uygun kullanım girdilerinde bulunabileceğimiz tuşlar tasarlayıp bu tuşlara erişmemize olanak sağlamıştır.
İşte programlama dünyasındaki nesneler de kullanılmadan önce tanımlanırlar. Yani sınıf
halinde kodlanırlar. Sınıf halinde kodlama aşamasında, hangi metotların, hangi özelliklerin dışarıdan erişilebilir olacağı, hangi elemanların sadece iç işleyişle ilgili olduğundan dış
dünyadan erişilemez ve bilinemez olması gerektiğine karar veririz. Bu türden karar verme
işlemini belirleyebileceğimiz anahtar kelimeleri ve işlevlerini aşağıdaki tabloda bulabilirsiniz.
Tablo B.3:
nesnelerin elemanlarına erişimi
belirleyen kelimelerden sık kullanılanları.
Erişim Belirleyici
Kullanım Yeri
İşlevi
public
Sınıf, özellik, metot
Dışarıdan erişilebilir bir eleman belirlemede
kullanılır
private
Sınıf, özellik, metot
Elemanın sadece nesnenin iç işleyişi için gereksinim duyulduğunu, dışarıdan erişilmemsi
gerektiğini anlatır
Örnek 12:
Daha önceki örneklerde şu şekilde kodladığımız marka sınıfında, markaKod ve markaAd
alanlarına doğrudan erişimi kapatalım:
public class Marka{
private int markaKod;
private string markaAd;
private void MarkaBilgileriniYaz(){
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
markaKod,
markaAd);
}
}
678
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Artık şu ifade düzgün olarak çalışamayacaktır:
using System;
public class MerhabaCSharp{
public static void Main()
{
Marka yeniMarka = new Marka();
yeniMarka.markaKod=500;
yeniMarka.markaAd="Verivizyon";
yeniMarka.MarkaBilgileriniYaz();
}
}
Şekil B.6:
Erişim seviyeleri,
sınıf dışarısından,
sınıf elemanlarına
erişimleri belirler.
Çünkü markaKod ve markaAd sütunlarına doğrudan erişim kapatılmıştır.
Bu sınıfın ilgili alanlarına kontrollü bir erişim sağlamak için, property adı verilen yarı
metod-yarı değişken yapılar kullanabiliriz.
Örnek 13:
Nesne değişkenlerine erişimlerini düzenlemek üzere property'leri kullanabilirsiniz.
public class Marka{
private int markaKod;
private string markaAd;
public int MarkaKod
{
get { return markaKod; }
set
{
if (value > 0)
markaKod = value;
}
}
public string MarkaAd
{
get { return markaAd; }
set { markaAd = value; }
}
public void MarkaBilgileriniYaz()
{
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
MarkaKod,MarkaAd);
}
}
Ek B: C# ve OOP Kılavuzu
679
Dikkat edilirse, artık markaKod ve markaAd sütunlarına atanan değerler belli bir kontrole tabi tutulabilecek durumdadır. (mesela markaKod değerinin sıfırdan küçük olmaması gerektiği kontrol edilmekte)
Şekil B.7:
Marka Sınıfı
Bu tür bir sınıf şu şekilde nesneleştirip kullanılabilir:
using System;
public class MerhabaCSharp
{
public static void Main()
{
Marka verivizyon = new Marka();
verivizyon.MarkaKod = 500;
verivizyon.MarkaAd = "Verivizyon";
verivizyon.MarkaBilgileriniYaz();
Marka seckin = new Marka();
// kurala uymayan bir atamayı,
// nesne kabul etmeyecektir
seckin.MarkaKod = -1;
seckin.MarkaAd = "Seçkin Yayın A.Ş.";
seckin.MarkaBilgileriniYaz();
}
}
Şekil B.8:
Programın çıktısı
Şekil B.9:
Sınıflardan nesne
türetilmesi
Yapıcı (Constructor) Kavramını Anlamak
Bir sınıftan nesne nüshalandırılması aşamasında, sınıfa ait bir metodun devreye girmesi
gerekir. Bu metod,
¾
Sınıf ile aynı adı taşır.
680
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
¾
Dönen değer almaz.
¾
Genel olarak public'tir.
¾
En genel manada, bir nesnenin hazırlanması (initialisation) maksadıyla kullanılır
Örnek 14:
Yeni bir marka oluşturulurken, bu markaya ait başlangıç verilerinin otomatik olarak atanabilir olmasını istersek,
public class Marka
{
private int markaKod;
private string markaAd;
public Marka(int markaKod, string markaAd)
{
MarkaKod = markaKod;
MarkaAd = markaAd;
}
public int MarkaKod
{
get { return markaKod; }
set
{
if (value > 0)
markaKod = value;
}
}
public string MarkaAd
{
get { return markaAd; }
set { markaAd = value; }
}
public void MarkaBilgileriniYaz()
{
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
MarkaKod,
MarkaAd);
}
}
Bu türden bir sınıfı kolayca şu şekilde kullanabiliriz:
using System;
public class MerhabaCSharp{
public static void Main()
{
Marka verivizyon = new Marka(500,"Verivizyon");
verivizyon.MarkaBilgileriniYaz();
Marka seckin = new Marka(501,"Seçkin Yayın A.Ş");
seckin.MarkaBilgileriniYaz();
}
}
Ek B: C# ve OOP Kılavuzu
681
Şekil B.10:
Programın çalışması
Herhangi bir anda, sınıftaki elemanların 'o' anda üstünde çalışılırkenki hali ile nesne için
nüshalanmış kopyalarını kastetmek üzere this anahtar sözcüğünü kullanabilirsiniz.
Örnek 15:
Marka sınıfının, MarkaBilgileriniAl adında aşağıdaki gibi bir metodu olsun:
public void MarkaBilgileriniAl(int MarkaKod, int MarkaAd)
{
this.MarkaKod=MarkaKod;
this.MarkaAd=MarkaAd;
}
Metodları Aşırı Yüklemek
T-SQL ile Stored Procedure'ler gibi prosedürel rutinler kodlarken, isteğe bağlı parametreler için default değerler verebiliyorduk. C# bu türden bir seçenek sunmaz. Bunun yerine aynı adda farklı sayıda veya tipte parametreler alan metodlar tanımlayabiliriz. Bu işleme Metot Aşırı Yükleme (Method Overloading) denir.
¾
Aynı adda ama farklı imzada iki method aşırı yüklenmiştir denir.
¾
Bir durum için method adı çağrıldığında, parametre olarak verilen değer ve değişkenlerin tip ve sayısına göre uygun olan method otomatik olarak devreye girer.
Constructor metotlar da neticede bir metot olduğundan aşırı yüklenebilirler.
Örnek 16:
Daha önceden, marka sınıfının oluşturulabilmesi için boş bir yapıcı metot derleyici tarafından otomatik olarak ekleniyordu. Ancak artık biz kendimiz bir yapıcı metot ekledik.
Halen Marka sınıfının hiçbir özelliği verilmeden de nesne türetiminde kullanılması isteniyorsa, ikinci bir constructor metodu boş olarak bile olsa tanımlanabilir. Aksi halde derleyici tarafından böyle bir metod otomatik olarak oluşturulamaz.
public class Marka{
private int markaKod;
private string markaAd;
public Marka(){
// boş yapıcı metot
}
public Marka(int markaKod, string markaAd)
{
MarkaKod=markaKod;
MarkaAd=markaAd;
}
public int MarkaKod{
get{return markaKod;}
682
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
set
{
if (value > 0)
markaKod = value;
}
}
public string MarkaAd
{
get { return markaAd; }
set { markaAd = value; }
}
public void MarkaBilgileriniYaz(){
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
MarkaKod,
MarkaAd);
}
}
Static Kavramını Anlamak
Mademki nesneleri, sınıflardan çoğaltarak kullanıyoruz, bu durumda her nesne için sınıfın içerisindeki her şeyi kopyalatmaya gerek var mıdır? Gereksiz şeyleri hafızada gereksiz
yere çoğaltmasak da olur mu? Gibi soruları kendinize sormuş olabilirsiniz. Nesneye dayalı
programlama, her şeyin illa da bir nesne üstünden erişilebilir olmasını zorunlu kılmaz.
Bazı elemanlara sınıf üstünden erişilebilir. Mesela, markaların marka kodlarının belli bir
değerin altında kalmaması gerekiyor diyelim. Bu türden bir parametrenin her bir sınıf ile
çoğaltılması yerine sadece sınıfın bir parçası olarak kalması daha akıllıca olacaktır.
Örnek 17:
Marka sınıfına, minimum marka kodunu işaretlemek üzere static bir alan ekleyelim.
public class Marka
{
public static int minimumMarkaKod = 0;
private int markaKod;
private string markaAd;
public Marka(){
// boş yapıcı metot
}
public Marka(int markaKod, string markaAd)
{
MarkaKod=markaKod;
MarkaAd=markaAd;
}
public int MarkaKod{
get{return markaKod;}
set
{
if (value > 0)
markaKod = value;
}
}
Ek B: C# ve OOP Kılavuzu
683
public string MarkaAd
{
get { return markaAd; }
set { markaAd = value; }
}
public void MarkaBilgileriniYaz(){
Console.WriteLine("MarkaKodu:{0} \t MarkaAdı:{1}",
MarkaKod,
MarkaAd);
}
}
Örneğimizde sadece bir değişkeni static olarak tanımlandık. Bir metodu, bir özelliği de
static olarak tanımlamak mümkündür. Ancak unutulmaması gereken nokta, statik tanımlanan elemanlara nesne üstünden ulaşılamaz, doğrudan sınıf üstünden ulaşılabilir.
using System;
public class MerhabaCSharp{
public static void Main()
{
Marka verivizyon = new Marka();
verivizyon.MarkaKod=500;
verivizyon.MarkaAd="Verivizyon";
verivizyon.MarkaBilgileriniYaz();
Marka seckin = new Marka();
// kurala uymayan bir atamayı,
// nesne kabul etmeyecektir
seckin.MarkaKod = 501;
seckin.MarkaAd = "Seçkin Yayın A.Ş.";
Console.WriteLine("bir marka kodu {0} değerinden büyük olmalıdır", Marka.minimumMarkaKod);
}
}
Şekil B.11:
Static bir alana
sınıf üstünden
erişilmesi.
Şekil B.12:
Static sınıf elemanları, nesnelerle birlikte çoğaltılmaz, sınıf üstünden erişilebilir.
684
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Dikkat: Static üyeler, nesneye erişemezler. Nesneler, statik üyelere erişebilirler.
Elbette ne nesneye dayalı programlama, ne de C# bu kadarlık bir bilgi ile tam olarak kullanılamaz ancak burada verilenler, size sadece kitap içeriğini anlayabilecek seviyeye getirme amaçlıdır.
Özetle Nesneye Dayalı Programlama
Nesne yönelimli programlamanın temelini Class'lar oluşturur. Bir class, günlük anlamda
bildiğimiz nesne'nin kodlanarak tanımlamasıdır. Nesnelerle çalışma teorisinin temelinde,
içeriğinin nasıl çalıştığını bilmeden onu kullanabilme mantığı yatar. Araba, DVD Player
gibi... nasıl yaptıklarını bilmeyiz ama ne yaptıklarını biliriz.
1.
Bir class genel olarak şu yapıdan ibarettir (örnek için bölümün ilerleyen kısmında
yer alan sınıflara bakabilirsiniz. )
¾
Method'lar, property'ler veya değişkenler (field) içerebilir (bunların her birine
member denir)
¾
Method, prosedürel programlamada bildiğimiz fonksiyon'un işlevini class'larda yerine getirir.
¾
Property prosedürel programlamada bildiğimiz değişken'in işlevini class'larda yerine
getirir. Bu işlev için, değişken de kullanılabilir.
¾
Property'ler yazılabilir ve okunabilir olabilir. Sadece okunabilir veya sadece yazılabilir tanılanması mümkündür. Ancak değişkenleri okunabilir yapmak için, Method'lar
yerine, property (özellik) adı verilen yarı method yarı değişken yapı kullanılabilir.
¾
Method'lar ve değişkenler, sadece sınıf içerisinden erişilebilir veya bütün sınıflardan
yahutta bütün assemly'lerden erişilebilir olabilir veya erişilemez olarak kodlanabilir.
Bunlar için, Public, Private, Internal, External... gibi deyimler (Erişim Tanımlayıcıları) kullanılır.
¾
Methodlar, ayı adda ama farklı girdi veya çıktı parametrede üst üste
tanımlanabililir. (method overloading) Bu durumda, class'ın kullanımı aşamasında,
çağrılış şekline en uygun method otomatik olarak algılanır ve devreye girer.
2.
Class'lar yazıldıktan sonra, kütüphanelerde saklanırlar. MFC, .NET gibi belli bir geliştirme ortamı ile birlikte gelen kütüphanelere, temel kütüphane (base library-base
class) denir. Bu ve kullanıcı tarafından geliştirilmiş kütüphaneler, isim uzayı
(namespace) denilen nokta notasyonlu yapılarla düzenlenir. Namespace kavramı,
fiziksel değil mantıksal bir kavramdır. Yani, farklı dokümanlarda birbiri ile aynı seviyede class'lar olabilir.
¾
Düzenlenmiş Class'lara erişim, isim uzayından sonra sınıf adı gelecek şekilde bir
notasyon ile sağlanır. (System.Data gibi)
¾
C# gibi dillerde, kütüphane sınıflarını, uygulamanın içerisindeymiş gibi doğrudan
nesne adıyla çağırmak mümkündür. Ancak bunun için uygulamanın en başında,
isim uzayları ve alt isim uzayları nokta notasyonu ile sınıf adına kadar veya belli bir
seviyeye kadar belirtilebilir. Geri kalanlar, (sınıf adı veya isim uzayının tamamı be-
Ek B: C# ve OOP Kılavuzu
685
lirtilmedi ise, belirtilmeyen kısmı) kod içerisinde belirtilerek, sınıflara erişilebilir.
(using System.Data gibi)
3.
Class'lar yeni class'lar türetilirken şu şekilde kullanılarak kolaylıklar sağlarlar:
¾
Yeni bir class'ın çekirdeğini oluşturabilirler. (Implementation Inheritance) ve
¾
Bazı class'lar miras almaya karşı korumaya alınabilir (Sealed Class)
¾
Bazı class'lar miras alınmadan kullanılamaz tanımlanabilir (Abstract Class)
¾
Bazı class'lar, miras alındıktan sonra, methodlarını geçersiz kılacak aynı adda yeni
bir metod tanımlanabilir (method overriding)
¾
Kendisinden türeyecek class'ların yapıları hakkında söz sahibi olabilirler (Interface
Inheritance)
4.
Class'lar Bir Uygulama geliştirirken, şu şekilde kolaylıklar sağlarlar:
¾
Bazı class elemanları, static deyimi ile tanımlanmamışlardır ve nüshalandırma
(instantiating) ile yeni class nüshası çıkartılarak, kullanılırlar. ASP biliyorsanız veya
yukarıdaki ASP'li örneğe bakarsanız, ADODB.Connection'ı düşünün. Hep
nüshalandırarak kullanılır.
¾
Bazı methodlar ve propertiy'ler, değişkenler çoğaltılamaz olabilir (static) Bu tür
method'lar kullanılırken, class'lar nüshalandırmaksızın, orijinal namespace ve sınıfın
adı ile kullanılırlar. Yukarıdaki örnekte, Response.Write'i hatırlayın... hep aynı isim
ile kullandık. Aşağıdaki örnekte, güvenlik işlemleri için geliştireceğimiz, MD5 ile
özet alan Class da bu türdendir.
¾
Class'lar, ebebeynleri ile aynı türdenmiş gibi davranabilirler. Böylece, temelde aynı
class'tan türetildikleri halde farklı türlerde olup aynı türmüş gibi davranan class'lar
elde edilebilir. (Polimorfizm)
3n Katmanlı Mimari ve Sınıfların Rolü
Üç-n Katman Mimarisi, özellikle nesneye dayalı programlama ile birlikte güç bulmuş, veritabanı programlamanın esas dinamiklerini oluşturan bir programlama eğilimi hatta
trendidir. Bu nedenle, tam manasıyla bilinmesinde yarar vardır. Burada, Nesneye dayalı
programlamada kullanılan teriminolojinin anlaşılır bir özetini yapmaya çalıştım. Geniş
bilgi için, bu konuda bir kitap okumanızda yarar olabilir.
Üç Katmanı Tasarlamak
Üç katman mimarisinin en alt katmanını, buraya kadar öğrendiğimiz tekniklerle geliştirdiğimiz, Veri katmanı oluşturur. Veri katmanı ile temasta bulunan, uygulamanın en alt
katmanına iş katmanı denir ve prensip olarak class'lardan oluşur. Class'lar, meseleye çok
iyi vakıf kişiler tarafından tasarlanabilirler.
Class'ları tasarlamak için geliştirilmiş standart yollar var. Bunlardan en genel olanı UML
(Unified Modeling Language)'dir. Bu konuda yeni iseniz, nesneye dayalı bir dil ile kodlama işinin temellerini kavradıktan sonra UML ile de haşir neşir olmanız, yararlı olacak-
686
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
tır. Arkasından, genel olarak karşılaşılan sorunlara yaklaşım tarzları hakkında bilgi
edinmek için Tasarım Desenleri (Design Pattern) öğrenmeniz, bu yoldaki son nokta olacaktır. Tasarım Deseni, sadece nesneye dayalı programlamaya uygulanmasa da, nesneye
dayalı programlama için, bir çok tasarım desenini bir çok nesneye dayalı dilde bulmak
mümkündür (C++, Java, C#).
Bütün bu detayları, size bırakıp projemizin genel olarak, üç katmana dağılımını inceleyelim:
Tablo B.4:
En üst katmanı
oluştururan sunum katmanının
görevi, iş katmanı
ile kullanıcıyı etkileştirmektir. Sunum katmanı
doğrudan veritabanına erişmez!
Bu işlemler için, iş
katmanında geliştirilmiş Class'ları
nüshalandırarak
kullanabilir.
Katman
Sunum
İşlevi
Kullanıcı ile etkileşim, iş katmanında kodlanmış
Login.aspx, Login.aspx.cs
nesneleri nüshalandırıp kullanmak.
Sunum ve Veritabanı katmanları ile etkileşim.
İş
İş kurallarının sağlanması
Veri
Projemizde Yer Alacak
Dosya- Bileşen Adları
KullaniciVT.cs
Guvenlik.cs
Tablolar, Trigger'lar, Stored Procedure'ler,
tblKullanici,
Constraintler ve diğer veritabanı bileşenleri ile
SP$yetkilendir
kurgulanmış veri mantığının sağlanması
Buraya kadar öğrendiklerimiz çerçevesinde bir üç katman mimari yaklaşımı ile, daha önce, ASP-ADO ile gerçeklediğimiz örneğimizi yeniden ele alalım:
Veri katmanını biliyoruz. tblKullanici adında bir tablomuz var. Bu tabloya erişip verilerin
doğruluğunu onaylayan, SP$yetkilendir adında stored procedure kodladık, bu
nedenle. Üç katman ile çalışırken, bilmemiz gereken şey, SP$yetkilendir'dir. Öteki kısımlar artık veri katmanında kalmıştır. Neticede, veri katmanı ile ilgili işlemleri bitirdiğimizi varsayabiliriz.
İş Katmanını Tasarlamak
Bir sonraki katman olan iş katmanını tasarlamaya geçelim. Bu iş için, nesneye dayalı
programlamaya tam destek sağlayan, Managed C# dilini kullanacağız. Managed ve
Unmanaged kavramları kafanızı karıştırabilir. Aralarında ufak bir fark vardır: Managed
ortamda, sistemden hafıza gibi kaynak alma ve sisteme bu kaynağı, işi bittiğinde iade etme işini, çalıştırma ortamı yerine getirir. JVM ve .NET Framework bu türden ortamlardır. Ama ortam, her zaman böyle olmayabilir. Şayet işletim sistemi ile kaynak alışverişini programcının kendisi yürütüyorsa, (ki bu durumda programcıya çok fazla iş düşer
ve sistemde daha fazla hata ihtimali vardır!) bu türden çalıştırma ortamına da
Unmanaged ortam denir.
C# bir dil olarak her iki ortamı da destekler. Ancak .NET ortamı, C#'ın bütün meziyetlerini gösterebileceği bir ortam değildir. Buna rağmen, biz .NET ortamında çalışacağız.
Veritabanına erişip kullanıcı ile ilgili işlemleri yerine getirecek bir sınıfa ihtiyacımız var.
Bu sınıfa KullaniciVT adını verelim. Class adlarının ilk harfi büyük harfle başlatılır. Bu
Ek B: C# ve OOP Kılavuzu
687
bir zorunluluk değildir ama töre olmuş bir kodlama tarzıdır. Şimdi ilk sınıfımızı kodlayalım:
Bu sınıfın amacı, Web'den gelen verileri her seferinde özetlemek (Digest)tir. Bir üyemiz
ilk kaydolduğunda, seçtiği şifresi veritabanımızda saklanmaz. Bunun yerine, özeti saklanır. Daha sonra, yetkilendirmek için geldiğinde de şifresinin özeti alınır. Böylelikle, her
seferinde gelen veririn daha önceki veri olup olmadığı bilinir, ama en önemli tarafı, ne
olduğu asla bilinemez. Çünkü özet alma ile şifreleme yapan, SHA, MD5 gibi
algoritamalar, tek yönlü veri dönüşümünü esas alan, ters yönde bir dönüşüme asla müsaade etmeyen algoritmalardır.
///Guvenlik.cs
using System;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace Verivizyon.Bilesenler
{
public class Guvenlik
{
public static string OzetCek(string gercekDuzMetin)
{
Byte[] gercekByteMetin = new
UnicodeEncoding().GetBytes(gercekDuzMetin);
Byte[] ozetByteMetin = ((HashAlgorithm)
CryptoConfig.CreateFromName("MD5")).ComputeHash(gercekByteMetin);
return BitConverter.ToString(ozetByteMetin);
}
}
}
İpucu: C#'ta fonksiyon yoktur. Bunun yerine, class'ların method'larını kullanacağız. Ancak bir
methodu, gerçek manada sabit bir fonksiyon gibi her yerde nüshalandırmadan kullanmak istiyorsanız, static deyimi ile tanımlayabilirsiniz.
Takip eden sınıfları, aşağıdaki gibi kodlayalım
///dosya:KullaniciVT.cs
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace Verivizyon
{
//KullaniciVT, kullanicilarla veritabani
// arasinda iliskiyi kuran,
688
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
//is mantigi saglayicisidir.
public class KullaniciDetay
{
public string kullaniciAd;
/*Kullanicida bulunan ozellikler
*..
* */
}
public class YetkilendirmeBilgi
{
/*
* Yetkilendirilen kisiye ait, kullanici kodu, isim, soyad
* son giris tarihi gibi bilgileri encapsulate etmede
kullanilir.
* */
public string kullaniciKod;
public string isim;
public string sonGirisTarih;
}
public class KullaniciVT
{
public KullaniciDetay KullanicininBilgileri(int kullaniciKod)
{
/* kullanici bilgilerini veritabanindan cek
* kullaniciDetay class'indan bir nusha al
* vertabanindan gelen verileri bu nushaya yukle
* neticeyi, methodu cagirana dondur
* */
KullaniciDetay KullaniciBilgileri= new KullaniciDetay();
return KullaniciBilgileri;
}
public YetkilendirmeBilgi KullaniciYetkilendir(string
kullaniciAd,
string sifre)
{
// Bir adet connection ve bir adet command nesnesi
olusturalim
SqlConnection Conn = new
SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
// DSN parametresi, web.config dosyasinda,
// sekildeki gibi tutulmaktadir.
SqlCommand Cmd = new SqlCommand("SP$yetkilendir", Conn);
Cmd.CommandType =
System.Data.CommandType.StoredProcedure;
Cmd.Connection = Conn;
Ek B: C# ve OOP Kılavuzu
Cmd.CommandType =
System.Data.CommandType.StoredProcedure;
Cmd.Connection = Conn;
// Parameter : @KullaniciKod
Cmd.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@KullaniciKod",
System.Data.SqlDbType.Int, 4));
Cmd.Parameters["@KullaniciKod"].Direction =
System.Data.ParameterDirection.ReturnValue;
// Parameter : @kullaniciAd
Cmd.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@kullaniciAd",
System.Data.SqlDbType.VarChar, 50));
Cmd.Parameters["@kullaniciAd"].Direction =
System.Data.ParameterDirection.Input;
Cmd.Parameters["@kullaniciAd"].Value = kullaniciAd;
// Parameter : @sifre
Cmd.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@sifre",
System.Data.SqlDbType.VarChar, 50));
Cmd.Parameters["@sifre"].Direction =
System.Data.ParameterDirection.Input;
Cmd.Parameters["@sifre"].Value = sifre;
// Parameter : @yetkiSeviye
Cmd.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@yetkiSeviye",
System.Data.SqlDbType.Int, 4));
Cmd.Parameters["@yetkiSeviye"].Direction =
System.Data.ParameterDirection.Output;
// Parameter : @sonGirisTarih
Cmd.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@sonGirisTarih",
System.Data.SqlDbType.VarChar, 12));
Cmd.Parameters["@sonGirisTarih"].Direction =
System.Data.ParameterDirection.Output;
// Parameter : @isim
Cmd.Parameters.Add(new
System.Data.SqlClient.SqlParameter("@isim",
System.Data.SqlDbType.VarChar, 30));
Cmd.Parameters["@isim"].Direction =
System.Data.ParameterDirection.Output;
Conn.Open();
Cmd.ExecuteNonQuery();
string KullaniciKod=
Cmd.Parameters["@KullaniciKod"].Value.ToString();
689
690
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
if (KullaniciKod=="0")
{
Conn.Close();
return null;
}
else
{
YetkilendirmeBilgi YetkiBilgileri= new
YetkilendirmeBilgi();
YetkiBilgileri.kullaniciKod =
Cmd.Parameters["@KullaniciKod"].Value.ToString();
YetkiBilgileri.isim=Cmd.Parameters["@isim"].Value.ToString();
YetkiBilgileri.sonGirisTarih =
Cmd.Parameters["@sonGirisTarih"].Value.ToString();
Conn.Close();
return YetkiBilgileri;
}
}
public string KullaniciEkle(KullaniciDetay yeniKullanici)
{
/* Kullanici bilgilerini yeniKullanici nüshasindan al
* Command nesnesine aktar
* ifadeyi calistir.
* neticesini cagrildigi yere dondur.
* */
return null;
}
}
}
KullaniciDetay ve YetkilendirmeBilgi sınıfları, veri kılıflaması (encapsulation) için kullanılmaktadır. Amaç, verilerin belli bir formatta bütün olarak aktarılabilmesini sağlamaktır. Bu amaç için, C#'ta struct tipi değişkenler de kullanılabilirdi ancak, biz
class'larla bu işi gerçekleştirdik.
İpucu: struct, küçük veri yapılarının aktarılmasında daha başarılıdır. Class ise referans bazlı çalıştığından,
büyük verileri aktarırken tercih edilebilir bir kılıflama (encapsulation) yöntemidir.
KullaniciVT sınıfının birçok metodu yeralmakta. Çünkü, ele aldığımız örnekte, bütün işlemler bu sınıfa düşmekte. Ancak sınıfın sadece örnekte gerekli olan kısımlarını
gerçekledik, diğer taraflarını basitliği korumak için gerçeklemedik.
Bu metodlardan, KullaniciYetkilendir, dışarıdan aldığı iki parametreyi kullanarak, SP$yetkilendir stored procedure'üne erişip veri katmanı ile bilgileri kontrol
edebilmektedir. Sonuçta, yetkilendirme işlemi olursa, YetkilendirmeBilgi sınıfından bir
nüsha alınmakta ve bu nüshaya doldurulan veriler (encapsulation) çağrıldığı yere, gönderilmektedir. Yetkilendirme olmazsa, null değeri gönderilmektedir. Peki bu sınıf veritabanına hangi bağlantı ifadesini kullanarak erişmektedir?
Ek B: C# ve OOP Kılavuzu
691
web.config dosyasına DSN adı ile bir bağlantı ifadesi şu şekilde eklenebilir:
Şekil B.13:
Veritabanı erişimi
ile ilgili ifadelerin,
XML formatında
uygulamanın
konfigürasyon
bilgilerini tutan
web.config dosyasına eklenmesi
web.config' de yer alan bu bilgiler, aşağıdaki şekilde erişilip kullanılmaktadır.
SqlConnection Conn = new
SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
Ancak, bu ifadeleri kullanabilmek için, ilgili isimuzaylarını (namespace) yüklemeniz gerekir. Bu işten sorumlu içerik, using System.Configuration; deyimi ile, ilgili
temel sınıfların (base class) bulunduğu kütüphaneyi projemizin parçası haline getirdik.
Büyük uygulamalarda, iş katmanı, içerisinde yer verilen bütün sınıflar ve methodlarla
kendi başına bir proje olarak ele alınır ve bir dll haline getirilerek kullanılır. Bütün iş
katmanını içine alan bu yapıya, Application Framework (Uygulama Omurgası) adı verilir.
Sunum Katmanını Tasarlamak
Bu sınıfları gerçekledikten sonra, iş katmanındaki işlemlerimizi bitirmiş olduk. Sıra geldi,
sunum katmanına. Sunum katmanında, bu iki dosyada yer alan sınıfları türetip kullanacağız. Bu türetme işleminin, bir önceki ASP örneğinde Connection nesnesini kullanmaktan bir farkı bulunmamakta.
Büyük uygulamalarda, iş katmanı, içerisinde yer verilen bütün sınıflar ve methodlarla,
namespace yardımıyla da düzenlenerek, kendi başına bir proje olarak ele alınır ve bir dll
haline getirilerek kullanılır. Bütün iş katmanını içine alan bu yapıya, Application
Framework (Uygulama Omurgası) adı verilir.
Ardından, kullanıcıdan verileri alabilecek ve verilerinin doğru olup olmadığını ona aktarabilecek bir aspx dosyasını aşağıdaki şekilde tasarlayalım.
Şekil B.14:
Yeni bir Form
başlatıp adını,
login.aspx olarak
değiştirelim ve bir
Label, iki Textbox
ve bir adet de
Button nesnesi
ekleyelim.
692
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
<%@ Page language="c#" Codebehind="login.aspx.cs"
AutoEventWireup="false" Inherits="Verivizyon.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<!--dosya: login.aspx-->
<HTML>
<HEAD>
<title>Üye Giriş Sayfası</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET
7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:Label id="LblSonuc" runat="server">
</asp:Label><BR>
Kullanici Adiniz<asp:TextBox id="TxtKullanici" runat="server">
</asp:TextBox><BR>
Sifreniz <asp:TextBox id="TxtSifre" runat="server"
TextMode="Password"></asp:TextBox>
<asp:Button id="BtnSubmit" runat="server" Text="Giris">
</asp:Button>
</form>
</body>
</HTML>
Codebehind dosyası, Visual Studio tarafından otomatik oluşturulmakta. Bizim tüm yapmamız gereken, butonu çift tıklamak ve içerisine şu kodları eklemek:
// yetkilendirmeyi yapacak sinifi olusturalim
Verivizyon.KullaniciVT kullanici = new KullaniciVT();
//yetkilendirme sonucunu encapsulate edecek sinifi
//olusturalim
Verivizyon.YetkilendirmeBilgi yetkilendirmeBilgi= new
YetkilendirmeBilgi();
//YetkilendirmeBilgi.KullaniciYetkilendir() metodunu
// nasıl çağırdığımıza ve
// Şifrenin nasıl özetinin çekildiğine dikkat edin...
yetkilendirmeBilgi =
kullanici.KullaniciYetkilendir(TxtKullanici.Text,
Verivizyon.Bilesenler.Guvenlik.OzetCek(TxtSifre.Text));
if(yetkilendirmeBilgi != null){
LblSonuc.Text = "Merhaba <b>" +
yetkilendirmeBilgi.isim +
"</b> sitemize en son <b>" +
yetkilendirmeBilgi.sonGirisTarih +
Ek B: C# ve OOP Kılavuzu
693
"</b> tarihinde giris yaptiniz" ;
}
Görüldüğü üzere, veritabanına doğrudan bir erişim yer almamaktadır. Sadece, bir alt
katmanda oluşturulan sınıflar nüshalandırıldı (instantaiting) ve bu nesneler kullanıldı.
Uygulama ilk başladığında, ilgili mesajı kullanıcılarımıza göstermek için, şu kodu da ekleyebiliriz:
private void Page_Load(object sender, System.EventArgs e)
{
if ( !IsPostBack)
LblSonuc.Text = "Lütfen Kullanici adi ve sifrenizi giriniz.";
}
Şekil B.15:
Projenin çalışan
hali
EK C
BÖLÜM SONU SORU CEVAPLARI
Bu bölümde her bir bölümün sonunda yer alan tekrar sorularının cevap anahtarları yer
almaktadır.
1. Bölüm
1.
Verileri tablolara bölerek saklayan ve tablolar arasında ilişkiler tanımlamaya olanak
sağlayan veritabanı sistemine İlişkisel Veritabanı denir.
2.
İlişkisel Veritabanlarında sorgu amaçlı kullanılan genel dile SQL denir.
3.
Birinci Anahtar: Bir tablodaki varlıkları ayırt edici olarak bulunan ve tekrar etmeyen satıra verilen addır. Yabancı Anahtar: Bir varlığa ait ek bilgilerin bulunduğu
başka tablo(lar)da, varlığı temsil etmek üzere bulunan birincil anahtar değerlerini
içeren sütuna yabancı anahtar denir.
4.
Management Studio nesne temelli ve T-SQL temelli veritabanı yönetim işlevleri
için kullanılan SQL Server 2005 istemci yazılımıdır.
5.
SQL Server Configuration Manager, SQL Server servislerinin başlatılıp durdurulmasını sağlar. İşletim sisteminde çalışan diğer servisler de dahil servislerle ilgili daha
detaylı bilgi Denetim Masası, Yönetimsel Araçlar, Hizmetler kısmından alınabilir.
6.
SQL Server içerisinde C# ile yazılmış bir kod yer alabilir. Bu kodun çalışmasından
CLR birimi sorumludur.
7.
Tablo, view, stored procedure, trigger, constraint, indeks, sütun, role, kullanıcı,
login, veritabanı, kuruk, kontrat…
8.
SQL Server 2 farklı sunucu seviyeli kullanıcı erişim modu destekler: Windows Only
ve Mixed Mode. Her biri konu içerisinde ele alınmıştır.
9.
Bir ilişkisel veritabanı sorgulama Seçme, İz düşürme ve birleştirme işlemleri desteklenmelidir.
10. Management Studio ve SqlCmd ortamlarında T-SQL yazılıp çalıştırılabilir.
11. SQL 3 alt dil grubundan oluşur:
DDL: CREATE, ALTER, DROP
DML: SELECT, INSERT, UPDATE, DELETE
DCL: GRANT, DENY, REVOKE
696
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
2. Bölüm
1.
Bir uygulamanın veritabanı katmanını tasarlamak 3 aşamada ele alınmalıdır:
KAVRAMSAL: programın kullanılacağı ortam ile ilgili model
MANTIKSAL: veritabanının teoriler ekseninde ve programcılara göre şekillenmiş hali
FİZİKSEL: veritabanının gerçek olarak çalıştırılabilir ve stabil halini gösteren model
2.
Bir veritabanında performans kaygılarından ötürü denormalizasyonlara başvurulacaksa, bu fiziksel model seviyesinde ele alınmalıdır.
3.
Bir veritabanının boyunu ve artım miktarını ilk haldeki veri miktarı ve zaman içerisinde eklenecek veri eğilimi ile kestirebiliriz.
4.
Tempdb veritabanının boyutu ve bulunduğu disk erişimleri hızlandırmak için
önemlidir.
5.
Bir proje bittikten sonra sürekli olarak Türkçe karakter problemleri ile karşılaşıldığında, veritabanı ve sunucu seviyeli Collation ayarlarının düzgün olarak yapılandırılması gerekiyor demektir.
6.
Bir uygulamada veritabanı seviyesinde, veri eklemek ve değiştirme gibi işlemlerde
tarih formatında problem çekildiğinde, veritabanına erişen kullanıcının default dilinin Türkçe olması işleri kolaylaştıracaktır.
7.
SQL Server, tanımsal veri bütünlüğü tekniklerinden Constraint, Rule ve Default
nesnelerine destek verir.
8.
DEFAULT nesnesi ile işdeş olan Constraint Default Constraint'dir. Rule nesnesi
Check Constraint'in işlevini yerine getirir. Check constraint aynı işlevi daha az efor
ile yerine getirebilir.
9.
Birim Bütünlüğü ile Domain Bütünlüğü arasındaki en temel fark, birim bütünlüğü
bir satıra ait verilerin kendi içerisinde tutarlı olmasını hedeflerken, domain bütünlüğü bir sütuna ait verilerin kendi içinde uyumlu olmasını hedefler.
10. Bir tabloda en fazla bir tane Primary Key Constraint yeralabilir.
11. Unique Constraint Primary Key Constraint'e rağmen bir tabloda, PK dışında tekil
olması gereken sütunlar olduğunda kullanılır. UC null olabilir, PK olamaz. Bir tabloda birden fazla fazla UC olabilir ama sadece bir tane PK olabilir.
12. Bir tabloya Unique Constraint eklenmek istediğinde, tabloda önceden varolan kayıtların en fazla bir tanesinin NULL olması ve bütün değerlerin birbirinden farklı
olması gerekir.
13. Bir tablonun bir sütununa gelebilecek değerlerin, başka bir tablonun içerdiği değerlerden olmasının SQL Server tarafından denetlenmesi isteniyorsa hangi Constraint
tanımlanmalıdır?
14. Ya doğrudan Management Studio nesne yönetim arayüzleri ile veya şu yapı ile:
ALTER TABLE tablo_ismi
ALTER COLUMN sutun_ismi
SET DEFAULT default_deger | fonksiyon_ismi()
Ek C: Bölüm Sonu Soru ve Cevapları
697
15. İlişkili iki tablodan birindeki veriler silindiğinde veya güncellendiğinde, ilişkili bulunduğu tabloya değişikliğin yansıtılabilmesi için basamaklı veri bütünlüğü tanımının yapılmış olması gerekir. Aksi halde veri değişimi hiç yapılmaz.
16. Veri eklemekle ilgili bir işlem için Constraint'ler zorluk çıkarıyorsa gerçekleştirilebilecek en pratik çözüm bir süre constraint'leri susturmak, verileri ekleyip tutarlı hale
getirdikten sonra geri açmaktır.
17. Rule ve Default nesnelerinin yapabileceği şeyleri Constraint'ler yapabildiği halde, SQL
Server bu nesnelere geriye doğru uyumluluk için destek vermeye devam etmektedir.
3. Bölüm
1. Sorgu belli kriterleri sağlayan verileri veritabanından seçmek demektir. Genel olarak bir sorgu SELECT, FROM ve WHERE yan cümleciklerinden oluştur.
2. Tekrarlayan satırları indirgemek için DISTINCT deyimi kullanılır.
3. Metin ve tarihsel sabitler tek tırnak içerisine alınarak kullanılır. Sayısal sabitler doğrudan kullanılır.
4. oker karakterler(_, % ve [XYZ] ile [^XYZ]) sadece LIKE operatörü ile kullanılabilirler, '=' ile kullanılamaz.
5. Tarihi istenilen formatta göstermek için CONVERT fonksiyonu kullanılır.
6.
SELECT isim + ' '' ' + soyad FROM tblKullanici
7.
Altsorgu bir SELECT ifadesi içerisinde başka bir SELECT ifadesi daha yer almasıdır. Altsorgu ile ilgili [NOT] IN, [NOT] EXISTS gibi kelimeler ayrılmış kelimeler
kullanılabilir.
8.
Normalizasyon amacıyla farklı tablolara dağılmış verileri birleştirip bir tek tabloymuş gibi sorgulamak gerektiğinde JOIN kullanırız.
9.
Inner Join ile Outer Join arasındaki temel fark; birleştirmeye katılan her iki tabloda
sadece eşleşen kayıtlar gelmesi gerektiğinde INNER JOIN, tablolardan eşleşmeyenlerin de sonuçta yer alması gerektiğinde de OUTER JOIN ifadeleri kullanılmasıdır.
10. Full Outer Join'e birleştirmeye katılan her iki tablonun da fazladan olan satırlarını
görmek gerektiğinde ihtiyaç duyulur.
11. WHERE ile HAVING arasındaki fark, HAVING'in gruplanmış veriler üstünde filtreleme
yapmasına rağmen, WHERE'in gruplamaya girmeden önce filtreleme yapmasıdır.
12. CUBE, GROUP BY'dan sonra yer alan her sütun için içten dışa doğru bütün farklı
kombinasyonlardaki gruplamalı fonksiyon sonuçlarını bulur. ROLLUP ise, sadece
içten dışa doğru sonuçları korele eder.
13. GROUP BY verileri gruplara ayırarak sorgulamak amacıyla kullanılır. ORDER BY
ise verileri seçme işlemi bittikten sonra sıraya koymak için kullanılır.
14. COMPUTE'in kullanıldığı her yerde, COMPUTE BY ifadesi kullanılamaz.
COMPUTE BY ifadesi kullanabilmek için, sorguda, ORDER BY deyimi ile birlikte,
ilgili sütunun yeralması gerekir. COMPUTE için böyle bir kısıtlama yoktur.
15. Bir tabloda yer alan bütün kayıtları, loglamadan boşaltmak için TRUNCATE
TABLE deyimi kullanılır.
698
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
16. Bir tablodaki veriler, başka bir tablodaki veriler de kullanılarak güncellenmek durumunda iken oluşturulan bir sorguda alt sorgu kullanılmazsa, hem MS Access hem
de MS SQL Server tarafından kullanılamaz. Çünkü veri güncelleme esnasında yapılan JOIN işlemi bu iki VTYS için farklıdır.
17. CTE ve Türetilmiş tablo birbirine işlev olarak çok benzer. Ancak CTE rekürsif sorgulara olanak tanıması ve bazı birkaç işleme izin vermebilmesi nedeniyle türetilmiş
tabloya nazaran daha işlevsel olabilmektedir.
18. PIVOT ve UNPIVOT satır içerisindeki değerlerden sütun oluştururken veya sütunları birer satır değeriymiş gibi göstermek için kullanılırlar.
19. Bir tablodaki satırlarda yer alan verilerden her birine bakılarak ayrı ayrı işlemler
yapmak gerekiyorsa, Cursor tür bir değişken ile verilere erişmemiz gerekir.
20. Transact-SQL Sunucu Cursor'ler ve API Sunucu Cursor'ler olmak üzere iki farklı
Cursor türü için SQL Server 2005 destek sağlar. Cursorler'den kilitlenme ve performans kayıpları nedeniyle kaçınmak gerekir.
4. Bölüm
1.
View'ler karmaşık veritabanı şemalarını basitleştirmek için, güvenlik ve yetkilendirme maksatlı, birim dönüşümleri gibi farklı görünmesi gerekli veri ihtiyacını karşılamak maksatlı, indekslenerek performans maksatlı kullanılabilirler.
2.
WITH CHECK OPTIONS,bazı satırlara erişimi olmayan bir view üstünden kapsamı dışındaki verilere müdahale edilmesini engellemek amaçlı kullanılır.
3.
view sadece kayıt döndüren ifadeler tayin etmek için kullanılır. Oysa senonim, tablo,
stored procedure gibi bir çok türden nesne için kalıcı takma ad tayin etmede kullanılabilir.
4.
Unique olmayan Clustered Indeks tanımlanabilir. Hatta bu genellikle doğru kullanıldığında performans artırıcı bir unsur olabilir.
5.
Bir sütuna girilen verinin tekilliğini sağlamak için Constraint tanımlamadan çözüm
üretilebilir. Constraint yerine tekil indekslerle de kayıtlar tekil olmaya zorlanabilir.
6.
Bir indeks için fillfactor değeri verilmezse, Global Fillfactor değerleri(Sunucu veya
veritabanı seviyeli default ayarlar) esas alınarak indeks oluşturulur.
7.
Oluşturulmuş bir indeks'in fillfactor değerini ALTER INDEX REBUILD ile değiştirmek mümkündür.
8.
Primary Key Constraint ve Unique Key Constraint'lerin izdüşümü olarak otomatik
Unique Indeksler tanımlanır. Bu indeksler DROP INDEX ile silinemezler.
Constraint silindiği zaman otomatik olarak silinirler.
9.
Clustred Indeks'ler ve daha önce indekslenmiş sütunlar, covering indeks için, tekrardan indekslenmezler. Bu nedenle, geriye kalan iki sütunun indekslenmesi yeterlidir.
CREATE INDEX idx_Covering ON tblUrun(urunKod,urunAd)
Ek C: Bölüm Sonu Soru ve Cevapları
699
10. CREATE UNIQUE CLUSTRED INDEX
cx_marka ON tblMarka (MarkaKod, Marka)
ile tanımlanan indeks,
SELECT markaKod, marka
FROM tblMarka WHERE marka='vestel'
Sorgusu için, idealdir. Çünkü, covering indeks'tir ve daha da iyi bir durum, clustred
bir indekstir.
11. Bir indeks için sıralama verilmezse, anahtarları artan sırada(ASC) olarak varsayılır.
Bu nedenle de artan değerler şeklinde sıralanır.
12. Bir tablo sadece bir tek nonclustred indeks içeriyorsa, bir heap tanımlanır. Verilere,
bu heap üstünden erişilir.
13. Database Tuning Advisor bir Sql Profiler trace dosyasını veya bizim belirlediğimiz
bir sorguyu ele alarak bu sorgu ile ilgili iyileştirmeler önerir. SQL Profiler, SQL Server'a gelen ve çalıştırılan ifadeleri takip etmek maksatlı kullanılır. Bu takibatı kaydedip daha sonra DTA ile analiz edebiliriz.
5. Bölüm
1.
Stored Procedure'ler sistem stored procedure'leri, CLR Stored Procedure'ler,
Extended Stored Procedure'ler ve kullanıcı tanımlı stored procedure'ler gibi türler
halinde incelenebilirler.
2.
Bir stored procedure'ün tanımında hangi tablolara atıfta bulunulduğunu
sp_depends öğrenebiliriz.
3.
Bir stored procedure'ün kaynak kodunu WITH ENCRYPTION seçeneği ile tanımlanarak, bir bir stored procedure'ün kaynak kodunu korumalı hale getirebiliriz.
Encrypted Stored Procedure'ler SQL Profiler tarafından da görüntülenmezler ve
Replike edilemezler.
4.
Girdi parametreler, stored procedure'e değer aktarmak için standart bir giriş tanımlar. Çıktı parametreler, özellikle stored procedure'ün birden fazla değer döndürmesi
veya INTEGER türü dışında değer döndürmesi gerektiğinde kullanılır. RETURN
deyimi, stored procedure sadece bir tek değer döndürecekse ve bu değer de
INTEGER ise kullanılabilir. Genellikle hata kodu, sorgudan etkilenen kayıt gibi değerleri döndürmek için kullanılır
5.
Çalıştırma planı, Procedure Cash denilen bölgede tutulduğu için, karmaşık stored
procedure'ler genel olarak ikinci çalıştırmada, ilk çalıştırmaya göre daha hızlı çalışırlar.
6.
Yerel Stored Procedure'ler oturuma özgüdür. Aynı anda oturum açan faklı kullanıcılar birbirlerinin geçici stored procedure'lerini göremezler.
7.
Bir stored procedure ilk çalışmasında hızlı sonuç getirmesine rağmen takip eden çalışmalarında yavaş sonuç getiriyorsa, stored procedure'ün her çalıştırılmada, yeniden
derlenmesi gerekiyor demektir. Bunun için, stored procedure'ün WITH
RECOMPILE seçeneği ile tanımlanması performans artırıcı etkide bulunabilir
700
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
8.
Stored Procedure, derlenmiştir. Yani çalıştırma planı procedure cash denilen hafıza bölgesinde tutulmaktadır. İlk çalıştırmadan sonraki çalıştırmalarda daha hızlı netice verir. Script
ise, hiç bir derlemeye tabi tutulmaz. Her çalıştırılmasında bütün işlemler baştan ele alınır.
9.
Kullanıcı tanımlı fonksiyonlar hesaplanmış sütun oluşturmada kullanılabilir. Sütun
olarak kullanılmış bir kullanıcı tanımlı fonksiyon deterministik ise indekslenebilir.
10. Tablo gibi ve sütun gibi olmak üzere işlevsel olarak iki farklı Kullanıcı Tanımlı
Fonksiyon vardır.
11. Bir view parametre alamaz. Parametre alacak view gereksinimi için Tablo gibi davranan Kullanıcı Tanımlı Fonksiyonlar kullanılabilir.
12. Fonksiyonlar, yan etkide bulunamadıkları için sistemdeki verileri değiştiremezler.
Veritabanına veri ekleme ve silme gibi işlemler için veritabanı uç noktası olarak
fonksiyonlar değil, stored procedure'ler kullanılır.
13. T-SQL dışında CLR dillerinde de KTF programlanabilir. Özellikle CPU'yu yoğun
kullanacak işlemler için tercih etmek
14. Bir tablo ile bir fonksiyonu, şayet tablonun bir sütununu fonksiyon parametre olarak alıyorsa, APPLY operatörü yardımı ile birleştirebiliriz. Ama fonksiyon tablodan
bağımsız tablo tipi sonuç döndürüyorsa, APPLY operatörü olmadan, JOIN ifadesi
ile birleştirme yapılabilir.
15. EXEC() ve sp_executesql arasındaki fark, sp_executesql'in çalıştırma planı optimize
edilebilir ifadeler çalıştırmak için uygun olmasıdır. Bir veritabanındaki bütün indeksleri yeniden derleyecek bir program yazmanız gerekse plan derleme gereksinimi
olmadığından EXEC() fonksiyonu ama dinamik olarak oluşturulması gereken ve
çok sayıda verilerin olduğu bir tabloyu sorgulayan bir ifadeyi parametrik çalıştırmak
gerekiyorsa sp_executesql stored procedure'ünü tercih etmek mantıklı olacaktır.
16. Bir SP içerisinde TRY-CATCH yapısı kullanılmayan noktada hata meydana gelirse hata ele alınamaz ve program kullanıcısına programın çalışmasının kırılması olarak yansır.
17. RAISERROR fonksiyonu ile bir hata ortama fırlatıldığında bağlantı kopuyorsa, hatanın seviyesi 21 veya daha yukarıdaki bir değer ile fırlatıldığını gösterir.
6. Bölüm
1.
XML veriyi XQuery ile sorgularız.
2.
XML bir veri tipinin 5 farklı metodu vardır.
.query: XQuery soguları için kullanılır
.value: Değerleri skaler bir veritabanı tipine döndürür
.exist: Bir XQuery sorgu sonunun olup olmadığına bakar
.nodes: Bir XML düğümü döndürmek için kullanılır
.modify: XML-DML ifadeleri çalıştırmak için kullanılır
¾
¾
¾
¾
¾
3.
XML veri tipini herhangi bir metin tür(meslea NVARCHAR(MAX) )veri tipinden
ayıran en önemli fark binary olarak parse edilmiş olması ve bu nedenle de çeşitli geçerlilik denetlemelerine ve sorgulamalara tabi tutulabiliyor olmasıdır.
Ek C: Bölüm Sonu Soru ve Cevapları
701
4.
birincil ve ikincil indeks tanımlanabilir. XML sütun üstünde indeks tanımlaması, ait
olduğu tablonun birincil anahtarı olmasını ve sütun üstünde bir birincil XML indeks tanımlanmış olmasını gerektirir.
5.
XML bir veriyi sadece veritabanında tutmak için ilişkisele çevirmek, gereksiz işlem
maliyeti getirdiği için tercih edilmez.
6.
FOR XML tabular sorgu sonuçlarını XML'e dönüştürür.
7.
OPEN XML, XML verileri ilişkisel domaine dönüştürmede kullanılır. ve yardımcı sistem
stored procedure'leri sp_xml_preparedocument ve sp_xml_removedocument'dir.
7. Bölüm
1.
Daha küçük parçalara ayrılamayan bir dize işlemin bir bütün olarak ele alınmasını
sağlayan yapıya transaction denir.
2.
SQL Server 3 çeşit transaction'a destek verir:
¾
Otomatik Sabitleme: Normal olarak SQL Server'in çalıştığı Transaction modudur.
SQL Server'e gelen her bir batch tek bir transaction olarak ele alınır ve transaction,
batch'in çalıştırılması biter bitmez SQL Server tarafından bitirilir.
¾
Harici Transaction: Programcı tarafından BEGIN TRAN ile başlatılan ve programcı veya sistem tarafından bitirilebilen, genel manada kastedilen transaction
modudur.
¾
Dahili Transaction: SQL Server'in belli ifadelerden önce otomatik transaction başlatması şeklindeki mod olup, bu moda geçirme işini kullanıcının veya programcının
yapması gerekir. Bu modda, her bir transaction açıldığında, sonlandırma işi kullanıcıya bırakılmıştır.
3.
Ortak zamanlı çalışmada ortaya çıkan sorunlar:
¾
Kayıp Güncelleme(Lost Update)
¾
Tekrarlamasız Okuma(non-repeatable Read)
¾
Hayalet Okuma(fantom-read)
¾
Kirli Okuma(dirty read)
4.
SQL Server şu izolasyon seviyelerine destek sağlar:
¾
Read Uncommited
¾
Read Commited
¾
Repeatable Read
¾
Serialisible
5.
İki proses veya kullanıcıdan her biri faklı işlemler yaparken aslında karşılıklı olarak
diğerinin bir sonraki adımını tıkayan ve bu nedenle de her ikisi de ilerleyemeyen
proseslerin içinde bulundukları duruma dead lock denir.
702
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
6.
sp_lock ve sp_who sistem stored procedure'leri kullanılarak, kaynaklardan hangilerini kimler tarafından kilitlendiği görüntülenir. Ardından kilitleme yapan
transaction kısmı gözden geçirilir.
7.
Trigger'ları Stored Procedure'lerden ayıran özellikler:
¾
Dışarıdan parametre almazlar
¾
İstediğimiz zaman devreye sokamayız. Sadece belli veri değişimlerinde(EklemeSilme veya Güncelleme anında) devreye girerler
¾
AFTER trigger'lar transaction'dan sonra devreye girerler
¾
Tablolar üstünde tanımlanabilirler.
¾
Başka bir yerden çağrılamazlar ve sonuç döndürülemezler.
8.
Aynı veritabanı içerisindeki yabancı anahtar kontrolü, basamaklı veri bütünlüğü,
bir SQL ifadesinin etkilediği kayıt sayısının gösterilmesi
9.
UPDATE ve DELETE işlemlerinin her ikisi için de devreye girecek bir AFTER
trigger'ı yazılabilir. Aynı şekilde bir INSTEAD OF trigger'ı da yazılabilir. Ancak bu
durumda, UPDATE ve DELETE işlemlerinden herhangi biri için ikinci bir
INSTEAD OF trigger'ı tanımlanamaz.
10. Trigger'lar da Constraint'ler gibi belli bir süre için devre dışı bırakılabilirler.
Constraint'lerden farklı olarak, trigger pasif iken gerçekleştirilen işlemleri, trigger
aktif edildiğinde denetleyemez. Bunun için,
ALTER TABLE tablo_ismi
DISABLE TRIGGER trigger_ismi | ALL
yapısı kullanılır.
11. Bir tablo üstünde INSTEAD OF trigger varsa, ilk olarak bu tepkimeye girer. Arkasından Constraint tepki verebilir. Constraint'ten sonra, tanımlı bulunan
trigger'lardan biri devreye girer. Ancak hangisinin önce gireceği belirlenemez. Bu
nedenle, en son tepkimeye girecek nesne iki INSERT tirgger'ından biridir ancak
hangisi olacağı garanti edilemez. Garanti etmek için, bir tek AFTER INSERT
trigger'ı içerisinde bu iki trigger'ın uygun sırada çağrılması gerekir.
12. AFTER UPDATE trigger'ı devreye girdiğinde, hem Inserted hem de Deleted sözde
tablolarını oluşturur.
8. Bölüm
1.
Assembly, CLR temelli kodların dağıtım ve versiyonlama birimine verilen addır.
SQL Server için assembly sadece dll uzantılı CLR kütüphanelerine verilen addır.
2.
Bir veritabanının yedeği alındığında CLR bileşenleri ve assembly'ler de yedeklenir.
3.
Bir assembly içerisinde yer alan metotları ve tipleri görmek mümkündür.
SELECT * FROM sys.assembly_modules
Sorgusu bu türden bir bilgi almak için kullanılabilir.
Ek C: Bölüm Sonu Soru ve Cevapları
703
4.
CLR ortamında Stored Procedure, Trigger, Kullanıcı Tanımlı Fonksiyon, Kullanıcı
Tanımlı Tip ve Kullanıcı Tanımlı Grupsallar programlamak mümkündür.
5.
Trigger, Stored Procedure ve skaler tip kullanıcı tanımlı fonksiyonları sadece
metodları eşleştirmekle tanımlayabiliriz.
6.
Teorik olarak, CLR bileşenlerini T-SQL'e rağmen kullanmayı CPU'yu yoğun olarak
kullanan işlemler, .NET kütüphanesine gereksinim duyan programlar, düşük seviye
veri işlemi yapan ve veritabanı seviyeli veri erişimleri dışındaki işlemlerde kullanılır.
7.
Genelde Cursor yapılarından kaçınmak için ve sistemde hali hazırda bulunmayan grupsal
fonksiyonlar için grupsallar kullanmak gerekir. SUM fonksiyonunu biz yazdığınızda daha
hızlı çalışmaz. Çünkü gerçek SUM fonksiyonu alt seviyeli olarak gerçeklenmiştir.
9. Bölüm
1.
Uzaktaki bir SQL Server'daki verileri hızlı bir bağlantı üstünden, yereldeki SQL
Server'in içerdiği verilerle birlikte sorgulamanız gerekiyorsa bağlı sunucu tanımlayarak bu tanımlama üstünden sorgulamak yeterli olacaktır.
2.
Metin dosyalarını, Excel ve Access dosyalarını SQL Server'da birer tablo gibi sorgulayabiliriz. Bunun için OLE-DB Driver'larını dinamik olarak yükleyecek cümlecikleri yazarız veya
bir bağlı sunucu tanımlayıp bu sunucu üstünden bu kaynakları sorgulayabiliriz.
3.
Programlanabilir öğelerden Stored Procedure'ler ve Skaler sonuç döndüren kullanıcı tanımlı fonksiyonlar bir XML Web Servisi metodu olarak dışarıya açılabilir.
4.
Bir endpoint XML Web Servisi olarak yapılandırıldı ise, platform bağımsız olarak,
XML Web Servisi tüketebilen her türlü uygulama bağlanabilir.
5.
Service Broker mimarisini gerçeklemek için Tip, Contract, Mesaj, Kuyruk, Servis
Programı, Servis, Route gibi bileşenler kullanılır.
6.
Service Broker, SOA temelli mimariyi veritabanı seviyesinde gerçeklemek gerektiğinde kullanılır.
10. Bölüm
1.
ADO.NET 2 çeşit veri erişimine olanak sağlar: Bağlı Mod ve Kopuk mod.
2.
Aynı anda iki tane DataReader bir tek connection üstünden veritabanına ADO.NET
2.0'dan itibaren MARS desteği sayesinde erişebilir. Ayrı iki Command nesnesi ile.
3.
Bağlı modda bir veritabanı erişimi kodlamak için 1. Connection nesnesinin Open()
metodu, 2. Command nesnesinin dönecek değer türüne uygun bir metodu (Tabular
sonuç için ExecuteReader()) ve son olarak SqlDataReader üstünden herhangi bir
satıra erişebilmek için Read() metodu kullanılır.
4.
DataSet, veritabanının minyatür olanıdır. DataTable ve constraint gibi nenseler
içerir. DataSet için minyatür veritabanı tabiri kullanılmasının nedeni temel veritabanı bileşenlerini içermesinden kaynaklanmaktadır.
5.
Veri bağlama, veritabanından gelen verileri kullanıcı arayüzlerine ilintilendirme sistematiği demektir.
6.
ASP.NET, Hızlı Uygulama Geliştirme yaklaşımına SqlDataSource bileşeni ile destek verir.
EK D
DÜKKAN VERİTABANI ŞEMASI
706
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
EK E
CD KULLANIM KILAVUZU
CD Kullanım Kılavuzu
Kitapta anlatılan örnekleri en azından kısıtlı olarak çalıştırabilmeniz için lisanslama ücreti gerektirmeyen araçlardan bir kısmını CD içerisinde bulabilirsiniz.
Araçlar
Kitapta anlatılan örnekleri en azından kısıtlı olarak çalıştırabilmeniz için gerekli araçlardan bir kısmını CD içerisinde bulabilirsiniz.
SQL Server Express Edition
SQL Server 2008'in ücretsiz sürümü olan SSExpressEdition'ı CD içerisinde CDROM\
Araclar\SQLExpress yolunda bulabilirsiniz:
SQL Server 2008 Bileşenleri
SQL Server 2008 için BOL(Books Online) kurulumunu CDROM\Araclar\
SQLServer2008\SqlServer2K8_BOL_Apr2006_v2.msi adresinde bulabilirsiniz. Bu
dokümanı SQL Server hakkında yardım almak için kullanabilirsiniz.
SQL Server 2008 için Service-Pack 1 CD içerisinde yer olmaması nedeni ile yer almamaktadır. Ancak hangi adresten indireceğinizi CDROM\Araclar\SQLServer2008\
SQLServer2008_service_pack_1.htm adresinde bulabilirsiniz.
Ücretsiz bir çalışma ortamını sisteminizde ayarlamak için CDROM\Araclar\linkler\ altında yer alan html dosyalarını inceleyebilirsiniz.
Örnek Veritabanları ve Kurulumları
Kitap içerisindeki sorguların üstünde yapıldığı örnek veritabanlarını sisteminizde SQL
Sever 2008 varken attach etmek isterseniz EK-A'daki Attach-Deattach bahsine göz atınız.
İlgili veritabanları sıkıştırılmış olarak, CDROM\Veriler\ dizini altında aşağıdaki adlarla
yer almaktadır.
708
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Şekil E.1:
CD içerisinde yer
alan veritabanları
ve işlevleri
Veritabanı Adı
Veri Dosyası Adı
İşlev
Dukkan veritabanı
2000_dukkan_mdf_
ldf.zip
SQL Server 2000 formatında olan bu
veritabanını, eski formattaki bir veritabanını 2005'e dönüştürme konusunda,
SQL Server'in 2000 sürümü ile çalışıyorsanız, bu dosyayı attach ederek
kitap içeriğinin bir kısmını çalıştırabilirsiniz.
Dukkan Veritabanı
2008_dukkan_data_
mdf.zip
SQL Server 2008 kullanıcısı iseniz ve
örnekleri doğrudan SQL Server 2008
verileri üstünde çalıştırmak isterseniz
bu veritabanını kullanabilirsiniz.
Adventureworks
adventureworks.zip
Microsoft'un SQL Server 2005 için örnek bir bisiklet parçası üreticisi veritabanı Adventureworks'ü bu dosya içerisinde bulabilirsiniz.
Dikkat: Sıkıştırılmış olan bu dosyaları, SQL Server'a attach edebilmek için öncelikle diskinizde bir yere
açmanız gerekir.
SQL Server Veritabanı Sürüm Yükseltme Kılavuzu
Eski bir sürümde hali hazırdaki veritabanı sisteminizi SQL Server 2008'e aktarma konusunda CD\Araclar\SQL2008UpgradeTechRef.pdf dokümanına göz atabilirsiniz.
Çalışma Dökümleri
Her bir bölüme ait SQL ifadeleri dışındaki uygulama örneklerini, bazı alıştırmaları yapabilmeniz için gerekli ek bilgileri CDROM\CalismaDokumleri klasörü altında bulabilirsiniz.
Kaynakça
Ð
Addison Wesley, A First Look at Microsoft SQL Server 2005 for Developers
Ð
Apress, Advenced-Transact SQL for SQL Server 2000
Ð
Introducing Microsoft SQL Server 2005 for Developers
Ð
MS Press, MCSA/MCSE/MCDBA Self-Paced Training Kit: Microsoft SQL Server
2000 (Exam 70-228 ve 70-229 ) 2nd ed.
Ð
MS Press, Microsoft SQL Server 2000 Performance Tuning Technical Reference
Ð
Wrox, SQL Server 2000 Professional Database Design
Ð
SAMS, Teach Yourself SQL in 21 Days
Ð
Que, SQL Server 2000 Programming by Example
Ð
BYTE Türkiye, Veritabanı Programlama 1-2 Kitapçıkları
Ð
Microsoft, MSDN ve BooksOnline
Ð
www.verivizyon.com
Ð
www.csharpnedir.com
Ð
www.microsoft.com/sql
Ð
www.sswug.org
Ð
www.sqlservercentral.com
Ð
www. sqlnedir.com
Dizin
@@CONNECTION, 79
@@ERROR, 373, 379, 380, 390
@@IDENTITY, 135
@@ROWCOUNT, 390, 471
@@SERVERNAME, 79
@@TRANCOUNT, 444
@@VERSION, 79
1-N, 100, 101
A
Activity Monitor, 464, 465
ADD, 114, 147, 160, 162, 163, 164, 165, 168, 170,
267, 291, 390, 404, 408, 422, 424, 476, 503, 506,
531
Ad-Hoc, 376, 378, 548, 553, 592, 664
Aggregate, 77, 137, 214, 536, 537
AGGREGATE, 77, 214, 539
Alias, 128, 178, 203
ALTER, 70, 72, 73, 86, 113, 114, 115, 116, 117, 118,
119, 120, 121, 123, 147, 148, 159, 160, 162, 163,
164, 165, 168, 170, 172, 256, 258, 259, 261, 267,
291, 299, 300, 301, 302, 304, 306, 315, 353, 355,
360, 361, 362, 385, 390, 404, 406, 407, 408, 422,
424, 445, 446, 448, 457, 458, 470, 473, 476, 483,
484, 488, 489, 490, 503, 504, 505, 506, 528, 531,
552, 573, 587, 644, 645, 646
Anahtar, 47, 49, 87, 100, 104, 470, 476
AND, 165, 176, 181, 182, 183, 184, 193, 218, 238,
245, 274, 285, 286, 292, 304, 307, 311, 320, 321,
337, 350, 351, 352, 353, 355, 357, 360, 363, 481,
629, 667
ANSI SQL-92, 40
ANSI SQL-99, 211
API, 115, 334, 339, 340, 364, 497, 591, 594, 634, 668
APPLY, 387, 395, 396, 397, 413, 416, 417
AS, 79, 80, 120, 131, 141, 147, 163, 166, 178, 185,
192, 197, 198, 203, 207, 208, 215, 226, 227, 229,
230, 232, 233, 234, 235, 237, 238, 239, 240, 253,
254, 256, 258, 260, 261, 262, 263, 266, 268, 269,
298, 324, 331, 335, 336, 349, 350, 351, 352, 353,
354, 355, 356, 357, 360, 361, 362, 363, 364, 365,
366, 370, 371, 372, 377, 378, 380, 381, 384, 385,
389, 390, 391, 392, 393, 394, 395, 396, 397, 404,
412, 413, 424, 429, 434, 435, 436, 445, 446, 473,
475, 476, 477, 478, 479, 480, 481, 484, 485, 487,
488, 501, 524, 535, 580, 581, 582, 584, 585, 587,
600, 624, 651
ASC, 75, 176, 184, 227, 290
ASCII, 72, 129, 130, 131, 137, 191, 666
ASSEMBLY, 333, 498, 499, 500, 503, 504, 505, 506,
507, 524
AVG(), 77, 78
B
BETWEN.... AND...., 184
BIGINT, 394, 395, 473, 481
BIT, 321, 380, 394
Birincil Anahtar, 47, 87, 100, 383, 470
Books Online, 60, 82, 119, 187, 191, 207, 209, 215,
333, 347, 541, 551
BREAK, 332, 371
BULK, 119, 412, 429, 655, 656
Bütünlük, 156, 169
C
CASCADE, 85, 155, 169, 170, 480
CASE, 222, 330, 331, 343
CHECK, 155, 161, 164, 165, 166, 172, 256, 261, 262,
263, 264, 408, 531
CHECKPOINT, 465
cmd, 56, 314, 346, 462, 517, 519, 520, 524, 530, 593,
596, 597, 598, 600, 601, 602, 603, 607, 609, 610,
612, 613, 614, 615, 624
Collation, 120, 130, 131
COMMIT, 442, 443, 444, 445, 446, 448, 449, 454,
457, 458, 553
Compiling, 348
COMPUTE, 222, 249, 254, 255, 334
COMPUTED COLUMN, 147, 290
Concatenation, 190
Configuration Manager, 54, 87
CONTINUE, 333, 585
Contract, 572, 575
CONVERT, 80, 192, 193, 363, 384, 385, 401, 402, 463
Corelated, 198
712
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
COUNT(), 77
CREATE, 70, 72, 73, 82, 83, 84, 108, 109, 111, 112,
115, 116, 118, 134, 135, 139, 141, 142, 143, 144,
145, 146, 148, 149, 159, 160, 161, 162, 163, 164,
166, 168, 208, 231, 235, 253, 254, 255, 256, 258,
260, 261, 262, 263, 268, 269, 289, 290, 292, 293,
294, 295, 296, 297, 298, 299, 301, 303, 304, 306,
307, 315, 323, 349, 350, 351, 352, 354, 356, 357,
360, 361, 363, 365, 370, 377, 378, 380, 383, 384,
385, 389, 390, 391, 392, 393, 394, 395, 403, 404,
412, 422, 423, 424, 425, 429, 443, 444, 445, 448,
470, 472, 473, 475, 476, 477, 478, 479, 480, 481,
483, 484, 485, 486, 487, 498, 499, 500, 501, 524,
535, 539, 540, 544, 552, 574, 575, 576, 577, 580,
581, 582, 584, 585, 588, 596, 600, 613, 624, 644,
651, 667
CROSS APPLY, 396, 397, 416, 417
CROSS JOIN, 204, 208, 209, 213
CTE, 225, 226, 227, 228, 229, 230, 234, 247, 249, 395
CUBE, 220, 221, 222, 249
Ç
Çıktı Parametre, 361
D
DAC, 61, 62
Dal Seviye, 277
Database Tuning Advisor, 308, 310, 314, 316
DBCC, 122, 123, 124, 304, 305, 307, 444, 453, 505
DBCC SHRINKDATABASE, 123, 124
DBCC SHRINKFILE, 123
DEADLOCK, 467
DEALLOCATE, 335, 337, 338, 340, 371
DECLARE, 318, 319, 321, 323, 324, 327, 328, 332,
333, 334, 335, 336, 338, 340, 361, 362, 363, 364,
370, 371, 372, 389, 390, 394, 402, 418, 429, 473,
481, 485, 512, 544, 578, 580, 582, 584, 585
Default, 47, 108, 113, 114, 154, 155, 156, 157, 158,
159, 162, 163, 164, 167, 170, 172, 173, 184, 192,
312, 350, 357, 451, 549, 661, 696, 697
DELETE, 71, 73, 77, 86, 118, 148, 155, 169, 170, 226,
227, 241, 244, 245, 246, 247, 259, 284, 307, 325,
326, 327, 338, 341, 342, 362, 377, 378, 443, 448,
469, 470, 471, 472, 473, 477, 478, 479, 480, 481,
491, 514, 517, 527, 552, 652, 668
DENY, 82, 84, 85, 353
DESC, 71, 75, 176, 184, 185, 186, 227, 238, 240, 290,
337, 339
Deterministik, 77, 81, 390
Deve Notasyonu, 71
DISTINCT, 176, 177, 216, 371
Distributed Query, 551
Distributed Transaction, 553, 610
Domain, 156, 173, 551, 696
DROP, 70, 73, 86, 118, 124, 139, 143, 147, 148, 149,
163, 166, 172, 259, 295, 299, 301, 302, 303, 304,
306, 315, 327, 355, 370, 448, 470, 473, 483, 484,
488, 489, 503, 505, 506, 507, 528, 552, 644, 646,
668, 698
DTC, 609
Dukkan, 110, 116, 119, 120, 125, 142, 219, 256, 257,
267, 287, 300, 304, 305, 307, 311, 404, 405, 422,
458, 484, 490, 554, 571, 573, 575, 577, 579, 580,
581, 585, 587, 593, 595, 604, 607, 610, 616, 631,
644, 645, 646
E
ENCRYPTION, 256, 258, 353, 355, 389, 473, 588
Enterprise Manager, 114, 121, 122, 123, 150, 164,
167, 170, 298, 483, 488, 548
Entity, 155
Executing, 348
EXISTS, 176, 199, 200, 212, 329, 360, 377, 476, 477,
478, 479, 481
Explict, 444
Extend, 63, 64, 276, 464
F
FETCH, 335, 336, 338, 340, 371, 448
FILEGROWTH, 109, 111, 112, 114, 121, 267
FILENAME, 109, 111, 112, 114, 267
FILLFACTOR, 284, 287, 295, 296, 297, 300, 303, 306
Filtreli indeks, 294
Filtreli İndeks, 282, 293, 294
FLOAT, 133, 160
Fonksiyon, 48, 79, 179, 191, 192, 214, 222, 382, 388,
392, 393, 396, 494, 497, 500, 507, 528, 529, 530,
534
For, 409, 471, 473
FOR BROWSE, 334
FULL [OUTER] JOIN, 208
Dizin
G
GAM, 64
Geography, 564
Geometry, 564
GETDATE(), 79, 80, 81, 82, 95, 132, 155, 162, 192,
235, 350, 351, 352, 353, 355, 357, 363, 380, 383,
388, 390, 481, 485, 600
Girdi Parametre, 356
Global Değişkenler, 322
GO, 73, 79, 81, 149, 164, 208, 253, 254, 263, 350,
351, 353, 355, 356, 357, 360, 361, 362, 363, 377,
378, 380, 476
GOTO, 333, 381, 382
GRANT, 82, 83, 84, 85, 116, 353, 448
GROUP BY, 176, 198, 212, 216, 217, 218, 219, 220,
221, 222, 249, 256, 258, 266, 330, 331, 337, 338,
339, 401, 530, 536, 539, 540
GROUPING, 222, 540
H
HASH, 210
HAVING, 176, 218, 219, 249, 338, 666
Hesaplanmış Alan, 147, 424
HierarchyID, 139, 228, 555, 556
Hiyerarşik Veri, 100
HOLDLOCK, 452, 466
I
IDENTITY, 134, 135, 208, 238, 247, 260, 261, 265,
268, 269, 326, 383, 384, 412, 470, 485, 581, 584
IF ... ELSE, 328
IN, 176, 195, 196, 212, 232, 233, 234, 235, 236, 239,
243, 295, 300, 337, 371, 388, 394, 433
Indeks, 47, 51, 63, 64, 65, 122, 154, 159, 161, 252,
259, 260, 261, 266, 271, 272, 273, 274, 275, 276,
277, 278, 279, 280, 281, 283, 284, 285, 286, 289,
290, 291, 292, 293, 294, 295, 297, 298, 299, 301,
302, 304, 306, 307, 310, 311, 313, 315, 316, 402,
422, 423, 463, 464, 698
INDEXDEFRAG, 304
INNER JOIN, 176, 204, 205, 206, 210, 213, 218, 350,
355, 356, 357, 377, 391, 393, 395, 434, 475, 476,
478
INSERT, 73, 74, 75, 84, 86, 118, 135, 139, 146, 149,
155, 156, 164, 227, 231, 235, 241, 242, 243, 244,
246, 259, 260, 261, 263, 264, 269, 284, 325, 326,
713
327, 337, 351, 360, 380, 384, 385, 388, 392, 393,
394, 406, 407, 412, 416, 419, 429, 443, 444, 448,
449, 469, 470, 471, 472, 473, 475, 476, 478, 479,
480, 481, 485, 488, 491, 514, 528, 552, 553, 580,
581, 584, 596, 607, 610, 615, 635, 655, 656, 668
INSTEAD OF, 259, 469, 470, 471, 473, 480, 481, 482,
483, 489, 491, 527
INT, 86, 116, 135, 139, 149, 172, 208, 231, 263, 264,
319, 327, 332, 333, 356, 360, 363, 364, 365, 372,
377, 378, 383, 384, 385, 389, 390, 391, 393, 395,
403, 412, 422, 424, 429, 485, 512, 524, 534, 535,
600, 613, 651, 655
Intermediate, 277, 496
İ
İlişkisel Veritabanı, 39, 40, 41, 42, 53, 87, 96, 271,
281, 695
İş Katmanı, 50, 686
J
JOIN, 112, 118, 176, 202, 203, 204, 205, 206, 207,
208, 209, 210, 217, 218, 219, 222, 229, 230, 232,
233, 234, 243, 244, 245, 256, 258, 260, 284, 285,
331, 350, 351, 352, 353, 355, 356, 357, 365, 377,
391, 392, 393, 395, 396, 405, 433, 475, 476, 477,
478, 479, 481
L
LEFT [OUTER] JOIN, 176, 207
LIKE, 131, 165, 176, 180, 187, 188, 189, 190, 274,
314, 315, 357, 524, 597, 607, 632
LOG ON, 109, 111, 112
M
Macar Notasyonu, 71, 72
Management Studio, 49, 55, 56, 60, 69, 82, 87, 100,
108, 109, 114, 115, 117, 121, 122, 123, 124, 125,
143, 144, 145, 150, 151, 159, 161, 167, 171, 172,
268, 299, 302, 305, 309, 318, 350, 457, 458, 464,
470, 474, 475, 487, 500, 524, 548, 549, 553, 583,
639, 640, 644, 646, 647, 653, 657
Master, 61, 124, 587, 661
MAX(), 77, 233
MAXSIZE, 109, 111, 112, 114, 121, 267
MERGE, 210, 266
MIN(), 77, 233
714
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
Microsoft Search, 54
Mixed Extend, 63, 64
Mode, 49, 67, 68, 463, 663
Model, 90, 95, 102, 105, 119, 661
MODIFY, 114, 121
MONEY, 235, 318, 319, 324, 390, 444, 445, 446
MSDTC, 553
mssqlsystemresource, 62
N
NAME, 109, 111, 112, 114, 121, 267, 274, 500, 501,
524, 535, 539, 544, 576, 587
NEWID(), 135, 139, 140, 187, 326
N-N, 101, 102
NOLOCK, 450, 453, 455, 466
NORECOMPUTE, 300, 302
northwind, 113, 476, 549, 552, 553, 554, 595
NOT, 71, 73, 134, 143, 144, 145, 147, 148, 149, 159,
176, 181, 183, 195, 199, 200, 208, 212, 244, 245,
263, 268, 329, 337, 357, 363, 403, 422, 444, 476
NOT EXISTS, 176, 199, 200, 212, 244, 245, 329, 476
NOT IN, 195, 212
NULL, 72, 73, 78, 99, 119, 128, 134, 139, 142, 143,
144, 145, 147, 148, 149, 154, 156, 159, 161, 164,
165, 166, 167, 169, 170, 183, 184, 191, 206, 208,
214, 216, 220, 228, 229, 230, 233, 245, 258, 260,
263, 268, 298, 304, 337, 354, 357, 360, 363, 377,
378, 380, 383, 385, 389, 397, 401, 403, 417, 422,
432, 435, 436, 444, 473, 512, 537, 542, 581, 584,
629, 645
O
OLAP, 45, 51, 53, 61, 231, 235, 283, 284, 650
OLTP, 45, 51, 61, 283, 284, 287
OPENROWSET, 79, 412, 429, 551, 553, 554
OR, 164, 165, 166, 181, 182, 195, 243, 321, 337, 360,
363, 385, 478, 585, 629, 665, 666, 667, 668
ORDER BY, 75, 79, 176, 184, 185, 186, 212, 216, 217,
218, 227, 236, 237, 238, 239, 240, 246, 249, 254,
255, 275, 297, 330, 337, 338, 339, 340, 372, 401,
409, 411, 435, 530, 535
osql, 56, 57, 323, 664
P
PAD_INDEX, 284, 287, 295, 296, 297, 300, 303, 306
PAGLOCK, 466
Parametre, 57, 110, 137, 345, 356, 359, 360, 362,
374, 375, 402, 488, 520, 549, 551, 554, 595, 598
Parsing, 348
Persist, 141
PFS, 64
PI(), 179, 388
PIVOT, 225, 231, 232, 233, 234, 235, 247, 249, 331,
371
PL/SQL, 40
Point, 137, 447, 497, 564
Polygon, 564
PRINT, 323, 324, 329, 333, 380, 381, 384, 385, 484,
487, 518, 519, 581, 584
PROCEDURE, 47, 323, 350, 355, 377, 378, 380, 382,
384, 385, 576, 580, 581, 582, 584, 585, 587, 667
pubs, 73, 76, 77, 142, 253, 351
Q
Queue, 365, 572, 576
R
RAD, 633
RAISERROR, 373, 375, 376, 377, 378, 379, 381, 382,
398, 476, 477, 478, 479, 519
READ COMMITTED, 466
READ UNCOMMITTED, 466
READPAST, 466
RECOVERY, 118
Recursive, 482, 483
Rekürsif, 225, 228, 229, 230, 393
REPEATABLEREAD, 466
REPLACE(), 388
Resource, 463
REVOKE, 82, 85, 448
RIGHT [OUTER] JOIN, 176, 207
RMO, 647
ROLLBACK, 442, 443, 444, 445, 446, 447, 449, 453,
455, 463, 465, 467, 472, 476, 477, 478, 479, 482,
484, 553
ROLLUP, 221, 222, 249
Root, 407
ROWCOUNT, 246, 326, 337, 338, 343, 352, 380, 390,
394, 471, 582, 585
Dizin
ROWLOCK, 466
Rowset, 79
RULE, 47, 154, 166, 173, 323, 350
S
sa, 67, 79, 80, 167, 168, 169, 255, 354, 372, 445, 498,
595, 604, 625, 626, 627, 628, 635, 663, 664, 667
SAC, 58, 59, 583
Satır, 45, 46, 47, 78, 97, 129, 139, 145, 155, 175, 214,
237, 238, 240, 280, 335, 342, 448, 449, 455, 466,
618, 674
SCHEMABINDING, 256, 258, 259, 297, 298, 424, 505
Seçme, 39, 48, 69, 180
SERIALIZABLE, 452, 454, 455, 457, 466, 467
Serialisible, 452
Service Manager, 54
SET, 76, 119, 120, 123, 135, 139, 169, 170, 184, 191,
243, 244, 246, 269, 299, 301, 302, 319, 320, 321,
330, 337, 338, 343, 352, 353, 355, 356, 357, 360,
361, 362, 363, 370, 371, 372, 384, 385, 394, 402,
411, 418, 419, 420, 421, 445, 446, 453, 454, 455,
457, 458, 464, 465, 467, 473, 475, 483, 485, 498,
499, 503, 504, 512, 544, 553, 573, 580, 585, 609,
627, 629, 635
Seyrek Sütun, 142
Seyrek Tablo, 142
SGAM, 64
SHRINK, 118, 119, 123
SIN(), 388
SIZE, 109, 111, 112, 114, 121, 267
Skaler, 79, 270, 388, 390, 391, 511, 518, 529, 530,
533, 537, 598, 602
Skaler Fonksiyon, 79, 270, 390
SMALLDATETIME, 192, 380
SMO, 602, 639, 640, 641, 642, 644, 645, 646, 647,
648, 650, 655
Snap-shot, 454
sp_catalogs, 550
sp_columns_ex, 550
sp_executesql, 369, 372
sp_foreignkeys, 550
sp_helpdb, 114, 120, 347, 351, 388
sp_helptext, 257, 258, 346, 347, 350, 388, 474
sp_tables_ex, 550
SQL enjeksiyonu, 349, 666
Sql Profiler, 459, 468
715
SQL Server Agent, 54, 60
SqlCmd, 56, 57, 58
SSIS, 650, 657, 659, 660
STATISTICS, 118, 295, 300, 302, 307, 308, 349
Status, 122, 463, 610
Stored Procedure, 40, 48, 51, 67, 73, 157, 158, 241,
242, 253, 270, 323, 325, 334, 345, 346, 347, 348,
349, 350, 351, 353, 355, 356, 363, 364, 369, 383,
386, 387, 388, 398, 401, 429, 469, 491, 493, 494,
497, 504, 507, 509, 511, 514, 522, 523, 524, 525,
526, 528, 529, 534, 540, 550, 592, 596, 597, 599,
600, 601, 606, 607, 624, 640, 664, 667, 681, 686
SUM(), 77, 544
Sunum Katmanı, 50, 691
SUSER_SNAME(), 162, 667
Sütun, 41, 42, 46, 47, 86, 141, 147, 153, 156, 159,
161, 162, 164, 178, 264, 286, 374, 383, 398, 408,
462, 463, 479
sys.columns, 61
sys.databases, 61, 456, 573
sys.messages, 61, 373, 374, 375, 376, 382
sys.objects, 60, 61, 329
sys.types, 61, 143
syscomments, 257, 258, 348, 354, 473
sysdatabases, 109
sysmessages, 373, 375, 376
systypes, 143
T
Tablo, 40, 41, 42, 45, 51, 57, 61, 64, 66, 79, 87, 90,
97, 103, 110, 118, 125, 127, 129, 130, 133, 136,
137, 139, 145, 148, 153, 156, 166, 171, 177, 180,
181, 188, 191, 192, 193, 204, 206, 209, 211, 214,
226, 230, 233, 246, 257, 270, 272, 273, 279, 281,
284, 290, 304, 310, 317, 320, 321, 325, 326, 327,
340, 342, 348, 370, 374, 375, 378, 382, 383, 387,
391, 392, 393, 395, 396, 402, 413, 419, 431, 432,
443, 446, 452, 462, 463, 464, 466, 467, 471, 472,
479, 488, 494, 497, 499, 502, 513, 514, 518, 520,
527, 529, 533, 534, 537, 541, 549, 550, 551, 554,
572, 593, 595, 597, 598, 602, 618, 623, 626, 629,
630, 634, 640, 656, 664, 666, 672, 674, 677, 686
TABLOCK, 466
TABLOCKX, 466
tempdb, 61, 111, 148, 149, 300, 449, 459, 661
TEXT, 74, 95, 136, 137, 146, 293, 380, 401, 651
THEN, 222, 330, 331
716
Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
TINYINT, 163, 263, 383, 394
TOP, 186, 212, 226, 227, 246, 249, 324, 327, 337,
343, 372, 431, 432, 435, 436, 437, 578, 582, 585,
614
Transact SQL, 40, 69, 109, 164, 171, 298, 318, 346,
349
Transaction Log, 62, 107, 108, 110, 113, 121, 122,
125, 326, 491
Trigger, 40, 48, 51, 137, 153, 157, 171, 326, 334, 349,
401, 469, 470, 471, 472, 473, 475, 476, 477, 478,
480, 482, 483, 484, 486, 487, 488, 489, 490, 491,
493, 494, 497, 504, 507, 511, 514, 522, 526, 527,
528, 686
TRUNCATE, 124, 148, 246, 247, 364, 448, 472, 477,
654
TRY-CATCH, 333, 369, 373, 381, 382, 398, 445, 459
Tuning, 309, 310, 311, 312, 313, 314, 315, 709
Türetilmiş Sütun, 177, 178, 185, 190, 390
TYPE, 80, 143, 434, 464, 540, 544, 574, 575, 578, 580
U
Ulama, 74, 137
UNION, 204, 210, 211, 212, 227, 228, 229, 230, 262,
263, 264, 395, 554, 666
UNIQUE, 161, 162, 238, 278, 281, 290, 291, 298, 301,
315, 401
UNIQUEIDENTIFIER, 135, 578, 580, 582, 585
Uniform Extend, 63
UPDATE, 71, 73, 76, 86, 118, 139, 140, 146, 155, 169,
170, 184, 226, 227, 241, 243, 244, 246, 259, 261,
284, 308, 325, 326, 330, 341, 342, 349, 360, 363,
394, 418, 419, 420, 421, 443, 445, 446, 448, 449,
453, 454, 456, 457, 458, 464, 467, 469, 470, 471,
472, 473, 475, 478, 479, 480, 481, 488, 491, 514,
552, 596, 609, 627, 629, 635, 652, 668
UPDLOCK, 466
USE, 56, 58, 70, 73, 74, 76, 77, 82, 115, 120, 253,
267, 269, 300, 308, 311, 323, 340, 342, 351, 406,
453, 457, 458, 476, 580, 587, 596, 600, 656
USER, 48, 82, 115, 116, 118, 372, 384, 485
User Defined Type, 542
V
VARCHAR (MAX), 95, 146, 296, 402, 425
Veri Bütünlüğü, 153, 154, 157, 159, 166, 275, 620
Veri Katmanı, 50
Veri Kontrol Dili, 70, 82, 353
Veri Tanımlama Dili, 39, 53, 69, 70, 107, 127, 153,
201, 225, 251, 271, 289
View, 47, 61, 251, 252, 253, 254, 255, 256, 257, 258,
259, 260, 262, 263, 270, 297, 310, 311, 315, 350,
387, 388, 391, 408, 470, 471, 554, 630
W
WHEN, 222, 330, 331
WHERE, 75, 76, 77, 118, 139, 176, 180, 181, 182,
183, 184, 185, 187, 188, 189, 190, 193, 195, 196,
197, 198, 199, 200, 201, 202, 203, 204, 209, 216,
217, 218, 219, 226, 227, 228, 229, 230, 238, 239,
243, 244, 245, 247, 249, 253, 254, 261, 273, 274,
279, 281, 284, 285, 286, 292, 304, 307, 311, 314,
315, 316, 326, 327, 330, 337, 338, 342, 350, 351,
352, 353, 354, 355, 356, 357, 360, 363, 365, 372,
375, 377, 378, 388, 389, 390, 391, 393, 394, 395,
409, 411, 415, 419, 420, 421, 423, 425, 433, 434,
445, 446, 457, 458, 475, 477, 478, 479, 481, 485,
517, 524, 530, 573, 578, 579, 597, 600, 602, 603,
607, 609, 627, 628, 629, 632, 635, 651, 652, 665
WHILE, 317, 332, 333, 336, 338, 371, 394, 582, 585
WITH CHECK, 256, 261, 262, 264, 315
Workload, 310, 312
X
XACT_ABORT, 553
XLOCK, 466
XQuery, 41, 53, 138, 401, 402, 408, 409, 411, 412,
413, 414, 415, 416, 418, 419, 420, 423, 425, 439,
484, 584
XSD, 138, 401, 402, 403, 404, 405, 406, 408, 425,
433, 439, 484, 574
Y
Yığın, 323, 443
Z
Zamanaşımı, 465