July 31, 2017 | Author: erbaycankilickaya | Category: N/A
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:
[email protected] 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
[email protected] 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
[email protected] 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='
[email protected]' and sifre=0xffaa
Burada, '
[email protected]' 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 Üye Giriş Sayfası Kullanici Adiniz Sifreniz
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 " + yetkilendirmeBilgi.isim + " sitemize en son " + yetkilendirmeBilgi.sonGirisTarih +
Ek B: C# ve OOP Kılavuzu
693
" 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