Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
|
|
|
- Müge Olgun
- 10 yıl önce
- İzleme sayısı:
Transkript
1
2 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
3
4 Yaşar Gözüdeli YAZILIMCILAR İÇİN SQL SERVER 2008 ve VERİTABANI PROGRAMLAMA 4. BASKI Ankara, 2009
5 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama Yaşar Gözüdeli Bilgisayar Kitapları Dizisi: 99 ISBN Dördüncü Baskı: Haziran 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 Sıhhiye, ANKARA Tel: (0 312) (Pbx), Faks: (0 312) Şube: Ankara Adliye Sarayı K Blok Zemin Kat Sıhhiye, ANKARA Tel: (0-312) Şube: Abide-i Hürriyet Caddesi 259/4 (Şişli Ceza Adliyesi Altı) Şişli - İSTANBUL Tel: (0-212) Web Adresi: E posta: [email protected] Baskı: Sözkesen Matbaacılık, Tel: (0 312)
6 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.
7 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 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, adresine göz atabilirsiniz.
8 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
9 Ö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, 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, T- SQL '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!.
10 Ö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
11
12 Genel İçindekiler 1. Bölüm: VERİTABANI KAVRAMINA GİRİŞ ÜNİTE: İlişkisel Veritabanının Temelleri ÜNİTE : SQL Server 2008'in Temelleri ÜNİTE: T-SQL'e Genel Bakış Bölüm: VERİTABANI TASARIMI ÜNİTE: Veritabanı Tasarımına Genel Bakış ÜNİTE: Veritabanı Nesnesinin Temelleri ÜNİTE: Tabloları Tasarlamak ÜNİTE: Veri Bütünlüğünü Sağlamak Bölüm: VERİLERİ SORGULAMAK ÜNİTE: Basit Sorgular ÜNİTE: Tabloları Birlikte Sorgulamak ve Özetlemek ÜNİTE: İleri Veri Yönetim Teknikleri Bölüm: VERİ ERİŞİMİNİ İYİLEŞTİRMEK ÜNİTE: Viewlerle Çalışmak ÜNİTE: Indeks Teorisi ÜNİTE: Indeks Yönetimi Bölüm: T-SQL İLE PROGRAMATİK ÖĞELER KODLAMAK ÜNİTE: T-SQL ile Programlar Geliştirmek ÜNİTE: Stored Procedure'ler ÜNİTE: İleri T-SQL Programlama ÜNİTE: Kullanıcı Tanımlı Fonksiyonlar Bölüm: XML İLE ÇALIŞMAK ÜNİTE: Tip Olarak XML ÜNİTE: XML-İlişkisel Dönüşümler Bölüm: ORTAK ZAMANLILIK VE TRANSACTION ÜNİTE: Transaction'larla Çalışmak ve Ortak Zamanlılık ÜNİTE: Kilitlenmeleri Yönetmek ÜNİTE: Triggerlar Bölüm: SQL SERVER İÇİNDE CLR ÜNİTE: CLR Genel ÜNİTE: Basit Rutinler ÜNİTE: İleri Rutinler
13 12 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama 9. Bölüm: VERİTABANI YETENEKLERİNİ GELİŞTİRMEK ÜNİTE: Bağlı Sunucularla Çalışmak ÜNİTE: İlişkisel Olmayan SQL Server Yetenekleri ÜNİTE: Service Brokers Bölüm: İSTEMCİ TARAFTA SQL SERVER ERİŞİMİ PROGRAMLAMA ÜNİTE: ADO.NET Temelleri ÜNİTE: ADO.NET'de Kopuk Veri Yönetimi ÜNİTE: SQL Server Management Objects'i Kullanmak EK A: VERİTABANI PROGRAMCILARINA İPUÇLARI EK B: C# VE OOP KILAVUZU EK C: BÖLÜM SONU SORU CEVAPLARI EK D: DÜKKAN VERİTABANI ŞEMASI EK E: CD KULLANIM KILAVUZU
14 İç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 Giriş Veritabanı Programlama Hakkında Kitabın İçerdiği Örnekleri Test Edebilmek İçin Birikim Gereksinimleri Kimlere Hitabediyor Farklı Başlangıç Önerileri Kitap Neler İçeriyor Veritabanı Kavramına Giriş Veritabanı Tasarımı Veri Sorgulama Veri Erişimini İyileştirmek T-SQL ile Programatik Öğeler Kodlamak XML ile Çalışmak Ortak Zamanlılık ve Transaction SQL Server 2008 içinde CLR Veritabanı Yeteneklerini Geliştirmek İstemci Taraftan Veritabanı EK A - Veritabanı Programcılarına İpuçları EK B - C# ve OOP Kılavuzu EK C - Dükkan Veritabanı Şeması EK D - Bölüm Sonu Soru Cevapları EK E - CD Kullanım Kılavuzu Gösterimler ve İçerik Düzeni Hakkında Kaynak Dosyaları Destek ve Geri Bildirim Bölüm VERİTABANI KAVRAMINA GİRİŞ 1. ÜNİTE: İlişkisel Veritabanının Temelleri...39 TEMEL VERİTABANI KAVRAMLARI İlişkisel Veritabanı Kavramı İlişkisel Veritabanı Yaklaşımına Basit Bir Örnek... 41
15 14 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama İlişkisel Cebirin Temel Operatörleri Veritabanı Programlama Nerelerde Kullanılır? Temel Veritabanı Nesneleri Veritabanı Uygulamaları Üç N Katman Mimarisi...50 Veritabanı Atelyesi ÜNİTE: SQL Server 2008'in Temelleri...53 SQL SERVER BİLEŞEN MİMARİSİ Başlıca SQL Server 2008 Araçları SQL Server Configuration Manager Management Studio SqlCmd SQL Server Surface Area Configuration SQL Profiler Books Online SQL Server Veritabanı Mimarisi Standart Veritabanları Disk Yönetim Mimarisi SQL Server'de Disk Ölçümleri SQL Server'de Tablo ve Indeks'lerin Yönetimi Heap...65 Clustered Indeks...65 Nonclustered Indeks...65 SQL Server Kullanıcı Yönetim Mimarisi Roller Kullanıcılar İzinler Şemalar SQL Server Properties\Security Sekmesi...67 Veritabanı Atölyesi ÜNİTE: T-SQL'e Genel Bakış...69 Veri Tanımlama Dili Nesne Oluşturmak: CREATE 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 Nesne Silmek: DROP Veri İşleme Dili Veri Eklemek: INSERT... 73
16 İçindekiler 15 Veri Seçmek ve Filitrelemek: SELECT Ulama...74 Seçilen Kayıtları Sıralamak...75 WHERE Cümleciği ile Kayıtları Filitrelemek Verilerde Değişiklik Yapmak: UPDATE Veri Silmek: DELETE Fonksiyonlar Aggregate (Grupsal) Fonksiyonlar Rowset Fonksiyonlar Skaler Fonksiyonlar Deterministik Kavramı...81 Veri Kontrol Dili Yetki vermek: GRANT WITH GRANT OPTION Seçeneği ile Basamaklı Yetkilendirmek...84 Erişimi Engellemek: DENY Erişim Tanımını Kaldırmak: REVOKE Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrar Soruları Bölüm VERİTABANI TASARIMI 4. ÜNİTE: Veritabanı Tasarımına Genel Bakış...89 Kavram Model ORM ile Veritabanı Modelleme ER ile Modelleme ER ile Modelleme Aşamaları...93 UML ile Modelleme: Mantıksal Model Veri Normalizasyonu Normalizasyon Kuralları Kayıtların İlişkilendirilmesi Bire Bir İlişki (1-1) Bire Çok İlişki (1-N) İlişkisel Ortamda Hiyerarşik Veriyi Modellemek Çoka Çok İlişki (N-N) ER Diyagram ile Mantıksal Model Oluşturmak Fiziksel Model Veritabanı Atölyesi
17 16 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama 5. ÜNİTE: Veritabanı Nesnesinin Temelleri Dosya ve Dosya Gruplarını Anlamak Veritabanı Oluşturmak Management Studio ile Yeni bir Veritabanı Oluşturmak Transact SQL ile Veritabanı Oluşturmak Çoklu Dosya ve Dosya Gruplarını Kullanmak Dosya Grubu (File Group) Kavramı Default Dosya Grubu (Default File Group) Var Olan Bir Veritabanında Dosya ve Dosya Grubu Eklemek Veritabanına Erişecek Uygulama Kullanıcısını Ayarlamak Veritabanı İçerisinde Şema Kavramı Şemaları Yönetmek Veritabanını Yönetmek Veritabanı Seçeneklerini Ayarlamak Veritabanı Seviyeli Collation Ayarı Yapmak Veritabanı Dosyalarının Boyutunu Değiştirmek Veritabanı Dosyalarının Boyut Artımını Ayarlamak Otomatik Artırmaya Ayarlama Müdahale Ederek Artırmak Transaction Log Dosyasını Gözlemlemek Veritabanlarını Küçültmek (Shrinking) Veritabanlarını Silmek Veritabanı Atölyesi ÜNİTE: Tabloları Tasarlamak Nesne İsimlendirirken Sütunları Tasarlamak ve Veri Türleri Metin Veri Tipleri ASCII Veri Tipleri Unicode Metinsel Veri Tiplerinden Seçim Yapmak Collation Ayarları Tarih-Zaman Veri Tipleri Numerik Sayılar Yaklaşık Sayı Veri Tipleri Tamsayı Veri Tipleri IDENTITY() Fonksiyonu ile Otomatik Artan Sütunlar Tanımlamak Parasal Veri Tipleri Binary Veri Tipleri MAX İfadesi Eski LOB Veri Tiplerini Dönüştürmek XML Veri Tipi ve XML Verilerin Tasarlanması Özel Veri Tipleri
18 İçindekiler 17 Hesaplanmış Sütun Hesaplanmış Sütunu Sabitlemek (Persist Etmek) Seyrek Sütun ve Seyrek Tablo Kavramı Kullanıcı Tanımlı Veri Tipleri Kullanıcı Tanımlı Veri Tipleri (UDDT) ile Çalışmak CLR Kullanıcı Tanımlı Tipler Tabloları Oluşturmak Tablo Tasarımında Satır Boyutuna Karar Vermek Tablolar Üstünde Değişiklik Yapmak Sütun Eklemek Sütun Değiştirmek Sütun Silmek Tabloların veya Sütunların Adını Değiştirmek Tablo Silmek Geçici Tablolarla Çalışmak Nesnelerin T-SQL İfadelerini Almak Veritabanı Atölyesi ÜNİTE: Veri Bütünlüğünü Sağlamak Veri Bütünlüğünü Kavramları Tanımlamalı Veri Bütünlüğü Prosedürel Veri Bütünlüğü Veri Bütünlüğü Tekniği Seçmek Veritabanı Atölyesi Veri Bütünlüğünü Gerçeklemek Sütun Seviyeli Veri Bütünlüğünü Sağlamak Primary Key Constraint Oluşturmak Unique Key Constraint Oluşturmak Default Constraint Oluşturmak Default Nesnesi Oluşturmak Check Constraint Oluşturmak Rule Oluşturmak Tablo Seviyeli Veri Bütünlüğünü Sağlamak Sütunlar Arası Check Constraint Oluşturmak Foreign Key Constraint Oluşturmak Ardışık Bütünlük (Cascading Integrity) Constraint'leri Yönetmek Constraint'lere Göz Atmak Constraint'leri Silmek Constraint'leri Denetime Kapamak ve Açmak Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrarı
19 18 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama 3. Bölüm VERİLERİ SORGULAMAK 8. ÜNİTE: Basit Sorgular Kayıtları Seçmek: SELECT En Basit SELECT Sadece Belli Sütunları Seçmek Tekrarlamaları Tekile İndirgemek: DISTINCT Türetilmiş (Calculated) Sütunlar Aritmetik İşaretler Sütuna Takma Ad (Alias) Matematiksel Fonksiyonlar WHERE ile Satırları Filitrelemek Karşılaştırma İşaretleri Mantıksal Operatörler NULL Karşılaştırma Aralık Sorgulama: BETWEN... AND Kayıtları Sıralamak: ORDER BY Dönen Kayıt Sayısını Kısıtlamak: TOP SQL'DE Karakter ve Tarih İşlemleri Karakter Karşılaştırmaları: LIKE Deyimi Joker Karakterler Metinleri Ulamak (Concatenation) Başlıca Karakter Fonksiyonları Tarihleri Sorgulamak Tarih Fonksiyonları Alt Sorgularla Çalışmak IN ve NOT IN Tekil Sonuçlar Döndüren Alt Sorgular Çoklu Sonuç Döndüren Altsorgular Türetilmiş Tablolar İlintili (Corelated) Altsorgular EXISTS, NOT EXISTS Veritabanı Atölyesi ÜNİTE: Tabloları Birlikte Sorgulamak ve Özetlemek Tabloları Birleştirerek Sorgulamak Tabloya Takma Ad (Alias) Bir Tabloyu Kendisiyle Birlikte Sorgulamak INNER JOIN
20 İçindekiler 19 OUTER JOIN İfadeleri LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN CROSS JOIN SQL Server Açısından JOIN İşlemleri JOIN İçin İpucu Kullanmak Fark, Kesişim ve Birleşim Bulmak Veritabanı Atölyesi Verileri Gruplamak ve Özetlemek Gruplamalı Fonksiyonlar (Aggregate Functions) GROUP BY Deyimi Gruplamalar Üstünde Şart Koşmak: HAVING Gruplanmış Verileri Özetlemek CUBE Deyimi ROLLUP Deyimi GROUPING ile Özetleri Düzenlemek COMPUTE BY ve COMPUTE deyimi Veritabanı Atölyesi ÜNİTE: İleri Veri Yönetim Teknikleri CTE ve Rekürsif Sorgular CTE Hiyerarşik Sorgu için CTE'nin Rekürsif Kullanımı PIVOT ve UNPIVOT Operatörleri ile Veri Analizi PIVOT UNPIVOT Rütbeleme Fonksiyonları ile Kayıtları Sıralamak ROW_NUMBER() Parçalı Satır Numaraları Vermek RANK() ve DENSE_RANK() Fonksiyonları Sonuçları n Gruba Ayırmak: NTILE (ifade) Veri Değişimi Yönetimi Yeni Veri Eklemek Hakkında Püf Noktaları Sorgu Sonucunu Yeni Tabloda Saklamak Bir Sorgunun Sonucunu Varolan Tabloya Eklemek Verileri Güncellemek Tabloları Birleştirerek Veri Güncellemek Alt Sorgular Kullanarak Veri Güncellemek Verileri Silmek Tabloları Birleştirerek Veri Silmek Alt Sorgular Kullanarak Veri Silmek...245
21 20 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama TOP İfadesi Etkin Olarak Veri Silmek: TRUNCATE TABLE Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrarı Bölüm VERİ ERİŞİMİNİ İYİLEŞTİRMEK 11. ÜNİTE: Viewlerle Çalışmak VIEW'LERLE ÇALIŞMAK View'lere Neden İhtiyaç Duyarız View İçin Alternatifler View Oluşturmak Kısıtlamalar İzinler ve Sahiplik Zinciri Birden Fazla Tablodan Veri Çeken View'ler View'leri Yönetmek View Üstünde Değişiklik Yapmak Tanımlanan View'leri Görmek ve Sistem View'leri View Tanımlarını Gizlemek View Temel Tablolarının Şemasını Kilitlemek: SCHEMABINDING View'leri Silmek View'ler ve INSERT, UPDATE, DELETE İfadeleri Parçalı View Yapıları Parçalı Tablolar Oluşturmak Nesnelere Takma Ad: Synonymuslarla Çalışmak Veritabanı Atölyesi ÜNİTE: Indeks Teorisi INDEKSLERLE ÇALIŞMAK VTYS'ler Indeks'leri Nerelerde Kullanır? INDEKS MİMARİSİ Dengeli Ağaç (β-tree) Yapısı Heap Yapı Clustered Indeks Nonclustered Indeks
22 İçindekiler 21 SQL Server Indeks Türleri Unique Index Karma (Composite) Indeks Kapsam (Covering) Indeks Parçalı Indeksler Eklenti Sütunlu İndeksler Filtreli İndeksler XML Indeksler Full-Text Indeksler Veri Değişim İşlemlerinin Indekslere Etkisi FILLFACTOR ve PAD_INDEX Parametrelerine Karar Vermek Indeks Tanımlama Yaklaşımları Clustred Tanımlarken Non-Clustred Indeks Tanımlarken Veritabanı Atölyesi ÜNİTE: Indeks Yönetimi INDEKS OLUŞTURMAK Unique Index Kapsam (Covering) Indeks Oluşturmak INCLUDE Deyimi ile Eklenti Sütunlu Indeks Tanımlamak WHERE Deyimi ile Filtreli İndeks Tanımalak Indeks Seçeneklerini Ayarlamak Parçalı Indeksler Oluşturmak FILLFACTOR ve PAD_INDEX Parametrelerini Ayarlamak View Üstünde Clustered Indeks Tanımlamak Indeksler Hakkında Bilgi Almak Indeksler Üstünde Değişiklik Yapmak Indeksleri Yeniden Derlemek: REBUILD Indeksleri Yeniden Düzenlemek: REORGANIZE Indeksleri Kapatmak Indeks Seçeneklerini Değiştirmek Indeksleri Silmek Indekslere Bakım Yapmak Indekslerin Dağınıklıklarını Gözlemlemek Indeksleri Düzenlemek İstatistiklerin Veri Erişimine Etkisi İstatistik Oluşturmak
23 22 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama İstatistikleri Güncellemek Veritabanı Performans Araçlarını Kullanmak SQL Profiler ile Veritabanını Takip Etmek Database Tuning Advisor ile Veritabanı İyileştirmesi Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrarı Bölüm T-SQL İLE PROGRAMATİK ÖĞELER KODLAMAK 14. ÜNİTE: T-SQL ile Programlar Geliştirmek Programlama Dili Olarak T-SQL Değişken Tanımlama ve Kullanma Birleşik Operatörler Bit Seviye Operatörler Kod İçerisine Açıklamalar Eklemek Global Değişkenler ve Sistem Fonksiyonları Yığın Kavramı ve GO bölümleyicisi Print Komutu Tablo Tipi Değişkenler Kullanmak DML ifadeden Çıktı Veri Almak Akış Kontrolleri IF... ELSE Karar Yapısı CASE Deyimi CASE ile PIVOT Gerçeklemek While Döngüsü BREAK Komutu CONTINUE Komutu Cursorlerle Veri Yönetimi Transact-SQL Sunucu Cursor'ler Cursor'lerin Seçeneklerini Ayarlamak Cursor'lerle Satırları Dolaşmak Cursor Üstünden Kayıtları Düzenlemek Ortak Zamanlı (Concurrent) çalışma ve Cursor'ler Veritabanı Atölyesi ÜNİTE: Stored Procedure'ler Stored Procedure'lerle Çalışmak Stored Procedure'ler Oluşturmak Stored Procedure'ü Çalıştırmak NOCOUNT Oturum Parametresi'nin Kullanımı
24 İçindekiler 23 Stored Procedure'leri Yönetmek Stored Procedure'lerde Değişiklik Yapmak Stored Procedurelerde Parametrelerle Çalışmak Girdi Parametreler (Input Parameter) Girdi Parametre ile Stored Procedure Çağırmak Tablo Tipi Parametre Alan Stored Procedure'ler Kodlamak Parametre Geçerliliğini Denetlemek Çıktı Parametrelerle Çalışmak Çıkış Parametrelerini Almak RETURN deyimi Modül Çalıştırma Bağlamları: EXECUTE AS EXECUTE AS CALLER EXECUTE AS 'kullanici' EXECUTE AS SELF EXECUTE AS OWNER Veritabanı Atölyesi ÜNİTE: İleri T-SQL Programlama SQL Server 2008 T-SQL Ortamını Etkin Kullanmak Dinamik SQL Çalıştırmak EXEC Fonksiyonu ile Dinamik SQL Çalıştırmak sp_executesql ile Dinamik Sorgu Çalıştırmak T-SQL'de Hata Yakalama Mimarisi Sistem Mesajları: sys.messages Sisteme Yeni Mesaj Eklemek Sistemden Kullanıcı Tanımlı Mesaj Silmek Hata Mesajlarını Kullanmak: RAISERROR Parametreli Hata Mesajları Tanımlamak Oluşan Son Hatanın Kodunu Yakalamak: 379 Hata Kontrolü ve TRY-CATCH Yapısı Uygulama için Veritabanı Hata Yakalama Mimari Tasarımı dbo.tbhatagecmis Tablosu sp$hatayakala Stored Procedure'ü sp$hatayazdir Stored Prosedürü Hata Yakalama Mimarisi Kullanım Örneği Veritabanı Atölyesi ÜNİTE: Kullanıcı Tanımlı Fonksiyonlar Kullanıcı Tanımlı Fonksiyonlarla Çalışmak Kullanıcı Tanımlı Fonksiyonlarla Neler Yapabiliriz Skaler Kullanıcı Tanımlı Fonksiyonlar Türetilmiş Sütun Olarak Skaler Fonksiyon
25 24 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama Satırdan Tablo Döndüren Fonksiyonlar Çoklu İfade ile Tablo Döndüren Fonksiyonlar Rekürsif Sorgu için Örnek Fonksiyon Tablolarla Tablo Tipi Fonksiyonları Bileştirmek: APPLY CROSS APPLY OUTER APPLY Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrar Soruları Bölüm XML İLE ÇALIŞMAK 18. ÜNİTE: Tip Olarak XML XML Desteği Hibrit Veritabanı Gereksinimi XML Veri Tipini Kullanmak Değişken ve Parametre Olarak XML Tipi Tablolarda XML Veri Tipi Tip Tanımsız XML Veri İle Çalışmak Tip Tanımlı XML Veri İle Çalışmak XSD ve Schema Collections Nesneleri Şemalar Hakkında Bilgi Almak Tip Tanımlı XML Sütunlar Oluşturmak İlişkisel Seviye XML Tanımlamaları Kullanmak Kısıtlanmış (Constrainted) XML Veri Kullanmak XML Veri Üstünde Hesaplanmış Sütun Tanımlamak XML Veriyi Yönetmek ve Sorgulamak Bir Bakışta XML Sorgu Dili: XQuery XML Veri Tipi Metodları xml.query (string XQuery) xml.exist (string XQuery) xml.value (string XQuery, string SQLVeriTipi) xml.nodes (string XQuery) XML Veriyi Düzenlemek: xml.modify() insert İfadesi ile Yeni Bilgi Eklemek delete İfadesi ile Bir Bilgi Silmek replace value of İfadesi ile Düğüm Üstünde Düzenlemeler Yapmak Veritabanı Atölyesi
26 İçindekiler 25 XML Sütunlarda Indeks Tanımlamak Birincil XML Indeks Oluşturmak İkincil XML Indeks Oluşturmak Değer Temelli XML Indeksler Yol Temelli XML Indeksler XML Sütunlar Üstünde Hesaplanmış Alan ve İlişkisel Indeksler Tanımlamak Veritabanı Atölyesi ÜNİTE: XML-İlişkisel Dönüşümler İlişkisel-XML Veri Dönüşümleri OPEN XML FOR XML RAW Mod ile XML Veri Çekmek AUTO Modda XML Veri Çekmek EXPLICIT (Bilinçli) Modda XML Veri Çekmek PATH Modda XML Veri Çekmek Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrar Soruları Bölüm ORTAK ZAMANLILIK VE TRANSACTION 20. ÜNİTE: Transaction'larla Çalışmak ve Ortak Zamanlılık Transaction ve Ortak Zamanlılık Transaction Bloğu Nasıl Ele Alınır? Transaction Kavramı ve Transaction Modlarını Anlamak Harici (Explict) Transaction Modunda Çalışmak Harici Transaction Yönetimi TRY-CATCH Yapısı ile Transaction Hatası Yakalamak Sabitleme Noktaları (Save Points) Dahili (Implicit) Transaction Modu ve Yönetimi Ortak Zamanlılığı ve İzolasyon Seviyelerini Anlamak İzolasyon Sağlamak Ortak Zamanlı (Concurrent) Erişim Anomalileri İzolasyon Seviyeleri Snapshot izolasyon Seviyesi ve Satır Versiyonlama Transaction Bazlı Snapshot İzolasyon İfade Bazlı Snapshot İzolasyon Snapshot İzolasyonun Kazanım ve Maliyetleri Veritabanı Atölyesi
27 26 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama 21. ÜNİTE: Kilitlenmeleri Yönetmek Kilitlemeleri Yönetmek Kilitlemeleri Gözlemlemek Management Studio ile Kilitlenmeleri Takip Etmek ve Process Öldürmek Zaman Aşımı Ayarlamak Tablo Seviyeli Kilitlemeler Kilitleme İpucu Vermek Kilitleme Çıkmazı: Deadlock Veritabanı Atölyesi ÜNİTE: Triggerlar TRIGGER'LARI KAVRAMAK Trigger Ne Zaman Kullanılmalıdır Trigger Ne Zaman Kullanılmamalıdır Klasik Trigger'ın Özellikleri ve Kısıtlamaları Trigger'lar Nasıl Çalışır? TRIGGER OLUŞTURMAK INSERT Trigger'i DELETE Trigger'i UPDATE Trigger'i INSTEAD OF Trigger'ı KOMPLEKS TRIGGER'LAR Nested Trigger'lar Tanımlamak Recursive Trigger Tanımlamak DDL Trigger'lar Veritabanı Seviye DDL Trigger'larla Çalışmak Sunucu Seviyeli DDL Trigger'lar TRIGGER YÖNETİMİ Trigger'ları Silmek Veritabanı Seviyeli DDL Trigger'ları Silmek Sunucu Seviyeli DDL Trigger'ları Silmek Trigger'ları Tepkimeye Kapatmak Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrarı
28 İçindekiler Bölüm SQL SERVER İÇİNDE CLR 23. ÜNİTE: CLR Genel CLR ile Çalışmak SQL Server İçerisinde CLR Assembly Kavramı Kodların Kaynak Erişim Hakları NET Assembly'leri SQL Server'a Yüklemek T-SQL ile CLR Arasında Seçim Yapmak Veritabanında Assembly Yönetimi Assembly'ler Hakkında Bilgi Almak Assembly'leri Değiştirmek ve Silmek Assembly'ler Üstünde Değişiklik Yapmak Assembly'nin İçeriğini Değiştirmek Assembly'nin Seçeneklerini Değiştirmek Assembly Değişikliğinin Verilere Etkisi Assemblylere Ek Kaynaklar Eklemek ve Çıkartmak Assembly'leri Silmek SQL Server için CLR Bileşenler Programlamak Visual Studio'da SQL Server Projesi Oluşturmak Veritabanı Atölyesi ÜNİTE: Basit Rutinler SQL Server içerisinde Basit CLR Rutinleri Kodlamak SQL Server için CLR Kütüphanelerini Anlamak T-SQL ve CLR Tip Geçişi: System.Data.SqlTypes SQL CLR için Veri Sağlayıcıları SqlContext SqlConnection In-Process (Dahili İşlem) ve Out-Of-Process (Harici İşlem) Kavramları SqlCommand SqlParameter SqlPipe SqlDataReader SqlDataRecord SqlTransaction System.Transaction SqlTriggerContext CLR Stored Procedure'ler Oluşturmak CLR'da RETURN Deyimi ile SP'den Değer Döndürmek Stored Procedure'ler ile Transaction Kullanımı CLR Trigger'larla Çalışmak
29 28 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama CLR Kullanıcı Tanımlı Fonksiyonlar Oluşturmak Skaler Tipli Kullanıcı Tanımlı Fonksiyonlar Veritabanı Atölyesi ÜNİTE: İleri Rutinler CLR ile İleri Rutinler Kodlamak Tablo Tipli Kullanıcı Tanımlı Fonksiyonlar Kodlamak Kullanıcı Tanımlı Grupsallar Oluşturmak Serializable Kavramı ve Gereksinimi CLR Kullanıcı Tipleri Oluşturmak Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrar Soruları Bölüm VERİTABANI YETENEKLERİNİ GELİŞTİRMEK 26. ÜNİTE: Bağlı Sunucularla Çalışmak Dağıtık Sunucularla Bağlantı Tanımlamak Bir Bağlı Sunucu Tanımlama ve Yönetme Bağlı Sunucularda Güvenlik ve Erişim Dağıtık Sorgularla Çalışmak Bağlı Sunucular Üstünden Dağıtık Sorgular Çalıştırmak Dağıtık Sorgularda Transaction ve MSDTC Doğaçlama Dağıtık Sorgular (Ad-Hoc Distributed Queries) Veritabanı Atölyesi ÜNİTE: İlişkisel Olmayan SQL Server Yetenekleri HierarchyID Veri Tipini Anlamak Hiyerarşik veriye kavramsal bakış HierarchyID Veri Tipi ve Metotları Hiyerarşik Veriyi Eklemek Bir Düğümün Atalarını Listelemek Bir Düğümün Çocuklarını Listelemek Bir Düğümün Ana Düğümünü Değiştirmek Bir Seviyedeki Düğümleri Döndürmek Bir Düğümün Altına Düğüm Eklemek Uzaysal Veri Türlerini Anlamak Uzaysal Veri Kavramı ve Coğrafi Bilgi Sistemlerine Genel Bakış
30 İçindekiler 29 Uzaysal Veri Tiplerine Genel Bakış Uzaysal Veri Tipleri Metotları Uzaysal Veriyi Kaydetmek Uzaysal Veriyi Sorgulamak Alan Bulmak Kesişim Bulmak Mesafe Bulmak Veritabanı Atölyesi ÜNİTE: Service Brokers Service Brokers Mimarisini Anlamak Service Broker Altyapısının Sağladığı Bazı Önemli Özellikleri Bir Veritabanında Service Broker Desteğini Açmak Service Broker Nesnelerini Anlamak Service Broker Nesneleri Type Contract Queue Service Program Service Servisleri Konuşturmak Dialog (Diyalog) Nesnesi ve Mesajlaşmayı Anlamak Service Broker Uygulaması Gerçeklemek Gerekli Nesnelerin Oluşturulması Kullanıcı Kayıt İşlemleri Servisinin Kodlanması E-Posta Servisinin Bileşenlerinin Kodlanması Servislerin Aktifleştirilmesi Servislerin Çalışmalarının Test Edilmesi ve Gözlemlenmesi Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrarı Soruları Bölüm İSTEMCİ TARAFTA SQL SERVER ERİŞİMİ PROGRAMLAMA 29. ÜNİTE: ADO.NET Temelleri İstemci Taraf Veritabanı Uygulamaları Geliştirmek ADO.NET 2.0'ı Kavramak Online (Bağlı) Veri Erişim Modeli
31 30 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama SqlConnection Bağlantı Havuzlama (Connection Pooling) SqlCommand ile Veri Yönetimi SqlDataReader ve SqlServer'dan Veri Çekmek SqlParameter SQL Server 2005'de MARS Desteğini Kullanmak Yoğun Veri Kopyalamak: SqlBulkCopy Veri Değişimini Yönetmek SqlTransaction ile İstemci Taraflı Transaction Yönetimi CLR Kullanıcı Tanımlı Tipleri İstemci Tarafta Kullanmak Xml.XmlReader Sınıfı ve İstemci Tarafta Bağlantılı XML İşlemleri Veritabanı Atölyesi ÜNİTE: ADO.NET'de Kopuk Veri Yönetimi Offline (Kopuk) Veri Erişim Modeli DataSet Nesne Modelini Anlamak DataTable ve Veritabanından Veri Çekmek DataTable'larda Veri Bütünlüğü ve Constraint'ler DataSet içerisinde Birden Fazla DataTable İlişkilendirme ve Relations Kavramı SqlDataAdapter ile Kopuk Modelde Veri Erişimi Kopuk Modelde Veri Değişimini Yönetmek DataTable Açısından Veri Değişimi Değişimleri Veritabanına Geri Yansıtmak ASP.NET Uygulamaları ve Veri Bağlamaya Hızlı Bakış Veritabanı Atölyesi ÜNİTE: SQL Server Management Objects'i Kullanmak SMO Nesne Modelini tanımak SMO Nesne Modelini Uygulamalarda Kullanmak Server Nesnesininin Özelliklerini Almak SMO ile Veritabanında Nesneleri Yönetmek Yeni Bir Nesne Oluşturmak Var Olan Nesneyi Değiştirmek Nesne Silmek SMO Utility Class'ları Kullanmak Veritabanı Atölyesi Bölüm Sonu Özeti Bölüm Sonu Tekrar Soruları
32 İçindekiler 31 EK A VERİTABANI PROGRAMCILARINA İPUÇLARI SQL SERVER'DAN DAHA FAZLA YARARLANMAK Veri Sunum Katmanı Hakkında Veri Erişim Katmanı Hakkında Veritabanı Yönetimi SQL Server'in Diğer Yetenekleri Hakkında Reporting Services Veri Ambarlama ve OLAP SQL Server Integration Services (SSIS) XML Sütunları Full-Text Aramaya açmak SQL SERVER'DE VERİ ALIŞVERİŞİ Veri Dosyalarıyla Veritabanını Taşımak: Attach-Deattch Uygulama Verilerini Yedeklemek ve Yedekten Geri Dönmek Hakkında BCP ile Metin Dosyalarından Veri Alışverişi SQL Server Import and Export Wizard Kullanarak Veri Aktarımı Replication SQL Server 2000 veya 2005 Veritabanını SQL Server 2008'e Aktarmak Hakkında Aktarım Seçenekleri GÜVENLİK VE YETKİLENDİRME HAKKINDA Genel Güvenlik Önlemleri Hassas Bir Uygulama için Veritabanı Güvenlik Kontrol Listesi SQL Enjeksiyonu ve Karşı Önlemler Tektırnak Saldırılar Hata Verdirmeye Dayalı Saldırılar Stored Procedure Kullanan Saldırılar Genel SQL Enjeksiyon'larından Korunma Tedbirleri Sadece İyileri Kabul Etmek Kötüleri Reddetmek Kötüleri Filitreleyerek Kabul Etmek EK B C# VE OOP KILAVUZU C# İLE PROGRAMLAMAYA GİRİŞ KILAVUZU C# ile Merhaba Dünya Sınıflar Yazmak Değişkenler Değerler ve Veri Tipleri Tür Dönüşümleri Değer ve Referans Tipler Arası Dönüşüm: Boxing ve Unboxing
33 32 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama Döngüler ve Karar Yapıları if-else Karar Yapısı for Döngü Yapısı while Yapısı Nesnelerle Çalışmak Sınıflarda Erişim Seviyelerini Anlamak Yapıcı (Constructor) Kavramını Anlamak Metodları Aşırı Yüklemek Static Kavramını Anlamak Özetle Nesneye Dayalı Programlama n Katmanlı Mimari ve Sınıfların Rolü Üç Katmanı Tasarlamak İş Katmanını Tasarlamak Sunum Katmanını Tasarlamak EK C: BÖLÜM SONU SORU CEVAPLARI EK D: DÜKKAN VERİTABANI ŞEMASI EK E CD KULLANIM KILAVUZU CD Kullanım Kılavuzu Araçlar SQL Server Express Edition SQL Server 2008 Bileşenleri Örnek Veritabanları ve Kurulumları SQL Server Veritabanı Sürüm Yükseltme Kılavuzu Çalışma Dökümleri Kaynakça Dizin
34 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 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 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-
35 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 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. Farklı Başlangıç Önerileri 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. 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.
36 Giriş 35 Yaptığınızyapacağınız iş Başlangıç Seviye SQL Server Veritabanı Programcısı İleri - Orta Seviye SQL Server Veritabanı Programcısı Raporlama Uzmanı SQL Server 2005 Programcılar için Yenilikler Daha Önceden Bilmeniz gerekenler İlişkisel Veritabanı Hakkında genel bilgi SQL Server 2000 veya eşdeğeri bir VTYS ile proje geliştirmiş olmak Raporlama Ortamınızı Kullanmak SQL Server 2000 Programlamayı iyi seviyede bilmek SQL Server 2008 Yenilikler SQL Server 2005 Programcısı Kitabı kullanmak için öneri 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. 1. SQL Server 2005 yenilikleri hakkında fakir sahibi değilseniz ilk 3 bölüme göz atın 2. Takip eden 4 bölümden ihtiyacınız olanları okuyun 3. C# veya eşdeğeri bir dil bilmiyorsanız EK-B'yi okuyun Bölümü okuyun 5. 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 '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 'de yer alan veri sorgulamaya dair yeniliklere göz atın 'ün ilk üç konusunu okuyun 'de parçalı tablolar bahsini okuyun 'de yeni indeks seçeneklerine göz atın '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 'yi okuyun Bölümün tamamını okuyun Bölümün tamamını okuyun Bölümün ilk iki ünitesindeki yeniliklere göz gezdirin 'ü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 Ünite'de VALUES ifadesi ile çoklu satır üretimine ve MERGE ifadesine göz atın Ünite'de filtreli indekslere ve sıkıştırılmış indeks kullanımına göz atın Ünite'de T-SQL değişken tanımlama ve operatör yeniliklerine göz atın Ünite'de Tablo Tip parametre alan Stored Procedure konusuna göz atın Ünite'de XQuery ve let ifadesine göz atın Ü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ı.
37 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.
38 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.
39 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 adresinde kitap ve kapsamı hakkında ek bilgiler, kaynak dosyaları ve sunumlar bulabilirsiniz. Kitap hakkındaki fikirlerinizi doğrudan yayınevine iletebileceğiniz gibi, [email protected] adresinden okumaktan büyük zevk duyarım.
40 Birinci Bölümden EK A'ya Kadar Olan 31 Ünite Basılı Halde Kitap İçerisinde Bulunmaktadır.
41
42 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.
43 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) Şekil A.1: Integration Services'in diğer servislerle olan ilişkisi 8 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, 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. 8 Şekil adresinden alınmıştır.
44 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.
45 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
46 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 Şekil A.3: Veritabanınızın her ihtimale karşı yedeğini almanız faydalı olur. 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.4: Yeni bir Veritabanı yedeği hedefi tanımlamak oldukça kolaydır.
47 654 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama Ş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. 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. 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:
48 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
49 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.
50 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. Şekil A.7: Data Import- Export Wizard'ın başlatılması Şekil A.8: dovizler.txt dosyasının veri kaynağı olarak seçilmesi 2. Uygun olan kaynak seçilir. Örneğin biz düz metin dosyasına (*.txt) bağlanacağız.
51 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. Şekil A.10: Hedef olarak SQL Server içerisindeki dukkan veritabanının seçilmesi 3. Uygun olan hedef seçilir. Örneğin metin dosyasından SQL Server'e veri alacaksak, hedef SQL Server'dir. Şekil A.11: Kaynaktaki verilern hedefte hangi tablo(lara) aktarılacağına karar verin. 4. Kaynakta var olan tablolar getirilir ve kullanıcının hangi tabloları aktarmak istediği sorulur. İstediğiniz tabloları işaretleyin.
52 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. 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. Ş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.
53 660 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama Şekil A.15: İşlemlerin çalıştırılmasını raporlayan sonuç ekranı. 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. İ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 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.
54 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, 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)
55 662 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama 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ı. 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. 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 Kurulum Programı Farklı aktarım ve veri transfer 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 'te aldığınız bir yedeği SQL Server 2008'de restore edebilirsiniz. SQL Server '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.
56 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 '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 '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, 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.
57 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-
58 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, adresinden "OpenHack" kelimesini aratarak bilgi alabilirsiniz. 10. Güncel saldırı ve korunma yöntemleri hakkında bilgi almak için adresini takip edebilirsiniz. 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 and sifre=0xffaa Burada, 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.
59 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 ' = 79 O 82 R Ş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, 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)' 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ğ-
60 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) as int /* ** To public */ exec ('drop table ' <> 0 return(1) exec ('drop procedure ' <> 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.
61 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 ş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"," OR ","CHAR (" gibi ifadeler geçen kullanıcı girdileri varsa kabul edilmeyebilir. 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.
62 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 T- SQL 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.
63 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.
64 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);
65 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ü sbyte short int long byte ushort uint ulong float double char decimal bool Açıklama 8-bit işaretli tam sayı 16-bit işaretli tam sayı 32-bit işaretli tam sayı 64-bit işaretli tam sayı 8-bit işaretsiz tam sayı 16-bit işaretsiz tam sayı 32- bit işaretsiz tam sayı 64-bit işaretsiz tam sayı Tek duyarlıklı kayan noktalı sayı (yaklaşık değer ondalık) Çift duyarlıklı kayan noktalı sayı (daha büyük yaklaşık değer ondalık) 2-bytelık Unicode temelli tek harf saklayabilen değişken 28 basamak duyarlıklı kesin değer kaydedebilen ondalık sayı. 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;
66 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.
67 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.
68 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.
69 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.
70 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);
71 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);
72 Ek B: C# ve OOP Kılavuzu 679 Şekil B.7: Marka Sınıfı 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) 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.
73 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();
74 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;
75 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;
76 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.
77 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-
78 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-
79 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 İşlevi Projemizde Yer Alacak Dosya- Bileşen Adları Sunum İş Veri Kullanıcı ile etkileşim, iş katmanında kodlanmış nesneleri nüshalandırıp kullanmak. Sunum ve Veritabanı katmanları ile etkileşim. İş kurallarının sağlanması Tablolar, Trigger'lar, Stored Procedure'ler, Constraintler ve diğer veritabanı bileşenleri ile kurgulanmış veri mantığının sağlanması Login.aspx, Login.aspx.cs KullaniciVT.cs Guvenlik.cs tblkullanici, SP$yetkilendir 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
80 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,
81 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;
82 Ek B: C# ve OOP Kılavuzu 689 Cmd.CommandType = System.Data.CommandType.StoredProcedure; Cmd.Connection = Conn; // Parameter Cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@KullaniciKod", System.Data.SqlDbType.Int, 4)); Cmd.Parameters["@KullaniciKod"].Direction = System.Data.ParameterDirection.ReturnValue; // Parameter 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 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 Cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@yetkiSeviye", System.Data.SqlDbType.Int, 4)); Cmd.Parameters["@yetkiSeviye"].Direction = System.Data.ParameterDirection.Output; // Parameter Cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@sonGirisTarih", System.Data.SqlDbType.VarChar, 12)); Cmd.Parameters["@sonGirisTarih"].Direction = System.Data.ParameterDirection.Output; // Parameter 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();
83 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?
84 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 Ş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. 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.
85 692 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama Page language="c#" Codebehind="login.aspx.cs" AutoEventWireup="false" Inherits="Verivizyon.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <!--dosya: login.aspx--> <HTML> <HEAD> <title>üye Giriş Sayfası</title> <meta name="generator" Content="Microsoft Visual Studio.NET 7.1"> <meta name="code_language" Content="C#"> <meta name="vs_defaultclientscript" content="javascript"> <meta name="vs_targetschema" content=" </HEAD> <body> <form id="form1" method="post" runat="server"> <asp:label id="lblsonuc" runat="server"> </asp:label><br> Kullanici Adiniz<asp:TextBox id="txtkullanici" runat="server"> </asp:textbox><br> Sifreniz <asp:textbox id="txtsifre" runat="server" TextMode="Password"></asp:TextBox> <asp:button id="btnsubmit" runat="server" Text="Giris"> </asp:button> </form> </body> </HTML> Codebehind dosyası, Visual Studio tarafından otomatik oluşturulmakta. Bizim tüm yapmamız gereken, butonu çift tıklamak ve içerisine şu kodları eklemek: // yetkilendirmeyi yapacak sinifi olusturalim Verivizyon.KullaniciVT kullanici = new KullaniciVT(); //yetkilendirme sonucunu encapsulate edecek sinifi //olusturalim Verivizyon.YetkilendirmeBilgi yetkilendirmebilgi= new YetkilendirmeBilgi(); //YetkilendirmeBilgi.KullaniciYetkilendir() metodunu // nasıl çağırdığımıza ve // Şifrenin nasıl özetinin çekildiğine dikkat edin... yetkilendirmebilgi = kullanici.kullaniciyetkilendir(txtkullanici.text, Verivizyon.Bilesenler.Guvenlik.OzetCek(TxtSifre.Text)); if(yetkilendirmebilgi!= null){ LblSonuc.Text = "Merhaba <b>" + yetkilendirmebilgi.isim + "</b> sitemize en son <b>" + yetkilendirmebilgi.songiristarih +
86 Ek B: C# ve OOP Kılavuzu 693 "</b> tarihinde giris yaptiniz" ; Görüldüğü üzere, veritabanına doğrudan bir erişim yer almamaktadır. Sadece, bir alt katmanda oluşturulan sınıflar nüshalandırıldı (instantaiting) ve bu nesneler kullanıldı. Uygulama ilk başladığında, ilgili mesajı kullanıcılarımıza göstermek için, şu kodu da ekleyebiliriz: private void Page_Load(object sender, System.EventArgs e) { if (!IsPostBack) LblSonuc.Text = "Lütfen Kullanici adi ve sifrenizi giriniz."; Şekil B.15: Projenin çalışan hali
87
88 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
89 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()
90 Ek C: Bölüm Sonu Soru ve Cevapları İ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.
91 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)
92 Ek C: Bölüm Sonu Soru ve Cevapları 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
93 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.
94 Ek C: Bölüm Sonu Soru ve Cevapları 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.
95 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(ekleme- Silme 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.
96 Ek C: Bölüm Sonu Soru ve Cevapları 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.
97
98 EK D DÜKKAN VERİTABANI ŞEMASI
99 706 Yazılımcılar İçin SQL Server 2008 ve Veritabanı Programlama
100 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.
101 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.
102 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 ve ) 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. sqlnedir.com
103
104 Dizin , 379, 380, , 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
105 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
106 Dizin 713 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, 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
107 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
108 Dizin 715 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 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
109 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
110
111
112
113
114
Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü Veri Tabanı ve Yönetimi (BİL 301)
Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü Veri Tabanı ve Yönetimi (BİL 301) GENEL DERS BİLGİLERİ Öğretim Elemanı : Öğr. Gör. Erdal GÜVENOĞLU Ofis : MUH 313 Ofis Saatleri : Pazartesi: 10.00-12.00,
Microsoft SQL Server Sorgulama
Microsoft SQL Server Sorgulama Eğitim Takvimi Tarih Eğitim Süresi Lokasyon 26 Kasım 2018 3 Gün Bilginç IT Academy Eğitim Detayları Eğitim Süresi : 3 Gün Kontenjan : 12 Ön Koşullar : Herhangi bir ön koşul
«BM364» Veritabanı Uygulamaları
HAFTA 3 Veritabanı Tasarımı" Yaşar GÖZÜDELİ [email protected] http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları Konu Akışı Veritabanı Tasarımı Kuramlar Veritabanı Nesnesini Yapılandırmak
20461C Querying Microsoft SQL Server Modül Seviye Belirleme Testi
20461C Querying Microsoft SQL Server Modül Seviye Belirleme Testi 1) Aşağıdaki SQL Server sürümlerinden hangisi ana sürümlerden bir tanesidir? a) Parallel Data Warehouse b) Express c) Standart d) Developer
«BM364» Veritabanı Uygulamaları
HAFTA 8 DB içerisinde CLR Bileşenleri" Yaşar GÖZÜDELİ [email protected] http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları Konu Akışı SQL Server ve.net CLR SQL Server içerisinde
Her bölüm için kısa bazı girişler yapılacak ve bölüm içerisinde anlatılacak olan konuların genel başlıkları belirtilecektir.
Eğitim Adı Seviye Toplam Süre : SQL 2008 Sorgular Eğitim Serisi : Başlangıç/Orta/Yüksek : 56 Saat 05 Dakika 05 Saniye Video Adedi : 209 Merhaba arkadaşlar ben İLKER IŞIK yine www.yazilimhocasi.com katkılarıyla
«BM364» Veritabanı Uygulamaları
HAFTA 6 T-SQL ile Programlar Yazmak" Yaşar GÖZÜDELİ [email protected] http://blog.verivizyon.com/ygozudeli «BM364» Veritabanı Uygulamaları Konu Akışı Programlama dili olarak T-SQL Fonksiyonlar Programlamak
SQL Server 2008 ile Tanışma"
MODÜL 1 SQL Server 2008 ile Tanışma" Yaşar GÖZÜDELİ [email protected] http://blog.verivizyon.com/ygozudeli Modül-1 Konu Akışı SQL Server 2008 Yazılım Geliştirici Araçları SQL Server 2008 Mimarisine
Maltepe Üniversitesi Endüstri Mühendisliği Bölümü Veri Tabanı Yönetimi (END 210)
Maltepe Üniversitesi Endüstri Mühendisliği Bölümü Veri Tabanı Yönetimi (END 210) GENEL DERS BİLGİLERİ Öğretim Elemanı : Öğr.Gör. Erdal GÜVENOĞLU Ofis : MUH 312 Ofis Saatleri : Pazartesi: 14:00 14:50, Salı:
Veritabanı Tasarımı. Kullanıcı Erişimini Kontrol Etme
Veritabanı Tasarımı Kullanıcı Erişimini Kontrol Etme Konular Nesne ayrıcalıkları ve sistem ayrıcalıkları arasındaki farkı karşılaştırma Bir kullanıcının bir veritabanınaerişimini etkinleştirmek için gerekli
VERİ TABANI ve YÖNETİMİ
VERİ TABANI ve YÖNETİMİ Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü 2 BÖLÜM -12- TETİKLEYİCİ (TRIGGER) 3 Giriş Trigger lar Trigger lar Ne Zaman Kullanılmalıdır? Klasik Trigger ların Özellikleri
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ
BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ Dersin Adı Kodu Sınıf / Y.Y. Ders Saati (T+U+L) Kredi AKTS VERİ TABANI BG-313 3/1 3+1+0 3+0,5 5 Dersin Dili : TÜRKÇE Dersin Seviyesi : LİSANS
Veritabanı sistemlerinde veri bütünlüğünü sağlayabilmek için CONSTRAINTS olarak adlandırılan bazı zorlayıcı ifadeler kullanılabilir.
VERİ BÜTÜNLÜĞÜ VTYS lerde veri bütünlüğünü sağlamanın iki temel yolu vardır; Tanımlanabilir veri bütünlüğü ve prosedürel veri bütünlüğü. Tanımlanabilir veri bütünlüğü, tanımlanan nesnelerin kendi özellikleri
Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS
DERS BİLGİLERİ Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS İnternet Uygulamaları için Veritabanı Programlama EEE474 8 3+2 4 5 Ön Koşul Dersleri Dersin Dili Dersin Seviyesi Dersin Türü İngilizce
MİLLİ SAVUNMA ÜNİVERSİTESİ KARA HARP OKULU DEKANLIĞI BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DERS TANITIM BİLGİLERİ
MİLLİ SAVUNMA ÜNİVERSİTESİ KARA HARP OKULU DEKANLIĞI BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DERS TANITIM BİLGİLERİ Dersin Adı Kodu Sınıf / Y.Y. Ders Saati (T+U+L) Kredi AKTS Veritabanı Yönetimi 4 / Bahar (3+0+0)
SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır.
SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır. Bu dersimizde biz Microsoft SQL Server veritabanı sistemini kullanmayı öğreneceğiz. SQL Nedir? SQL Structured Query Language
VERİ TABANI YÖNETİM SİSTEMLERİ
VERİ TABANI YÖNETİM SİSTEMLERİ Veri Tabanı Nedir? Sistematik erişim imkânı olan, yönetilebilir, güncellenebilir, taşınabilir, birbirleri arasında tanımlı ilişkiler bulunabilen bilgiler kümesidir. Bir kuruluşa
PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.
PROGRAMLAMAYA GİRİŞ Öğr. Gör. Ayhan KOÇ Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay., 2007 Algoritma ve Programlamaya Giriş, Ebubekir YAŞAR, Murathan Yay., 2011
Elbistan Meslek Yüksek Okulu GÜZ Yarıyılı Ara Öğr. Gör. Murat KEÇECĠOĞLU
Elbistan Meslek Yüksek Okulu 2015 2016 GÜZ Yarıyılı 28-29 Ara. 2015 Öğr. Gör. Murat KEÇECĠOĞLU Indexler İndeks, tablolardan veri çekmek için gerekli sorgular çalıştırılırken gereken süreyi azaltmak amacıyla
VERİTABANI Veritabanı Yönetimi
VERİTABANI Veritabanı Yönetimi YAPILANDIRILMIŞ SORGULAMA DİLİ (SQL) Veritabanı yönetimi, veritabanının yapısal özelliklerini belirtmek ve değiştirmek, veritabanına kullanıcı erişimlerini ve yetkilerini
İlk Konsol Uygulamamız 2 İlk Windows Uygulamamız 9.Net Framework Yapısı 18 Neler Öğrendik 19. Veri Tipleri 24 Tanımlı Veri Tipleri 27 Basit Tipler 28
ix 1 İlk Konsol Uygulamamız 2 İlk Windows Uygulamamız 9.Net Framework Yapısı 18 Neler Öğrendik 19 23 Veri Tipleri 24 Tanımlı Veri Tipleri 27 Basit Tipler 28 Kayan Nokta Tipleri 30 Sayısal Veri Tipi Dönüşümleri
5 SQL- Yapısal Sorgulama Dili. Veritabanı 1
5 SQL- Yapısal Sorgulama Dili Veritabanı 1 SQL- Yapısal Sorgulama Dili SQL ifadeleri yapısal olarak üç gruba ayrılır. Veri Tanımlama Dili (DDL - Data Definition Language) Veri İşleme Dili (DML - Data Manipulation
SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'
Bu Derste Öğrenecekleriniz: 1- Veri Tabanı Adı Değiştirme 2- Nesnelerin Adını Değiştirme a. Tablo Adı Değiştirme b. Alan Adı Değiştirme c. Constraint (Kısıtlama) Adı Değiştirme 3- Tablo Düzenleme Komutları
DENİZ HARP OKULU BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ
DENİZ HARP OKULU BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜM BAŞKANLIĞI DERS TANITIM BİLGİLERİ Dersin Adı Kodu Sınıf/Y.Y. Ders Saati (T+U+L) Kredi AKTS Veri Tabanı Yönetimi BİM-324 3/II 3+0+0 3 4,5 Dersin Dili Dersin
SQL e Giriş. Uzm. Murat YAZICI
SQL e Giriş Uzm. Murat YAZICI SQL (Structured Query Language) - SQL Türkçe de Yapısal Sorgulama Dili anlamına gelmektedir ve ilişkisel veritabanlarında çok geniş bir kullanım alanına sahiptir. - SQL ile
Veritabanı Tasarımı. DML İşlemleri ve Görünümler
Veritabanı Tasarımı DML İşlemleri ve Görünümler Konular Basit bir görünümde DML işlemlerini gerçekleştiren bir sorgu yazma ve çalıştırma DML işlemleri kullanarak bir görünümü değiştirme yeteneğini kısıtlayan
İNTERNET PROGRAMCILIĞI DERSİ
İNTERNET PROGRAMCILIĞI DERSİ Dersin Modülleri İnternet Programcılığı 1 İnternet Programcılığı 2 İnternet Programcılığı 3 İnternet Programcılığı 4 İnternet Programcılığı 5 Kazandırılan Yeterlikler Programlama
Veritabanı. Ders 2 VERİTABANI
Veritabanı Veritabanı Nedir? Birbiri ile ilişkili verilerin bir arada uzun süreli bulundurulmasıdır. Veritabanı bazen Veritabanı Yönetim sistemi veya Veritabanı Sistemi yerine de kullanılır. Gerçek dünyanın
Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language)
Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language) Konular Yapısal SQL Komutları Gruplama İşlemi SQL Fonksiyonları Kaynaklar 2 SQL (Structured Query Language) SQL Carlos
VERİ TABANI UYGULAMALARI
VERİ TABANI UYGULAMALARI VERİ TABANI NEDİR? Bir konuyla ilgili çok sayıda verinin tutulmasına, depolanmasına ve belli bir mantık içerisinde gruplara ayrılmasına veri tabanı denir. Veri tabanı programları;
Veri Tabanı Programlamaya Giriş
Veri Tabanı Programlamaya Giriş Kitap özeti Veri Tabanı Programlamaya Giriş SQL insanların veritabanı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil sayesinde, bir veritabanından kayıtları
Elbistan Meslek Yüksek Okulu GÜZ Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU
Elbistan Meslek Yüksek Okulu 2015 2016 GÜZ Yarıyılı Öğr. Gör. Murat KEÇECĠOĞLU GÖRÜNÜM Görünüm (view), Sorguları basitleştirmek, Erişim izinlerini düzenlemek, Farklı sunuculardaki benzer verileri karşılaştırmak
T.C. MALTEPE ÜNĠVERSĠTESĠ MÜHENDĠSLĠK FAKÜLTESĠ ENDÜSTRĠ MÜHENDĠSLĠĞĠ BÖLÜMÜ LĠSANS PROGRAMI 2010-11 Güz Yarıyılı
T.C. MALTEPE ÜNĠVERSĠTESĠ MÜHENDĠSLĠK FAKÜLTESĠ ENDÜSTRĠ MÜHENDĠSLĠĞĠ BÖLÜMÜ LĠSANS PROGRAMI 2010-11 Güz Yarıyılı VERĠ TABANI VE YÖNETĠMĠ BIL301 6 AKTS Kredisi 3. yıl 5. yarıyıl Lisans Zorunlu 4 saat/hafta
SQL Komutları (2) Uzm. Murat YAZICI
SQL Komutları (2) Uzm. Murat YAZICI Sıralama Sıralama işlemi için SELECT ifadesinde ORDER BY kullanılır. Bu ifadede ASC kelimesi kullanılırsa sıralama küçükten büyüğe doğru (A-Z), DESC kullanılırsa büyükten
Değerlendirme Soruları 140. Şerit Kullanımı 124 Şerit Sekmeleri 124 Şeridi Gizleme 125 Eklentiler 125
! 1 Excel Nedir? 2 Excel in Gelişimi 2 Yeni Özellikler 11 Görünüm 11 Bulut Desteği 11 Şablonlar 14 Anlık Veri Çözümleme 16 Hızlı Veri Doldurma 17 Grafik Önerileri (Recomended Charts) 17 Dilimleyiciler
Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır.
18 SQL SORGU DİLİ SQL (Structured Query Language) yapısal sorgu dili, veritabanı yönetim sistemlerinin standart programlama dili olarak bilinmektedir. SQL dilinin Access içinde sorgu pencerelerinde veya
VERİ TABANI ve YÖNETİMİ
VERİ TABANI ve YÖNETİMİ Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü 2 BÖLÜM -10- FONKSİYONLAR 3 Giriş Geçen haftaki derslerimizde Görünümleri (View) ve Stored Procedure (SP) leri öğrendik. Bu hafta
Advanced Oracle SQL Tuning
Advanced Oracle SQL Tuning Eğitim Takvimi Tarih Eğitim Süresi Lokasyon 30 Ekim 2018 2 Gün Bilginç IT Academy Eğitim Detayları Eğitim Süresi : 2 Gün Kontenjan : 16 Ön Koşullar : Herhangi bir ön koşul yoktur.
Pursaklar İMKB Teknik ve Endüstri Meslek Lisesi
Modül 1: Eylül 3 (1) Veritabanı kavramını bilme. Tablo kavramını bilme. İlişkisel veritabanı kavramını bilme. Tablo yapısını tanımlayabilme. Tablolar arasında ilişkiler kurabilme. Anahtar alan kavramını
Yukarıdakilerden hangileri DML (Data Manipulation Language) ile gerçekleştirilir?
1) I. Tablo Oluşturma II. Veri Güncelleme III. Veri Silme IV. Veri Ekleme V. Tablo Silme Yukarıdakilerden hangileri DML (Data Manipulation Language) ile gerçekleştirilir? a) I, IV ve V b) II, III ve IV
Oracle da kullanılan veri tipleri:
ORACLE A GİRİŞ Oracle ile SQL Server ı karşılaştıralım, 1 Oracle da veritabanı yerine kullanıcı oluşturulur. Kullanıcılar veritabanı gibi davranır. 2 Tablo oluşturma, yapısını değiştirme, silme kodları
Üst Düzey Programlama
Üst Düzey Programlama JDBC (Java Database Connectivity) Üst Düzey Programlama-ders07/ 1 JDBC JDBC ilişkisel veritabanlarına erişim için Java dilinde kullanılan standart bir kütüphanedir. Bu kütüphanedeki
1. MİCROSOFT SQL SERVER 2014'E GİRİŞ
VERİ TABANI YÖNETİM SİSTEMLERİ-II 1. MİCROSOFT SQL SERVER 2014'E GİRİŞ HİTİT ÜNİVERSİTESİ SUNGURLU MESLEK YÜKSEKOKULU BİLGİSAYAR TEKNOLOJİLERİ BÖLÜMÜ BİLGİSAYAR PROGRAMCILIĞI / 2. SINIF-GÜZ DÖNEMİ MS SQL
VERİ TABANI SİSTEMLERİ
VERİ TABANI SİSTEMLERİ 1- Günümüzde bilgi sistemleri Teknoloji ve bilgi. 2- Bilgi sistemlerinin Geliştirilmesi İşlevsel Gereksinimleri 1.AŞAMA Gereksinim Belirleme ve Analiz Veri Gereksinimleri Gereksinimler
AOSB 2017 EĞİTİM PROGRAMI
Eğitimin Konusu : Makro Excel Eğitim Tarihi : 04-05-10-11-12 Mayıs 2017 Eğitim Hedef Kitlesi : Excel kulllanıcıları arasında pratiklik ve hız kazanmış, Excel fonksiyonları, Veri Analizi araçlarını kullanma
Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015
Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015 KONU BAŞLIKLARI 1. Yazılım Mimarisi nedir? 2. Yazılımda Karmaşıklık 3. Üç Katmanlı Mimari nedir? 4. Üç Katmanlı Mimari
Veri Tabanı Hafta Dersi
Veri Tabanı - 1 7. Hafta Dersi Dersin Hedefleri SQL Yapısal Sorgulama Dili Veri Tanımlama Dili (DDL) Create Alert Drop Veri tanımlama dili verinin ne olduğundan çok verinin tipi ile ilgilenir. Veri tabanı
Ders Kodu Yarıyıl T+U Saat Kredi AKTS. Programlama Dilleri
DERS BİLGİLERİ Ders Kodu Yarıyıl T+U Saat Kredi AKTS Programlama Dilleri 356 6 2+2 4 5 Ön Koşul Dersin Dili Dersin Seviyesi Dersin Türü Dersi Veren Öğretim Elemanı Türkçe Lisans Zorunlu Arş. Grv. İlyas
Veritabanı Tasarımı. Introduction to the Oracle Academy
Veritabanı Tasarımı Introduction to the Oracle Academy Hedefler Bu ders şu hedefleri içermektedir. Akademide yer alındığında elde edilebilecek iş imkanları, maaş durumları ve fırsatlarla ilgili örnekler
2-Veritabanı Yönetim Sistemleri/ Temel Kavramlar
2-Veritabanı Yönetim Sistemleri/ Temel Kavramlar Öğr. Gör. Saliha Kevser KAVUNCU Veritabanı neden kullanılır? Veritabanının amacı; insanların ve organizasyonların birşeyleri takip edebilmesine yardımcı
Veritabanı İşlemleri
Veritabanı İşlemleri Bu bölümde; Veritabanı bağlantısı Komutların Yürütülmesi ADO.NET Nesne Modeli kavramları incelenecektir. ADO.NET (ActiveX Data Objects) ADO.NET, var olan Windows API lerinden çok daha
ELIF KIOTZEOGLOU RESUL MURAD MERT PACOLARI
ELIF KIOTZEOGLOU 0510130077 RESUL MURAD 0510120082 MERT PACOLARI 0510120083 SQL SQL,(İngilizce "Structured Query Language", Türkçe: Yapılandırılmış Sorgu Dili) verileri yönetmek ve tasarlamak için kullanılan
Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say
İÇİNDEKİLER 1. Bilgisayarın Yapısı Ve Programlama Dilleri Giriş 1 Bilgisayar ve Programlamanın Kısa Bir Tarihçesi 2 Donanım ve Yazılım Kavramları 3 Bilgisayarın Donanımsal yapısı 4 Giriş Birimi (Input
SQL'e Giriş. SELECT Deyimi. SQL Komutları. 1. DDL (Data Definition Language - Veri Tanımlama Dili)
SQL'e Giriş SQL komutları kullanılarak aşağıdaki işlemler yapılabilir: Veritabanı nesnelerinin oluşturulması ve bu nesnelerle ilgili işlemlerin yapılması Bilgilerin istenilen koşullara göre görüntülenmesi
1 MICROSOFT SQL SERVER A GENEL BAKIŞ
İÇİNDEKİLER XV İÇİNDEKİLER 1 MICROSOFT SQL SERVER A GENEL BAKIŞ 1 Veritabanı Kavramına Giriş 1 Veritabanı Nedir? 1 SQL, T-SQL ve Veritabanı Programlama 2 İlişkisel Veritabanı Yönetim Sistemi 3 SQL Server
İNTERNET PROGRAMLAMA 2 A S P. N E T. Marmara Teknik Bilimler MYO / Hafta 5 Veri Tabanı İşlemleri
İNTERNET PROGRAMLAMA 2 A S P. N E T Marmara Teknik Bilimler MYO / Hafta 5 Veri Tabanı İşlemleri VERİTABANI BAĞLANTISI Site içindeki bilgilerin saklanması / düzenlenmesi ve kullanıcı etkileşiminin sağlanabilmesi
VERİ TABANI YÖNETİM SİSTEMLERİ
VERİ TABANI YÖNETİM SİSTEMLERİ ÖĞR.GÖR.VOLKAN ALTINTAŞ 26.9.2016 Veri Tabanı Nedir? Birbiriyle ilişkisi olan verilerin tutulduğu, Kullanım amacına uygun olarak düzenlenmiş veriler topluluğunun, Mantıksal
1 Temel Kavramlar. Veritabanı 1
1 Temel Kavramlar Veritabanı 1 Veri Saklama Gerekliliği Bilgisayarların ilk bulunduğu yıllardan itibaren veri saklama tüm kurum ve kuruluşlarda kullanılmaktadır. Veri saklamada kullanılan yöntemler; Geleneksel
ÖĞRENME-ÖĞRETME YÖNTEM VE TEKNİKLERİ. gösterip yaptırma, uygulamalı çalışma. Anlatım, soru-cevap, gösterip yaptırma, uygulamalı çalışma.
KASIM EKİM EYLÜL AY 02.11.2009 06.11.2009 26.10.2009 0.10.2009 19.10.2009 2.10.2009 12.10.2009 16.10.2009 05.10.2009 09.10.2009 28.09.2009 02.10.2009 24.09.2009 25.09.2009 09.11.2009 1.11.2009 MODÜL: İNTERNET
EBE-368 Veri Tabanı Yönetim Sistemleri İlişkisel Model (The Relational Model)
EBE-368 Veri Tabanı Yönetim Sistemleri İlişkisel Model (The Relational Model) Dr. Dilek Küçük İlişkisel Model [1] Günümüzde en yaygın kullanılan veri tabanı modelidir. Bir ilişkisel veri tabanı bir veya
Turquaz. Açık kodlu muhasebe yazılımı http://www.turquaz.com. Turquaz Proje Grubu
Turquaz Açık kodlu muhasebe yazılımı http://www.turquaz.com Turquaz Proje Grubu Konu Başlıkları 1. Turquaz Proje Grubu 2. Programın fikri 3. Geliştirme aşaması 4. Programın içeriği 5. Yapılacaklar 6. Dizayn
SQL'e Giriş. SELECT Deyimi. SQL Komutları. Yardımcı Deyimler
SQL'e Giriş SQL komutları kullanılarak aşağıdaki işlemler yapılabilir: Veritabanı nesnelerinin oluşturulması ve bu nesnelerle ilgili işlemlerin yapılması Bilgilerin istenilen koşullara göre görüntülenmesi
PostgreSQL ve PL/pgSQL
PostgreSQL ve PL/pgSQL Adnan DURSUN Uygulama tasarım ve geliştiricisi @ : adnandursun.at.asrinbilisim.com.tr : +AdnanDURSUN Sunum Akışı PL/pgSQL nedir PL/pgSQL neden kullanmalıyız PL/pgSQL in yapısı Saklı
8 Oracle da tablo yapısı içinde otomatik artan kolon yoktur. (identity kolon
ORACLE GİRİŞ Oracle ile SQL Server ın karşılaştıralım. 1 Oracleda veritabanı yerine kullanıcı oluşturulur. Kullanıcılar veritabanı gibi davranır. 2 Tablo oluşturma, değiştirme ve silme kodları aynı. 3
Microsoft Office Access Ders İçeriği 25 Saat. Access Temel 10 saat
Microsoft Office Access Ders İçeriği 25 Saat Access Temel 10 saat 1) Bölüm 1 : Office Çalışma Alanı Temelleri a) Temel Pencere Bileşenleri b) Backstage Görünümünü Tanıma c) Şerit İle Çalışma d) Hızlı Erişim
DSİ kapsamında oluşturulan dağınık durumdaki verilerinin düzenlenmesi, yeniden tasarlanarak tek bir coğrafi veri tabanı ortamında toplanması,
Projenin Amacı DSİ Genel Müdürlüğünde, Bölge Vaziyet Planı çalışmaları kapsamında üretilen ve mevcut DSİ faaliyetlerini içeren CBS veri setleri ile CBS Veritabanının incelenerek yine mevcut CBS donanım,
Mysql Veritabanı Komutları
Mysql Veritabanı Komutları Mysql Veri Tabanı Komutları Hazırlayan : M. Başar ACAROĞLU Kaynaklar: http://www.hrzafer.com/sql-dersleri http://www.w3schools.com/sql/default.asp Veri Tabanı Nedir? Mysql Veritabanı
Kepware Veritabanı Ürünleri. Teknolojiye Genel Bir Bakış
Kepware Veritabanı Ürünleri Teknolojiye Genel Bir Bakış Gündem Veritabanı Client API teknolojisinin gözden geçirilmesi ODBC istemci sürücüsü- bir KEPServerEX Plug-In Haberleşme Sürücüsüdür. DataLogger-
1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2
İÇİNDEKİLER VII İÇİNDEKİLER 1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2 2 RUBY KURULUMU 3 Windows İçin Ruby Kurulumu 3 Ubuntu ve Debian İçin Ruby Kurulumu 6 Mac
ANKARA ÜNİVERSİTESİ ELMADAĞ MESLEK YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI PROGRAMI DERS İÇERİKLERİ
ANKARA ÜNİVERSİTESİ ELMADAĞ MESLEK YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI PROGRAMI DERS İÇERİKLERİ TDİ111 TÜRKDİLİ 1 1. Dil, diller ve Türk dili 2. Dil bilgisi, sözcük, cümle 3. Kelime Türleri 4. Anlatımın
İş Zekası için Dört-Katmanlı Veri Modellemesi Gerçekleştirimi. Harun Gökçe EG Yazılım, TOBB ETÜ
İş Zekası için Dört-Katmanlı Veri Modellemesi Gerçekleştirimi Harun Gökçe EG Yazılım, TOBB ETÜ İçerik İş Zekası Kavramı Tarihçesi İş Zekası Tanım, Kavramlar ve Gereklilik Dört-Katmanlı Veri Modellemesi
Basit SQL Sorguları Veritabanından verilerin SELECT cümleleri ile alınması işlemine sorgulama denir.
SQL SELECT CÜMLELERİ Oracle birçok kullanışlı ve güçlü özellikleri olan bir veritabanıdır. Bu özelliklerinin birçoğu SQL ile ilgilidir. VTYS lerinin çoğunluğunda veriler ile çalışmak için SQL kullanılmaktadır.
1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.Net Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5
İÇİNDEKİLER IX İÇİNDEKİLER 1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.Net Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5 2 VISUAL STUDIO GELİŞTİRME
VERİ TABANI YÖNETİM SİSTEMLERİ I
BÖLÜM 6 6. SQL VERİ İŞLEME DİLİ SQL insanların veritabanı sistemleri ile konuşmasını sağlayan popüler bir dildir. Bu dil tüm veritabanı programlarında kullanılabilmektedir. Bu dil sayesinde, bir veritabanından
Veritabanı Tasarımı. Kartezyen Çarpım ve Join İşlemleri
Veritabanı Tasarımı Kartezyen Çarpım ve Join İşlemleri Konular Oracle özel join işlemlerini isimlendirme ve onların ANSI/ISO SQL: 1999 karşıtları Join durumlarının amacını açıklama Kartezyen çarpımdan
İnternet Programcılığı
1 PHP le Ver tabanı İşlemler Yaptığımız web sitelerinin daha kullanışlı olması için veritabanı sistemleri ile bağlantı kurup ihtiyaca göre verileri okuyup yazmasını isteriz. 1.1 Veritabanı Nedir? Veritabanı
Veri Bütünlüğü ve Constraint ler. Veritabanı 1
Veri Bütünlüğü ve Constraint ler Veritabanı 1 Veri Bütünlüğü Veri bütünlüğü, bir tabloda veri güncelleme, silme veya ekleme gibi işlemler yapılırken diğer tablo ya da tablolardaki verilerin birbirleriyle
Veritabanı Yönetimi Bilgisayarların. Keşfi Hedefler. Veritabanı, Veri ve Bilgi. Veritabanı, Veri ve Bilgi. Veritabanı, Veri ve Bilgi
Hedefler Veritabanı Yönetimi Bilgisayarların Discovering Keşfi 2010 Computers 2010 Living in a Digital World Dijital Dünyada Yaşamak Veritabanı terimini tanımlamak ve bir veritabanının veri ve bilgi ile
«BM364» Veritabanı Uygulamaları-2
«BM364» Veritabanı Uygulamaları-2 Yaşar GÖZÜDELİ [email protected] http://blog.verivizyon.com/ygozudeli Konu Akışı İlişkisel Veritabanı Temelleri SQL Server Temel Bileşenleri T-SQL Bileşenleri 2
Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS
DERS BİLGİLERİ Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS Veritabanı ve Veritabanı Programlama BIL362 6 3+0 3 4 Ön Koşul Dersleri Yok Dersin Dili Dersin Seviyesi Dersin Türü Türkçe Lisans Zorunlu
Nesneler üzerinde değişiklik yapmak için kullanılır. Veri tabanındaki nesnelerin oluşturulabilmesi için CREATE komutu kullanılır.
Transact SQL Kavramı Microsoft'un veri tabanı sorgulama dilidir. Transact-SQL, SQL Server ve istemci(client) arasında iletişimi sağlayan SQL sorgulama dilinin gelişmiş bir versiyonudur. Transact Structured
Mobil Cihazlardan Web Servis Sunumu
Mobil Cihazlardan Web Servis Sunumu Özlem Özgöbek Ege Üniversitesi Bilgisayar Mühendisliği Bölümü 2010 İnternet erişiminin yaygınlaşması ve artık mobil cihazlar üzerinden bile yüksek hızlı veri iletişimine
LOGO İş Zekası çözümü ile kurumsal raporlama ve analizler. Cem Yılmaz Genel Müdür LOGOBI Yazılım
LOGO İş Zekası çözümü ile kurumsal raporlama ve analizler Cem Yılmaz Genel Müdür LOGOBI Yazılım Hakkımızda LOGOBI Yazılım A.Ş. iş zekası alanında faaliyet gösteren, Türkiye de sahip olduğu yüzlerce müşterinin
ASP.NET TEMELLERİ. Öğr. Gör. Emine TUNÇEL Kırklareli Üniversitesi Pınarhisar Meslek Yüksekokulu
ASP.NET TEMELLERİ Öğr. Gör. Emine TUNÇEL Kırklareli Üniversitesi Pınarhisar Meslek Yüksekokulu İnternet Nasıl Çalışır? Sunucu istemci modeline göre çalışır. Fiziksel olarak bu sistem genelde isteği yapan
PAZARTESİ SALI 2015-2016 Ders Programı 1. Öğretim 09.00-09.50 10.00-10.50 11.00-11.50 12.00-12.50 HRT4291 WEB TABANLI CBS GR:11 Ü.GÜMÜŞAY EZ-121 ; D1-129 HRT4291 WEB TABANLI CBS GR:22 Ü.GÜMÜŞAY EZ-121
Öğr. Gör. Serkan AKSU http://www.serkanaksu.net. http://www.serkanaksu.net/ 1
Öğr. Gör. Serkan AKSU http://www.serkanaksu.net http://www.serkanaksu.net/ 1 JavaScript JavaScript Nedir? Nestcape firması tarafından C dilinden esinlenerek yazılmış, Netscape Navigator 2.0 ile birlikte
VERİ TABANI YÖNETİM SİSTEMLERİ I
BÖLÜM 11 11. SQL de JOIN (BİRLEŞTİRME) İŞLEMİ 11.1. JOIN (Birleştirme) İşlemi Veri tabanı kayıtları oluşturulurken bütün bilgiler bir tabloda değil de, birkaç tablo üzerinde tutulur. Bu dataların daha
VERİTABANI. SQL (Structured Query Language)
VERİTABANI SQL (Structured Query Language) SQL'de Gruplama Bir tablonun satırları gruplara ayrılarak fonksiyonların bunlara uygulanması mümkündür. Gruplara ayırmak için SELECT deyimi içerisinde GROUP BY
3. sınıf. Bilgisayarla kataloglamanın doğuşu gelişimi ve bugünkü durum ele alınmaktadır. Bu derste
3. sınıf 5. Yarıyıl (Güz Dönemi) Bilgi Kaynaklarının Tanımlanması ve Erişimi I (AKTS 5) 3 saat Bilgisayarla kataloglamanın doğuşu gelişimi ve bugünkü durum ele alınmaktadır. Bu derste Kütüphane Otomasyon
TESİ. indeks. söylenebilir?? bir ilişkidir d) Hiçbiri. veya somutlaştırılmış. düzeyidir? sağlayabilir? sına. d) Hepsi. olabilir? c) Verilerin d) Hepsi
1. 2. 3. 4. 5. 6. Görünüm (view) için özellikle aşağıdakilerden hangisi söylenebilir?? a) Veritabanındaki kayıtlı verileri düzenlemek, yönetmek ve elde etmek için kullanılan bir dildir b) Bir ilişkinin
2 VISUAL STUDIO 2012 GELİŞTİRME ORTAMI
İÇİNDEKİLER VII İÇİNDEKİLER 1 GİRİŞ 1 C# Hakkında Genel Bilgiler 1.NET Framework 1 CLR 2 CLR Ve CTS 2 Temel Sınıf Kütüphanesi 3 CIL 3 Algoritma Nedir? 4 Sözde Kod (Pseudocode) 5 2 VISUAL STUDIO 2012 GELİŞTİRME
SORGULAR VE ÇEŞİTLERİ II
Ünite 8 SORGULAR VE ÇEŞİTLERİ II Öğr. Gör. Kemal ÖZCAN Bu ünitede, Sorgular ve Çeşitleri konusu ele alınacaktır. Yapılacaklar Burada yazılan SQL ifadeleri MS SQL SERVER, ORACLE ve MySQL veritabanı sistemlerinin
Uludağ Projesi, İlk Adımlar (Kalite Takımı)
Uludağ Projesi, İlk Adımlar (Kalite Takımı) A. Murat Eren ([email protected]) 16 Mart 2005 Özet Bu belgede Uludağ Projesi Kalite Takımı nın amacından, nasıl bu takımın bir üyesi olunabileceğinden bahsedilmeye
ORM & Hibernate. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4 [email protected]
ORM & Hibernate Ahmet Demirelli SCJP 5.0, SCWCD 1.4 [email protected] Sabancı Üniversitesi Bilişim Teknolojileri Yüksek Lisans Programı Seminerleri 2008 Hakkımızda SabancıÜniversitesi BT Yüksek
Bilgisayar Mühendisliğine Giriş. Yrd.Doç.Dr.Hacer KARACAN
Bilgisayar Mühendisliğine Giriş Yrd.Doç.Dr.Hacer KARACAN İçerik Dosya Organizasyonu (File Organization) Veritabanı Sistemleri (Database Systems) BM307 Dosya Organizasyonu (File Organization) İçerik Dosya
Asp.Net Veritabanı İşlemleri
Asp.Net Veritabanı İşlemleri Asp.Net Veritabanı İşlemleri Birçok uygulamada bilgiler geçici olarak tutulur ve oturum sonlandırıldığında bu bilgiler bellekten silinir. Ancak etkileşimli web sitelerinde
Excel de Pivot Tablolar Tasarım ve Kullanımı
FARUK ÇUBUKÇU EXCEL AKADEMİ Excel de Pivot Tablolar Tasarım ve Kullanımı Pivot tablolar; satışlar, siparişler gibi verileri gruplamayı, alt toplamlarını almayı ve filtreleme işlemleri yapmayı sağlayan
1 C#.NET GELİŞTİRME ORTAMI 1 Visual Studio 2015 Arayüzü 4 Menu Window 6 Solution Explorer 7 Properties Window 8 Server Explorer 8 Toolbox 9
VII 1 C#.NET GELİŞTİRME ORTAMI 1 Visual Studio 2015 Arayüzü 4 Menu Window 6 Solution Explorer 7 Properties Window 8 Server Explorer 8 Toolbox 9 2 KOD YAZMAYA BAŞLANGIÇ 11.Net Framework 11 Yeni Proje Oluşturmak
ÜNİTE 8 SQL Dili ve T-SQL Uygulamaları
ÜNİTE 8 SQL Dili ve T-SQL Uygulamaları Terimler Gözden Geçirme Sınava Hazırlık İçin İngilizce Sorular Diğer Kaynaklar Üniteyi tamamlayan okuyucu; SQL ve Transact- SQL dilinin tarihini tanımlar. Transact-SQL
EBE-368 Veri Tabanı Yönetim Sistemleri SQL
EBE-368 Veri Tabanı Yönetim Sistemleri SQL Dr. Dilek Küçük SQL Sorgu Dili [1] Ogrenci no ad soyad yas ortalama 21325 Necla Yılmaz 18 2,9 21345 Öykü Okan 20 2,1 21378 Elçin Demir 19 3,3 21389 Özgür Kara
