Şubat 2004 Veritabanı Programlama 2 Yaşar Gözüdeli Veritabanı Programlama 2 Eğitim dizisi Veritabanı Programlama 2 Şubat 2004 Yaşar GÖZÜDELİ Bu ek kopyalanamaz, satılamaz. Her hakkı saklıdır. BYTE’ın okurlarına ücretsiz armağanıdır. © 2004 BYTE BYTE bir Acar Yayıncılık Yayınıdır İÇİNDEKİLER GİRİŞ..............................................................................8 Belli başlı VTYS’ler ............................................................. 8 Bir Proje İçin Hangi VTYS’yi Seçilmeli? ...................................... 9 Veritabanı Programlama-2 Kitapçığı Neleri İçeriyor..................... 10 Teknik Destek ................................................................. 10 1.MS SQL Server 2000’e giriş ...........................12 Web Matrix ve MS SQL Server Desktop Engine............................ 12 A. MSDE’nin Kurulumu ve Kaldırılması .................................... 13 Gereksinimler ................................................................. 13 Kurulumu....................................................................... 13 Kaldırılması.................................................................... 16 SQL Server İstemci Taraf Bileşenleri ..................................... 16 SQL Server Enterprice Manager ............................................ 16 Enterprise Manager’e Bir SQLServer Kaydetme .......................... 17 Enterprise Manager ile Veritabanı Bakım ve Yönetimi .................. 18 Enterprise Manager ile Yeni bir Veritabanı Oluşturmak................. 19 Bir Veritabanını Ölçeklemek ................................................ 20 SQL Query Analyzer .......................................................... 21 Query Analyzer ile Veritabanı Oluşturmak ................................ 23 Loglamadan Tablo Boşaltma: Truncate Table............................. 24 Bir Sorguyu Query Analyzer ile Analiz Etme .............................. 25 Import & Export Data ........................................................ 27 SQL Service Manager ......................................................... 28 SQL Server ve XML Desteği ................................................ 29 SQL Server’de Veritabanı Nesneleri ..................................... 29 SQL Server ve Kullanıcı Yönetimi........................................... 33 Roller ........................................................................... 33 Kullanıcılar .................................................................... 33 Yetki verme (Grant Komutu) ................................................ 34 Yetki Kaldırma (Revoke Komutu) ........................................... 35 2.T-SQL ve VTYS temelli programlama ...............36 T-SQL ile ANSI-SQL komutlarını çalıştırma ................................ 37 Değişken Tanımlama ve Kullanma .......................................... 37 Değişkenler ve Sistem Fonksiyonları....................................... 38 Print komutu .................................................................. 39 Akış Kontrolleri ............................................................... 39 Go Komutu..................................................................... 40 1.IF ... ELSE karar yapısı .................................................... 40 2.CASE deyimi................................................................. 42 3.While Döngüsü .............................................................. 43 Geçici Tablolar ................................................................ 45 Kontrol Zorlayıcıları (Check Constraints) ................................. 46 3.Saklı Prosedürler (Stored Procedures) .............48 Prosedür ne demektir? ....................................................... 48 SP oluşturma .................................................................. 48 SP üstünde değişiklik yapmak .............................................. 49 Bir SP’yi Silmek ............................................................... 50 SP’ye Parametre Yollama.................................................... 50 Sp’den Değer Döndürme..................................................... 52 Bu prosedürün döndürdüğü sonucu nasıl alabiliriz? ..................... 52 SP’yi VTYS Uzayı Dışından MDACs ile Çağırmak .......................... 54 Cursor’ler ...................................................................... 56 Başlıca Sistem Saklı Prosedürleri ........................................... 57 4.İşlemler(Transactions) –Tetikler(Triggers) .........61 Transactions................................................................... 61 Trigger’lar ..................................................................... 62 Eklenen-Silinen Kayıtlar ..................................................... 64 Sorumlu Yazı İşleri Müdürü: Murat Yıldız [email protected] Yönetici Editör: İbrahim Özdemir [email protected] Editörler: Burak Kahyaoğlu [email protected] Üsame İldar Özdemir [email protected] Tasarım ve Uygulama: Yağız Akay [email protected] ACAR Yayıncılık adına imtiyaz sahibi: Murat Yıldız Reklam Müdürü: Ahmet Aslantürk Baskı: ETAM A.Ş. Film Çıkış: Figür Merkez Ofis: Fulya Cad. Fulya Bayırı Sk. Bilsan Plaza 11/4 80300 Mecidiyeköy - İSTANBUL Tel: (212) 212 62 06 Faks: (212) 212 62 11 www.byte.com.tr Önsöz Veritabanı kavramının ilk olarak ortaya atıldığı 1980’li yılların üstünden henüz 23 yıl geçti. Ancak bu gün, operasyonel iş dünyası, Veritabanı Yönetim Sistemleri (VTYS) olmadan hiçbir şey yapamaz hale geldi. İşletim sistemlerinden sonra en popüler ve en çok kazandıran yazılımlar Veritabanı Yönetim Sistemleridir. Günümüzde, bir çok alanda operasyonel veri işlemlerinde VTYS’ler yaygın olarak kullanılmakta. Bu programlar için bir çok nesne birbiri ile aynı temel işlevi yerine getirir ve yaklaşık olarak aynı teorilere dayanarak çalışır. VTYS’lerinden orta ve büyük ölçekli olanlarından biri olan MS SQL Server 2000 bu kitapçıkta teferruatlı olarak ele alınıyor. MS SQL Server 2000’i tanırken daha çok VTYS’ler için ortak olan noktalara değinildi. Böylelikle kitapçıkta anlatılan konular sadece MS SQL Server kullanıcıları için değil, Sybase, Oracle hatta Advantage (Türk programcılar tarafından geliştirilmiş bir VTYS. Bu vesile ile projede emeği geçenleri da tebrik etmek gerekir.) için bile bir çok teknik olarak uygulanabilirlik seviye- sinde yer almaktadır. Bu kapsamda, hemen her VTYS’de ortak olarak yer alan saklı prosedürler, trigger’ler, kursörler, transaction’lar, zorlayıcılar ve diğer nesneler yine sırayla bu kitapta ele alınan konular arasında. Bu kitapçıkta genel olarak MS SQLServer ve Sybase’de kullanılan TSQL komutları yer alıyor. Oracle tarafından kullanılan PL/SQL komutları da aslında T-SQL ile bir çok noktada hemen hemen aynıdır. Bu nedenle VTSY’ler için bir noktaya kadar ortak bir kitapçık ortaya çıktığını söyleyebiliriz. Tüm bunlarla birlikte son yıllarda popülerlik kazanan VTYS uygulama şekillerinden replication (çoğaltmalı çalışma) ve Data Warehousing (Veri ambarlama) konuları, kitapçığın alanının kısıtlı olması nedeniyle yer verilemeyen konular arasında. XML veritabanları da yavaş yavaş popülerleşen bir konu ama bu konu da bu kitapçığın içeriği dışında. Bütün bunlar kitapçıkta yer almamalarına rağmen veritabanı konusunda kendisini geliştirmek isteyen arkadaşlara fikir vermesi açısından burada zikredilmiştir. Ayrıca veritabanı programlamadan ziyade yönetimi ile daha çok ilgili olan, Kullanıcı Yönetimi, Yedekleme-Kurtarma, DTS-BCP gibi konulara da kısıtlı sayfa sayısı nedeniyle değinilmedi. Başta, gece gündüz demeden yoğun bir çalışmayla siz değerli okurlara bu seriyi ulaştırmak için uğraşan Yönetici Editör İbrahim Özdemir ve ekibine, Veritabanı konusunda tecrübelerini çekinmeden aktaran ve kitap için düzeltmeler yapan sayın Nurullah Kılıç’a ve kitabın içerdiği örnekleri test eden eşim Lale Gözüdeli’ye olmak üzere kitapçıkta emeği geçen herkese sonsuz teşekkürlerimi sunarım. Bununla birlikte, seride yer alan bütün hatalar bana aittir. -Yaşar GÖZÜDELİ [email protected] Veritabanı Programlama 2 BYTE 7 Giriş V eritabanı Yönetim Sistemleri, verilerin fiziksel hafızadaki durumlarını, kullanıcıların erişimlerini düzenleyen sistemlerdir. İlişkisel VTYS’ler günümüzde yaygın olarak kullanılmaktadır. VTYS’ler fiziksel hafızayı ve veri tiplerini kullanıcılar adına şekillendirip denetleyen ve kullanıcılarına standart bir SQL arayüzü sağlayarak onların dosya yapıları, veri yapısı, fiziksel hafıza gibi sorunlarla ilgilenmek yerine veri giriş-çıkışı için uygun arayüzler geliştirmelerine olanak sağlayan yazılımlardır. VTYS’de verileri tutmak üzere bir çok türde nesne ve bu nesnelere erişimleri düzenlemek üzere kullanıcılar, roller ve gruplar yer alır. Her bir kullanıcının belli hakları vardır. Bu haklar, kısıtlanabilir. Örneğin bir tablo ya da programcığı bir kullanıcı kullanabilirken bir başkasının hakları veritabanı yöneticisi tarafından kısıtlanmış olabilir. VTYS’lerin bir çoğu ANSI SQL’in karşılayamadığı durumlarda kullanılmak üzere ek programlama komutları barındırırlar. Bu iş için MS SQL Server ve Sybase SQL Server Transact SQL denilen komut takımlarını içerir. Oracle ise PL/SQL ile bu işe çözüm getirir. Bu diller sayesinde, bu konu içerisinde öğreneceğimiz Stored Procedure (saklı prosedürler), Trigger, Fonksiyon gibi veritabanları için vazgeçilmez olmuş 8 BYTE Veritabanı Programlama 2 nesneler yazılabilmektedir. Belli başlı VTYS’ler MS SQL Server: Bir orta ve büyük ölçekli VTYS’dir. ANSI SQL’e eklentiler yazmak için T-SQL’i destekler. Oracle: Daha çok yüksek ölçekli uygulamalarda tercih edilen bir VTYS’dir. ANSI SQL’e eklentiler yapmak için PL/SQL geliştirilmiştir. Sybase: Bir orta ve büyük ölçekli VTYS’dir. ANSI SQL’e eklentiler yazmak için T-SQL komutlarını destekler. Ülkemizde daha çok bankacılık ve kamusal alanlarda tercih edilmektedir. Informix: Bir orta ve büyük ölçekli VTYS’dir. MySQL: Genellikle Unix-Linux temelli Web uygulamalarında tercih edilen bir VTYS’dir. Açık kod bir yazılımdır. Küçük-orta ölçeklidir. Özellikle Web için geliştirilmiş bir VTYS’dir denilebilir. Postrage SQL: Bu da MySQL gibi açık kod bir VTYS’dir. MS Access: Çoklu kullanıcı desteği yoktur. İşletim sisteminin sağladığı güvenlik seçeneklerini kullanır. Bunun yanında belli sayıda kayda kadar (1000000 civarı) ya da belli bir boyutun (yaklaşık 25MB) altına kadar bir sorun çıkartmadan kullanılabilecek bir küçük ölçekli VTYS’dir. Advantage: Türk programcılar tarafından geliştirilen bir orta ve büyük ölçekli VTYS’dir. IBM ....................... Oracle.................... Microsoft ................ Informix ................. Sybase ................... Digerleri ................. %37.8 %26.3 %15.4 %3.2 %3 %14.3 2001 yılında bir araştırmaya göre Avrupa çapında VTYS’lerinin pazar payları [kaynak: Gartner] DB/2: IBM’in framework’lere yönelik büyük ölçekli VTYS’dir. Bunların dışında daha bir çok VTYS mevcut olabilir. Burada yer alanlarına popüler olmaları nedeni ile değinildi. VTYS’lerinin Avrupa genelindeki pazar payları yaklaşık olarak şu şekilde: En büyük pay IBM(DB/2) ile Oracle arasında. Hemen arkasında MS SQL Server geliyor. Informix ve Sybase ise onu takip ediyor. Yeni başlayanlar için hangi VTYS’yi öğrenmem en iyisi olur sorusunu yanıtlamak gerekebilir. Ülkemizde insan kaynakları açısından en çok kalifiye elaman aranan VTYS Oracle ve arkasından da MS SQL Server gelmekte. Çok nadir olarak Sybase bilen elemanlar da aranmaktadır. Bu konuda TBD(Türkiye Bilişim Vakfı) yayın organında yayınlanmış bir araştırmaya göz atmak için aşağıdaki adresi tıklayabilirsiniz. Bir Proje İçin Hangi VTYS’yi Seçmeli? Bir projede hangi veritabanının seçileceği, projenin çapı ile ilgili bir karardır. Şu soruları kendinize sormanız projenizin çapı konusunda karar vermenize yardımcı olacaktır. •Projede kaç tablo kullanacak? •Her bir tabloda en fazla kaç satır yer alabilir? •Projenize aynı anda en fazla kaç kullanıcı bağlanacak? •Projeniz günlük kaç transaction (INSERT-DELETE-UPDATE) gerçekleştirecek? •Projeniz en fazla ne kadarlık yer kaplayacak bir veritabanı dosyasına ihtiyaç duyacak? http://www.tbd.org.tr/sayi77_html/ insan.htm •Projeniz için güvenlik ne derece Veritabanı Programlama 2 BYTE 9 önemli? Ancak bir VTYS kullanarak proje geliştirecekseniz, hangisini seçmeniz gerektiğinin dışında, hangi sürümleri kullanacağınız ya da hangi donanımlar üstünde çalıştıracağınız da önemlidir. Veritabanı Programlama 2 Kitapçığı Neleri İçeriyor 1.Bölüm: Veritabanı Yönetim Sistemleri ele alınıyor. VTYS’ler, SQL’den anlayabilen programlardır. Verdiğimiz SQL komutlarını yerine getiren, sahne arkasındaki iş bitirici veritabanı yönetim sistemidir. VTYS’ler SQL ile ifade edebildiğimiz tüm işlemleri yerine getirebilirler. Bu bölümde VTYS’ler hakkında detaylı bilgi edineceğiz. 2.Bölüm: T-SQL komutları ele anıyor. Bazen, SQL’de yer alan komutlar, derdimizi anlatmamız için yeterli olmayabilir. Bu tür durumlarda Transact SQL içerisinde yer alan komutlardan faydalanacağız. Transact SQL, kısaca T-SQL olarak anılır. Bu konudaki detaylı bilgiyi ikini ünitede edineceğiz. 3.Bölüm: Stored Procedure ele alınıyor. T-SQL ile Stored Procedure’ler yazmak, VTYS’lerinin daha etkin bir şekilde kullanılmasını sağlar ve çeşitli performans artırıcı etkileri vardır. Stored Procedure ile, tekrar tekrar kullanmak üzere paketlenmiş T-SQL komutları oluşturacağız. Ayrıca, SYBASE ve MSSQLServer tarafından kullanılan ve sistemde hali 10 BYTE Veritabanı Programlama 2 hazırda yer alan Stored Procedure’leri de yakından tanıyacağız. 4.Bölüm: Transaction’lar ve Trigger’ler ele alınıyor. T-SQL ile Stored Procedure’ler dışında Transaction’lar ve Trigger’ler de programlanabilir. Transaction, Daha küçük parçalara ayrılamayan en küçük işlem birimi demektir. Trigger’ler ise Stored Procedure’lerin bir özel halidir ve bir tabloda değişiklik yapıldığında otomatik olarak devreye girerler. Zorlayıcılar ve SP’ler ile sağlayamadığımız veri kararlığını ve bütünlüğünü trigger’ler ile sağlamaya çalışacağız. Teknik Destek Eğitim serisi ile ilgili iletmek istediğiniz öneri, istek, şikayet ya da düzeltmelerinizi doğrudan BYTE Türkiye dergisine iletmek için www.byte.com.tr/bizeulas.asp adresini tıklayınız. Kitapçık ve içerdiği konular hakkındaki her türlü soru ve sorunlarınızla ilgili olarak [email protected] adresine e-posta göndermekten çekinmeyin. Yine Veritabanı Programlama serisi hakkındaki görüş, şikayet ve önerileriniz için www.verivizyon.com/sqlkitabi/ adresindeki formdan faydalanabilirsiniz. Seri hakkındaki duyuruları da aynı adresten takip edebilirsiniz. 1. Bölüm MS SQL Server 2000’e Giriş V TYS temelli programlamayı öğrenmek istiyorsanız, öncelikle bu ünitede anlatılan her şeyi anlamaya çalışmayınız. 2.Üniteyi çok iyi etüt ettikten sonra bu üniteyi daha iyi anlayabilirsiniz. Ancak SQL Server konusunda başlangıç seviyesinde bilginiz varsa, bu bölüm ile onu daha etkili bir şekilde nasıl kullanacağınızı öğrenmiş olacaksınız. MS SQL Server, orta ve büyük ölçekli VTYS’ler arasında en yaygın olanlarından biridir. Bunun sonucu olarak da bir çok veri yönlendirmeli Web sitesi bu gün bu program üstünde inşa edilmiş durumdadır. Bu bölümde MS SQLServer 2000 Developer Edition(artık MSDE olarak anılacak)’in kurulumu ve kaldırılması anlatılacaktır. MSDE, Eğitim ve kişisel kullanım maksatlı en geniş SQL Server 2000 sürümüdür. Bu bölüm boyunca verilen uygulamalar SQL Server’in bahsedilen sürümü üstünde test edilmiştir. MSDE’nin Kurulumu ve Kaldırılması Web Matrix ve MS SQL Server Desktop Engine MSDE ayrıca MS SQL Server Desktop Edition için de kullanılmaktadır. Desktop Edition’da bir istemci arayüz bulunmamakla birlikte SQL Server kurulumunu gerçekleştirebilirsiniz. Bu programı ücretsiz olarak www.microsoft.com adresinden indirebilirsiniz. Desktop Edition’ı kurmak için, MSDE dizi- 12 BYTE nindeki setup.exe programını tıklayın. Kurulum esnasında bir güvenlik sorunu ile karşılaşmamak için MSDE dizininde bulunan setup.ini dosyasına şu iki satırın yer aldığından emin olun [Options] SAPWD=sasifresi ve daha sonra setup.exe programını Veritabanı Programlama 2 tıklayın. Böylece, SQL Server Desktop edition kurulduğunda sa kullanıcı adında ve sasifresi şifresinde temel veritabanı kullanıcısını oluşturacak bir kurulumu başlatmış olursunuz. MS SQL Server’in bu sürümü için kısıtlı da olsa bir arayüz sağlayabilmek üzere ücretsiz olarak Web Matrix prog- SQL Server Developer Edition kurulumu, kullanıcı ayarlarını saymazsak ve sadece kendi bilgisayarınıza kurmak veya kaldırmak isterseniz, herhangi bir program kurulumundan farkı yoktur. Gereksinimler Gerçek hayatta veritabanı uygulamaları ciddi manada kaynak ihtiyacı olan uygulamalardandır. Hafıza büyüklüğü, işlemci hızı ve benzeri gibi sistem paramatrelerini, üstünde kurgulamayı planladığınız projeye göre şekillendirmeniz gerekir. Burada verilen gereksinimler sadece öğrenme amaçlı uygulamaların denenebileceği bir sistem elde etmek için yeterlidir. MSDE kurulumu için en azından bir Windows 2000 Professional veya XP Professional yüklü bir PC’ye ihtiyacınız olacaktır. Donanımsal ihtiyacınız ise bu işletim sistemlerinin duyduğu minimum ihtiyaçlardır. Bu, bütün programın kurulumu için geçerli gereksinimdir. Sadece istemci programları kurup, hali hazırda zaten olan bir MSDE sunucusunu kontrol etmek isterseniz, Windows 98 de yeterli olabilir. Ancak, buradaki bütün uygulamaları bir tek PC’de test etmek istiyorsanız, MSDE’nin tamamını kurmanız gerekir. Kurulumu Bu kısımda bir tek PC üzerine tüm MSDE’nin nasıl kurulacağı anlatılacaktır. MDACs bileşenlerini kullanarak kendiniz için bir arayüz hazırlayabilirsiniz. Bunun bir benzerini w w w. v e r i v i z y o n . c o m ramını kullanabilirsiniz. Web matrix programını www.asp.net/webmatrix adresinden ücretsiz indirebilirsiniz. Ya da download adresinden indirebilirsiniz. Desktop edition üstünde burada anlatılan işlemlerin bir çoğunu yapamazsınız. Yapabilmek için en azından bu ünitede anlatılan istemci programlarını da kurmanız gerekir. Ancak sonuçta ücretsiz bir MS SQL Server sürümünü elde etmiş olursunuz. Bu iki yazılımın birlikte kullanımı konusunda daha geniş bilgiyi ADO.NET ile .NET temelli veritabanı uygulamaları geliştirme ve Web Servisleri konulu serinin 3. kitabında bulabilirsiniz. Veritabanı Programlama 2 BYTE 13 Resim 1 Resim 2 1. Adım: IIS ve diğer SQL Server’i kullanacak servisleri durdurun. Registry’e erişecek gereksiz uygulamalar varsa kapatın. retli bırakın. Daha önce bu programı kurdunuz ve üstünde değişiklik yapmak istiyorsanız ikinci seçeneği işaretleyebilirsiniz. Instance, SQL Server’in bir tek makinede iki ayrı uzayda çalışmak üzere yeniden kurulmasını kasteder. Bu durumda ikinci Instance(kopya)’ya MAKINEADI/INSTANCEADI notasyonu ile erişilir. Bir makinede birden fazla kopya çalışma özelliği tam olarak MSSQL Server 2000 sürümünde mevcuttur. 6,0 sürümünde ise bu konuda hiçbir destek yer almaz. Aynı makinede ne fazla 16 kopya çalışabilmektedir. 2. Adım: Sıkıştırılmış paketi bir yere açın ve x86\setup\setupsql.exe programını çalıştırın. (Resim 1) 3. Adım: Bu aşamada programı nereye kuracağınız sorulmaktadır. Kendi makinenize kuracaksanız, Local Computer seçeneğini işaretleyin. Uzaktaki bir bilgisayara bağlanıp o bilgisayara kurmak isterseniz, Remote Computer seçeneğin işaretleyebilirsiniz. Virtual Server seçeneği, Clustered Server kurmak için gerekli bir seçenek olup biraz ileri bir konudur. Özetle Clustered: Birden fazla SQL Server kurulu makinenin birbirinin devamı gibi iş yükü ve trafik dengeleme işlemlerini yerine getirebilmesi amacıyla kurulmasıdır. (Resim 2) 4. Adım: İlk seçenek olan create new instance of SQLServer seçeneğini işa- 14 BYTE Veritabanı Programlama 2 5. Adım: Adınızı ve firmanızı giriniz. (Resim 3) 6. Adım: Sözleşmeyi onaylamak için [yes] botununu tıklayın. 7. Adım: Server and client tools seçeneğini işaretli bırakın. Server olarak SQL Server daha önce kurulu ise veya bulunduğunuz ağ ortamında başka bir bilgisayarda kurulu ise ilk seçeneği de Resim 3 Resim 4 işaretleyebilirsiniz. neğinin karşısında yer alan [browse] butonunu tıklayın ve aynı işlemi yapın. Windows konusunda yeterli bilginiz yoksa, bu kısımla da oynamamanız tavsiye edilir. 8. Adım: SQL Server yapılandırma konusunda tecrübeli değilseniz, bu adımda default seçeneğini işaretli bırakın. Bir makinede, birden fazla SQL Server kurulumu çalıştırabilirsiniz. Bu durumda her bir kurulum farklı bir uzayda çalışacaktır. Aynı ismi iki SQL Server kurulumuna veremezsiniz. (Resim 4) 9. Adım: Karşınıza çıkan pencereden, Typical seçeneğini işaretli bırakın. SQL Server bileşenleri hakkında yeterli bilginiz varsa, Costum seçeneğini, sistem kaynaklarınızın kısıtlı olduğunu düşünüyorsanız, minimum seçeneğini kullanın. SQL Server’in programı farklı bir diske kurmasını istiyorsanız, program files seçeneğinin önündeki [browse] butonunu tıklayın ve kurmak istediğiniz klasörü seçtikten sonra [ok]’i tıklayın. SQL Server’in veri dosyalarını(veritabanı dosyalarını) farklı bir adreste saklamasını istiyorsanız, data files seçe- 10. Adım: Gelen seçenekleri aynen onaylayın. SQL Server ve Active Directory konusunda bilgi sahibi iseniz bu konudaki ayarları uygun hale getirebilirsiniz. 11. Adım: SQL Server, iki çeşit yetkilendirmeyi destekleyebilir. a. İşletim sistemi ve domain ayarlarından gelen yetkilendirmeleri geçerli kabul eder ve SQL Server kaynaklarına erişimini geçerli kabul edebilir.(Bu durumda, sistem yetkilendirmesi olan kişi dbo(veritabanı sahibi) kullanıcısı olarak yetkilendirilir.) b. Sistem yetkilendirmelerinin yanı sıra SQLServer’in kendi kullanıcılarını da oluşturup yetkilendirmesini isteyebiliriz. Bu durumda veritabanı kaynaklarına erişim için iki yetkilendirmeden biri Veritabanı Programlama 2 BYTE 15 tarafından yetkilendirilmiş bir kullanıcının erişimi geçerli sayılır. Uygun olan seçeneği işaretleyin. Şayet kendiniz SQL Server için bir kullanıcı oluşturursanız, bu kullanıcının kullanıcı adını(muhtemelen bu isim sa olacak) ve şifresini unutmayacağınız bir şekilde güvenli bir yerlere kaydedin. Daha sonra gerekli olacaktır. Ancak a’ya göre bir yetkilendirme tercih ederseniz, işletim sistemi şifrenizi korumanız gerekecektir. 12. Adım [Next] butonunu tıklayarak dosyaların kurulumunu sağlayın. Dosyaların kopyalanması bittiğinde [Finish] butonunu tıklayın. Böylelikle kurulum tamamlanmış olur. Kaldırılması MSDE’yi ya da SQL Server’i kaldırmaya karar vermeden önce, üstünde çalışacak projelerinizin olmadığından emin olmanız gerekir. Aksi halde kaldırıldıktan sonra MSDE’yi kullanan projeleriniz çalışamayacaktır. 1. SQL Server’i kullanmakta olan bütün servisleri durdurun. 2. SQL Server hizmetini durdurun. Açık olan tüm SQL server toollarını kapatın 3. [Denetim masası\program ekle kaldır’dan SQL Server 2000]’i seçin ve normal bir program kaldırır gibi kaldırın. 16 BYTE Veritabanı Programlama 2 SQL Server İstemci Taraf Bileşenleri SQL Server Enterprise Manager: Enterprise manager, SQL Server’in görsel bir arayüzden yönetilmesi için geliştirilmiş bir istemci taraf parçasıdır. Kullandığı temel arayüz MMC (Microsoft Management Console) temelli bir arayüzdür. Bu konuda, MMC’nin nasıl kullanıldığı anlatılmayacaktır. Sadece yapılabilecekler hakkında özet bilgiler bulabilirsiniz. Enterprise manager ile aynı zamanda birden fazla veritabanı sunucusuna bağlanılabilir. Bu işlem için veritabanı sunucularının (SQL Server) kaydının yapılması gerekir. Kaydın yapılabilmesi için de yetkilendirilmiş bir kullanıcı ile erişim şarttır. •Bir veritabanı sunucusuna eriştikten sonra, üstünde yer alan kullanıcıları, yetkimiz olan veritabanı dosyalarını, stored procedure, view, tablo gibi veritabanı öğelerini görebiliriz. •Yetkimiz dahilinde değişiklerde bulunabiliriz. •SQL server grupları tanımlanabilir •Her bir grup içerisinde yer alacak tekil SQL Server’ler kaydedilebilir. •Kaydı yapılan her bir SQL server için istenilen ayar ve değişiklikler yapılabilir. •Herhangi bir SQL Server üstünde veritabanları, nesneler, kullanıcılar, yetkilendirmeler ve izinler oluşturulup düzenlenebilir. Resim 5 •Yetki çerçevesinde, kaydedilmiş SQL Server’ler üstünde SQL Server yönetim görevleri çalıştırılabilir, tanımlanabilir. •SQL ifadelerinin, yığınlarının ve scriptlerinin çalıştırılması için gereken yerden Query Analyzer’e geçiş sağlar. •Veri ithal-ihraç etme işlemleri başta olmak üzere bir çok işlem için kolaylaştırıcı sihirbazların başlangıç noktasıdır. MMC, Microsoft’un sunucu uygulamalarını yönetmek için geliştirdiği bir genel arayüzdür. Bu nedenle bir çok sunucu uygulamada bu standart arayüz ile kullanıcıların sunucu uygulamalarını yönetmeleri sağlanmıştır. (IIS de bu türden bir yönetim paneli kullanıcı arayüzüne sahiptir). Her bir uygulamanın kendisi için bir bileşen yüklenir ve arayüz bu bileşen sayesinde o uygulamanın özelliklerini yönetecek bir hal alır. SQL Server’ın de böyle bir eklentisi mevcuttur. Bu eklenti ile MCC’nin birlikte oluşturduğu yönetim programının adı da SQL Enterprise Manager olarak anılmaktadır. (Resim 5) SQL Enterprise Manager’i başlatmak için (tabi öncelikle MSDE’yi kurduğunuzu var sayıyoruz.) yukarıdaki şekilde görüldüğü gibi Başlar>Programlar>SQL Server>Enterprise Manager’i tıklamak yeterli olacaktır. Enterprise Manager’i çalıştırmak tek başına hiçbir anlam ifade etmez. Hangi veritabanını yönetmek istiyorsanız o sunucuyu (ya da veritabanı kurulum kopyası – ‘installation instance’) kaydettirmeniz gerekir. Enterprise Manager’e Bir SQLServer Kaydı Eklemek: Herhangi bir SQL Server’i Enterprise Manager ile yönetebilmek için kaydettirmek gerektiğini biliyoruz. Bu işlem için şu aşamalar takip edilir: 1. Bu işlem için öncelikle Enterprise Manager bir önceki konuda anlatıldığı şekilde başlatmak gerekir. 2. Ardından, Microsoft SQL Server>SQL Server Group ağaç yapılarını sırayla tıklayarak açın. 3. SQL Server Group seçeneğini, fare ile sol tıklayın. Ardından açılan menüden New SQL Server Registration seçeneğini tıklayın. 4. Register SQL Server Wizard başlatılacaktır. [Next] butonunu tıklayın. 5. Ağda geçerli SQL Server’lerin bir listesi sol tarafta belirecektir. Kendi makinenizdeki SQL kopyasını normal olarak kurduysanız, (local) şeklinde gösteriliyordur. Uygun sunucuyu seçtikten sonra [Add >] butonunu tıklayın ve ardından [Next]’i tıklayın. 6. Hangi yetkilendirme seçeneğini kullanacağınız belirleyin. Bunu, ağda daha önceden kurulmuş bir SQL Server için Veritabanı Programlama 2 BYTE 17 Resim 6 Resim 7 yapacaksanız, Veritabanı Yöneticisine danışmanız daha iyi olacaktır. Kendi kurduğunuz SQL Server’e bağlanacaksanız, kurulum aşamasında hangi yetkilendirmeyi seçtiğinizi hatırlayın ve aynı seçeneği burada da seçip [Next]’i tıklayın. (Resim 6) 7. Hangi SQL Server Goup’a ekleyeceğinize karar verin ve işaretleyin. İlk defa kullanıyorsanız, standart ayarları takip etmeniz önerilir. [Next]’i tıklayın. 8. Uygun sunucuyu seçin ve [Next]’i tıklayın. 9. Kayıt işlemi burada sona erdi. Başarılı bir şekilde ekleme işlemini yerine getir- diniz ise resim 7’deki gibi bir ekran elde edeceksinizdir. (Resim 7) SQL Server kaydını kaldırmak oldukça kolaydır: 1. Kaydını kaldırmak istediğiniz SQL Server’i fareniz ile sol tıklayın. (Resim 8) 2. Gelen doğrulatma mesaj kutusunda [yes]’ i tıklayın. İPUCU: Bir SQL Server kayıt bilgisi silindiğinde SQL Server’de yer alan bilgiler kaybolmaz, silinmez sadece sizin Enterprice Manager’iniz kaydı silinen SQL Server’i tekrar kaydetmediğiniz sürece yönetemez. 18 BYTE Veritabanı Programlama 2 Enterprise Manager ile Veritabanı Bakım ve Yönetimi Herhangi bir VTYS’de olduğu gibi SQLServer’de de asıl verilerin tutulduğu yer veritabanıdır. Bir veritabanı bir çok nesne ve verilerle birlikte kullanıcı tanımları ve haklar gibi rolleri de içerir. (Resim 9) SQL Server 2000’de verilerin ve tanımlamaların yer aldığı bir veritabanı dosyasının yanı sıra bir de log dosyası yer alır. Veritabanı dosyası *.mdf uzantılıdır. Log dosyası ise *.ldf uzantılı bir Resim 8 Resim 9 dosyadır. Bu tür veritabanı dosyalarına ait bilgileri görmek için Enterprise Manager’de herhangi bir veritabanı dosyasını sol tıklayın ve çıkan menüden properties’i tıklayarak detay bilgilerine erişebilir, bir kısım değerleri değiştirebilirsiniz. Transaction log dosyaları aslında ilk bakışta pek de önemli bir dosya değil gibi görünür. Ama aslında bir çok bilgi işlem en kara günlerden bu loglar sayesinde kurtulur. Transaction log dosyaları, SQL Server’da verilerin depolanması ve kurtarılması durumunda oldukça büyük önem arzetmektedir. Bir tablonun içerdiği verilerde yapılan değişiklikler önce transaction log dosyasına yazılır, ardından veritabanına kaydedilir. Bu sistem başta veritabanına yapılan kayıt işleminin tutarlılığını sağlamak için böyle geliştirilmiştir ve hemen her VTYS’de aynı şekilde çalışır. SQL Server’da INSERT, UPDATE veya DELETE komutları çalıştırıldığında oluşan değişiklikler transaction log dosyasına işlenir. Veritabanı yönetimi, veritabanı dosyalarının düzenlenmesi, oluşturulması ve silinmesi işlemlerinden ibarettir. Bir SQL Server’deki en yetkili standart kullanıcı sa(system admin-sistem yöneticisi) kullanıcısıdır. Bir veritabanı dosyasındaki en yetkili standart rol dbo (database owner – veritabanı sahibidir) Enterprise Manager ile Yeni bir Veritabanı Oluşturmak Enterprise Manager ile bir çok işlem gibi veritabanı oluşturma işi de görsel bir arayüzden gerçekleştirilebilir. Bu işlem için, öncelikle Enterprise Manager’e girin. Ardından Databases üzerinde sağ tıklayarak New Database seçin. Sizden veritabanı adı girmeniz istenecektir. İstediğiniz bir veritabanı adını girin. Bir veritabanı tanımlanma aşamasında ya da tanımlandıktan sonra şu parametrelerini de ölçeklemek gerekir. Ölçeklemek’ten kasıt projenin büyüklüVeritabanı Programlama 2 BYTE 19 ğüne göre performans-kapasite dengesini oturtmaktır. Bu biraz da veritabanı konusunda tecrübeli olmanızı gerektiren bir işlemdir. yacağını düşündüğünüz transaction log kayıtlarını truncate edebilirsiniz (silebilirsiniz). Bir Veritabanını Ölçeklemek Database Seçenekleri: Veritabanı seçenekleri, veritabanın ölçeklenmesinde etkili bir diğer faktördür. Bu seçenekler kısaca: Enterprise manager ile bir veritabanının özelliklerini görmek için öncelikle o veritabanına dosyası seçilir. Daha sonra bu veritabanının üstünde sağ tık yapılır. Ardından properties seçeneği tıklanır. Ardından options sekmesi tıklanarak üstünde değişiklikler yapılır. Autoshrink: Veritabanının otomatik olarak küçültülmesini ayarlayan özelliktir. Bu özellik seçili iken veritabanı dosyası ve log dosyası belli aralıklarla sistem tarafından otomatik olarak gereksiz alanları dosyadan çıkarılmaya zorlanır. Veritabanının boyutu: Veritabanına kayıt girdikçe ya da yeni tanımlamalar - nesneler girdikçe boyutu büyür. Bir azami boyut tanımlanması halinde bu değere çıkılmasından itibaren depolama biriminde (harddisk) yer gerektiren veritabanı işlemleri yapılamaz. Transaction log dosyası azami boyutu: Bir veritabanında yapılan kayıt ekleme, kayıt silme ve kayıt güncelleme işlemlerinin veritabanı log dosyasında işaretlendiğini biliyoruz. Bu dosya üstünden veritabanının bütünlüğünün sağlandığına da değinmiştik. İşte bu dosya da belirtilen azami boyutun üstüne çıkarsa UPDATE-INSERT-DELETE işlemleri gerçekleştirilemeyecektir. Transaction Log’a işaretlenmesi gereken hiçbir şey çalıştırılamayacaktır. Bu tür durumlarda bir alternatif olarak artık işinize yarama- 20 BYTE Veritabanı Programlama 2 dbo use only: Bu özellik seçildiği anda sistemde login olan kullanıcılar ve db_owner sabit sistem rolüne haiz kullanıcılar dışında diğer kullanıcılar bu veritabanı dosyasını kullanamazlar. Halihazırda sisteme login olan kullanıcılar ise sistemden çıkmaları halinde db_owner rolüne haiz değil ise tekrardan veritabanına erişemezler. read only: Veritabanı dosyasının sadece okunabilir olmasını sağlayan seçenektir. Bu seçenek seçildiğinde kullanıcılar veritabanından veri okuma (SELECT) komutlarını çalıştırabilir ancak DELETE, UPDATE, INSERT gibi DML komutları ile ALTER, CREATE ve DROP gibi DDL komutlarını çalıştıramaz. single user: Veritabanı dosyasını aynı anda bir tek kişinin kullanmasını sağlar. Bu komut çalıştırıldığı anda veritabanında birden fazla kişi bağlıysa bu özellik açıldıktan sonra kullanmaya devam ederler ancak bağlantı kesildiği andan itibaren bir tek kullanıcı kuralı dikkate alınır. Kurtarma Modeli Seçenekleri: Veritabanı ölçeklemede bir diğer seçenek de veri kurtarma modelidir. Bu işlem için olan seçenekler de aşağıdaki şekildedir. 1. Full Recovery Model: Bu seçenekte veritabanı üstünde yapılan işlemlerin logları tutulur. Bir veri kurtarma işleminde, log dosyaları ile birlikte veritabanı kayıtları da elde edildikten sonra veritabanı kurtarma işlemi gerçekleştirilebilir. Standart olan kurtarma seçeneği bu seçenektir. 2. Bulk_Logged Recovery Model: Full Recovery Model ile yaklaşık aynı seçe- İPUCU: Query Analyzer’i Enterprice Manager’den çağırmak mümkündür. Bunun en büyük faydası yetkilendirme bilgilerini yeniden girmemize gerek kalmamasıdır. Bu işlem için Enterprice Manager’dan bağlanmak istediğiniz veritabanını seçtikten sonra [Tools\SQL Query Analyzer]’i tıklamak yeterlidir. nekleri kullanır. Farklı olarak toplu işlemler için daha az log tutar. Örneğin SELECT INTO vb. gibi komutlar için daha kısıtlı bir log tutulur. 3. Simple Recovery Model: En basit transaction log tutma seçeneğidir. Daha çok küçük ölçekli ve deneme amaçlı veritabanlarında veya sadece okuma amaçlı kullanılan veritabanı dosyaları için kullanılır. Bunun dışında ticari amaçlı veritabanı uygulamalarında bu türden bir kurtarma modelinin seçilmemesi gerekir. SQL Query Analyzer Query Analyzer, SQL ve T-SQL temelli komutlarla Veritabanı Sunucularının konfigüre edilmesini sağlamanın yanı sıra SQL ifadelerini çalıştırma ve analiz etme konusunda faydalanılmak üzere geliştirilmiş bir SQL Server bileşenidir. Yine Query Analyzer ile bir veritabanına erişebilmek için yetkilendirilmiş bir işletim sistemi kullanıcısı veya domain kullanıcısı yahut veritabanı sunucusu yöneticisi hesabına sahip olmak gerekir. Bu kullanıcı grubunun hangisi veya hangilerinin geçerli olacağı, Enterprise Manager ile bir veritabanına sa (sistem yöneticisi) veya eşdeğeri bir hesap ile bağlandıktan sonra [properties\Security] sekmesinden düzenlenebilir. Yine nesneler için yetkiler Enterprise Manager sayesinde düzenlenebilir. Bir sonraki ünitede anlatılan T-SQL Veritabanı Programlama 2 BYTE 21 Resim 10. (1) Query Analyzer’de T-SQL komutlarının yazıldığı sorgu penceresi. (2) Sonu- cun ne olarak görünmesini istediğinizi bu menüden belirleyin. (3) Sorgunuzda bir sentaks hatası olup olmadığını denetlemek için bu kısmı kullanabilirsiniz. (4) Sorgunuzu çalıştırmak için bu kısmı kullanın.(F5 tuşuna da basabilirsiniz.) (5) Hangi veritabanında çalıştığınızı buradan görüp değiştirebilirsiniz. (6) Çalıştırma planını görmek için burayı tıklayın. (7) Nesneleri görmek için kullanılan menü ve nesneler. (8) Sorguların sonuç ekranı. (9) Şablonlara erişmek için bu menüyü kullanın. komutları ve Saklı Prosedür, Trigger, Cursor gibi veritabanın nesnelerinin oluşturulması esnasında Query Analyzer programı kullanılacaktır. SQL Server Query Analyzer’in belli başlı özellikleri: 1. T-SQL ifadelerini çalıştırmak için bir metin editörü 2. ANSI-SQL ve T-SQL için Sentaks 22 BYTE Veritabanı Programlama 2 boyama 3. Nesne gezgini ve nesne arama seçenekleri ile bir veritabanını veya üstünde yer alan nesnelere erişim kolaylığı. 4. Tablo oluşturmak gibi bir çok işlem için kullanılabilir hazır T-SQL şablonları. 5. Bir etkileşimli hata ayıklayıcı ile Saklı yordamlar için analiz imkanı. 6. Resultset’leri metin (text) temelli veya ızgara (grid) temelli sunabilme. 7. Grafik ve metin temelli Sorgu çalış- İPUCU: Veritabanında, kullanıcı bilgileri, haklar, nesneler ve özellikleri gibi bilgilerin tutulduğu veri tabloları için birçok literatürde Veri Sözlüğü (Data Dictionary) terimi kullanılır. Veritabanı oluşturulduğunda bir çok verinin yer aldığı bir çok tablo sistem tarafından oluşturulur ve sistemin kendi ihtiyacı olan bilgiler tutulur. Bir de proje tarafından referans alınan ve il listesi, tür kodları ve benzeri gibi sabit kayıtları içeren tablolar vardır ki bu türden tablolara da look-up table(referans tablosu) denir. tırma planı ile Query analiz etme seçeneği ile daha az kaynak tüketen sorgulamalar geliştirme imkanı 8. Index ayarlama sihirbazı ile T-SQL komutlarını analiz ederek daha iyi sorgu performansı için bir tablo üstünde ek bir index alana gerek olup olmadığını bulabilme.(İndeksler hakkında geniş bilgi için serinin ilk kitabına bakınız.) (Resim 10) Query Analyzer ile Veritabanı Oluşturmak: Create Database Enterprise manager ile görsel ortamda yaptığımız hemen her şeyi Query Analy- zer ile de yapmak mümkündür. Hatta bu ortamda doğrudan kodlarla muhatap olduğumuz için daha fazla detaya hükmetme şansına sahibiz. Bu kısımda, bir önceki bölümde Enterprise manager ile nasıl yapılacağını anlattığımız veritabanı oluşturma işini T-SQL komutlarını kullanarak nasıl yapabileceğimize değineceğiz. Bu işlem için kullanacağımız komutu, Create Database deyimini bir önceki kitapçıkta özet olarak anlatmıştık. Genel kullanımı şu şekildedir: CREATE DATABASE veritabani_adi [ON [PRIMARY] (NAME= veri_dosyasi_adi, FILENAME= fiziksel_veri_dosyasi_adi [, SIZE = veri_dosyasi_boyutu ] [, MAXSIZE= maksimum_veri_dosyasi_ boyutu ] [, FILEGROWTH=veri_artim_miktari]) [LOG ON (NAME= log_dosyasi_adi, FILENAME= fiziksel_log_dosyasi_adi [, SIZE = log_dosyasi_boyut] [, MAXSIZE= maksimum_veri_dosyasi_ boyutu ] [, FILEGROWTH=veri_artim_miktari] ) ] PRIMARY: Bazen veritabanı tanımlanırken birden fazla dosya üstünde veri saklayabilecek bir şekilde tanımlanabilir. Bu durumda birinci dosya PRIMARY ile belirtilen dosyadır. Bir dosya bir ana gruba sahip olabilir. PRIMARY deyimi kullanılmazsa bir veritabanı için tanımlanan ilk dosya PRIMARY dosya olarak kabul edilir. Bütün veritabanı tanımlama tabloları ve değerleri birincil dosyada saklanır. Birincil veri dosyası *.mdf ’ dir. İkincil veri Veritabanı Programlama 2 BYTE 23 dosyalarının uzantısı ise *.ndf ’ dir. veritabani_adi: Veritabanına vermeyi planladığınız isim. Bu isim VTYS tarafından geçerli kabul edilen ve T-SQL ile gönderimde bulunmak istediğiniz (ileri seviyeli işlemlerde) isim. veri_dosyasi_adi: Veritabanının fiziksel adı. Bu isim işletim sistemi tarafından bilinene ismidir. fiziksel_veri_dosyasi_adi: İşletim sistemi üzerinde saklanacak dosyanın adını ve yolunu belirtir. veri_dosyasi_boyut: Veri dosyasının MB cinsinden boyutunu belirtir. En az ve standart değer 1MB’tır. Bir birim belirtilmezse MB olarak alınır ancak diğer hafıza birimlerini de belirterek kullanmak mümkündür. GB, MB, KB gibi. maksimum_veri_dosyasi_boyutu: Bu veritabanının ne kadar boyut ile sınırlandırılacağını belirtir. Şayet bir değer girilmezse, tüm disk doluncaya kadar veritabanı dosyasına veri eklenebilir. artim_miktari: Veritabanının başlangıçta belirtilen boyutu dolduğunda sistem tarafından boyutu otomatik olarak artırılır. Bu aşamada veritabanının boyunun ne kadar artırılacağı bu parametre ile belirtilir. % oran değeri verilebileceği gibi sabit bir artım boyutu da girilebilir. Örnek 1: 24 BYTE Veritabanı Programlama 2 Bir önceki kitapçıkta da kullandığımız dbKutuphane veritabanını oluşturalım: Başlangıç boyutu 1MB olsun. En fazla 1GB‘a kadar olmak üzere her seferinde veri dosyası %20’si kadar artırılmak üzere en fazla 1GB’a kadar çıkarılabilsin. Veri dosyaları için isim kutuphane_data olsun ve fiziksel dosya adı ‘D: \data\dbKutuphane.mdf ’ olsun. Loglar için başlangıçta sadece 1 MB yer ayrılsın. Ancak bu alan dolarsa, her seferinde 1MB olmak üzere en fazla 1GB’a kadar sistem tarafından çıkarılabilisin. Loglar için sistem dosya adı kutuphane_log olsun ve fiziksel dosya adı ‘D:\data\dbKutuphane.ldf ’ olsun. CREATE DATABASE dbKutuphane ON PRIMARY (NAME =kutuphane_data, FILENAME= ‘D:\data\dbKutuphane.mdf’, SIZE = 1, MAXSIZE = 1GB, FILEGROWTH = 20% ) LOG ON( NAME = kutuphane_log, FILENAME= ‘D:\data\dbKutuphane.ldf’, SIZE = 1MB, MAXSIZE = 1GB, FILEGROWTH = 1MB ) Loglamadan Tablo Boşaltma: Truncate Table Bir tabloda yer alan tüm kayıtları silmek ama bu silme işlemleri için de satır bazlı birer transaction log oluşturulmasının istenmediği durumlar olabilir. (Özellikle replication ile ilgili uygulamalarda). Bu tür durumlarda TRUNCATE TABLE komutu kullanılır. Genel kullanımı şu şekildedir: TRUNCATE TABLE tablo_adi Burada, tablo_adi argümanı, İçeriğini satır satır loglamaksızın boşaltacağımız tablo adını ifade eder. TRUNCATE TABLE ile WHERE cümleciği olmayan DELETE komutu aynı işlevi yapar; bir tablonun tüm satırlarını boşaltır. TRUNCATE TABLE komutunu, WHERE koşulu olmayan DELETE cümlelerinin yerine kullanmak daha hızlı bir tablo boşaltma yöntemidir. Sistem kaynaklarını da TRUNCATE komutu daha az meşgul eder. Çünkü, her bir silinen satır için log oluşturmasında gerek yoktur. TRUNCATE TABLE komutunun neticesinde, tablonun sadece içerdiği veriler silinir. Kolonlar, zorlayıcılar, indeksler, trigger’ler ve benzeri diğer tablo üstünde yer alan tanımlamalar silinmez. Bu tür tanımlamaların da silinmesini istiyorsanız, DROP TABLE komutu ile tabloyu silmek gerekir. Örnek 2: DELETE * FROM kitap ile TRUNCATE TABLE kitap Komutlarının herhangi biri çalıştırılsa idi, daha sonra eklenecek bir kitap için sistem tarafından verilen kitapNo(kitap tablosunun otomatik artan anahtar alanı) alanı değeri arasında ne fark olurdu? 1. işlemden sonra, kitapNo alanına en son verilen kitapNo değerinin bir fazlası(bir sonraki daha doğru olur.) verilirdi. 2. işlemde ise kitap no tekrardan 1 değerinden(ilk verilen değerden) başlar ve eklenen her kayıt için artmaya devam eder. TRUNCATE TABLE komutu, yabancı anahtar zorlayıcılarına takılır. Bunun anlamı şudur, ödünç tablosunda, kitapNo yabancı anahtar olarak tanımlandığı için; kitap tablosu üstünde TRUNCATE komutu çalıştırıldığında, komut çalıştırılmayacaktır. Aksine DELETE * FROM kitap çalıştırılır. Çünkü DELETE komutu log tutar ve bu nedenle bir TRIGGER tetikleyebilir. Ancak TRUNCATE komutu log tutmadığı için trigger harekete geçiremeyeceği önlem olarak komut çalıştırılmaz. TRUNCATE TABLE komutu son olarak, indeksli görünüm(view) ‘lere iştirak eden tablolar için de çalıştırılamaz. TRUNCATE TABLE komutu, standart olarak tablonun sahibine(owner) aittir. Bu hak başka rollere ya da kullanıcılara aktarılamaz. Bir Sorguyu Query Analyzer ile Analiz Etme SQL Query Analyzer ile bir sorgunun çalıştırılma planını görsel ve metin bazlı olarak detaylı görerek üstünde optimiVeritabanı Programlama 2 BYTE 25 zasyon yapmak mümkündür. Böylece aynı sonucu daha hızlı üreten sorgular yazmak mümkün olabilmektedir. SQL Server Query Analyzer ile görsel çalıştırma planını görmek için 1. [Query>Display Execution Plan] seçeneğini işaretleyin. Kısayol olarak CTRL+L’yi de kullanabilirsiniz. 2. Daha sonra analiz etmek istediğiniz sorguyu yazıp çalıştırın. 3. Ardından [Estimated Execution Plan] sekmesini tıklayın. SQL Server’in çalıştırma planını metin ortamında bir resultset olarak döndürmesi için şu komutu kullanabilirsiniz: SET SHOWPLAN_TEXT ON go Dedikten sonra çalıştırdığınız bütün sorgular için bir metin bazlı çalıştırma planı da görüntülenecektir. 26 BYTE Veritabanı Programlama 2 Bu özelliği tekrar kapatmak için çalıştırmamız gereken komut oldukça basit: SET SHOWPLAN_TEXT OFF Go dememiz yeterli olacaktır. Ayrıca daha özet ama kapsamı geniş bir çalışma planı çıktısı almak için SQL Server’in SHOWPLAN_ALL özelliğini açabiliriz. Bunun için de şu komutu UYARI Bir tablo oluşturacak SQL cümleciğini çalıştırma planını görmek üzere Query Analyzer ile SQL Server’e gönderdiğimizi varsayalım. Bu durumda tablo oluşmayacağı için bu tabloya kayıt eklemeye kalkıştığımızda böyle bir tablonun olmadığına dair bir hata alırız. çalıştırmamız gerekir: SET SHOWPLAN_ALL ON go dedikten sonra çalıştırılan bütün sorgular özet çalışma planı verilecektir. Aynı şekilde bu özelliği tekrardan kapatmak için bu özelliği kapatmak yeterli olacaktır bunun için de şu komutu çalıştıracağız: SET SHOWPLAN_ALL OFF Go Çalıştırma Planını gösterirken SQL server kendisine gelen sorguları çalıştırmak yerine analiz ederek hangi işlemlerden geçerek çalıştırılacağını, hangi işlemin yaklaşık ne kadar zaman alacağını gösterir, öngörür. Çalıştırma planı özellikle DML(Veri İşleme Dili) için ve T-SQL ifadeleri için kullanılır. Bir Saklı Prosedür’ün, bir komut tarafından çağrılan Tetikleme(Trigger)’in daha az kaynak tüketerek daha kısa sürede nasıl gerçeklenebileceğini analiz etmede faydalanacağız. Örneğin bir SELECT ifadesini gerçeklemek için SQL Server tüm tabloyu taramak zorunda kalabilir(table scan) Bunu önlemek için bu tabloda bir birincil anahtar alan oluşturursak, bu sorgu artık table scan yerine indeks bulma (index seeking) yapacaktır. Bunun maliyeti de bir çok durumda table scan’a göre daha kısadır. SHOWPLAN_TEXT ve SHOWPLAN_ALL özellikleri yardımı ile alınan metin temelli çalıştırma planı daha tek düzedir. Her bir parametere birer satır gibi gösterilir. Görsel çalıştırma planı ise her bir düğüm için detaylı istatistikleri düğümün üstüne gelindiğinde gösterir. Ayrıca her bir düğüm için bu düğümde yapılan işlemleri özetleyen bir ikon ile gösterilir. Bu ikonların anlamı için SQL Server ile birlikte kurulan Books Online ya da MSDN’den yardım alabilirsiniz. Books Online’den Query Analyzer’in komut ekranına ‘Query Analyzer’ yazıp bu iki kelimeyi seçtikten sonra SHIFT + F1 tuşuna basmanız yeterlidir. Bulunan konulardan en baştakini tıklayarak ikonlar hakkındaki detaylara erişebilirsiniz. Diğer konularda da bilgi almak için aynı yolu kullanabilirsiniz. Resim 11 (Resim 11) Import & Export Data Bazen MS Access(*.mdb), text dosyası ya da MS Excel ve benzeri gibi yapılanVeritabanı Programlama 2 BYTE 27 Resim 12 dırılmış dosyalardan veri almak veya bu türden bir dosyaya veri aktarmak durumunda kalabiliriz. Bu durumda Import & Export Data toolu kullanılır. (Resim 12) İPUCU: MSDOS komut ortamından veritabanına erişmek için eski adı ile isql(Sybase’de halen aynı adla kullanılıyor), SQL Server’de ise osql.exe programı kullanılabilir. Bunun için komut satırını açtıktan sonra osql deyip enter’i tuşlayın. Ardından kullanıcı adı - şifreyi girin. SQL komutlarınızı yazıp go komutu ile bitirdikten sonra enter tuşuna basarak sonucunu görebilirsiniz. Bu programı sonlandırmak için exit yazıp enter’i tuşlamanız yeterlidir. Programın daha detaylı kullanımı için BOL(Books Online)’den yardım alabilirsiniz. 1. Bunun için öncelikle [Başlat\ Programlar\Microsoft SQL Server\ Import and Export Data] takip edilerek program başlatılır. 2. Uygun olan kaynak seçilir. Örneğin MS Access(*.mdb) 3. Uygun olan hedef seçilir. Örneğin MS Access’den SQL Server’e veri alacaksak, hedef SQL Server’dir. 4. Kaynakta var olan tablolar getirilir ve kullanıcının hangi tabloları aktarmak istediği sorulur. İstediğiniz tabloları işaretleyin. 5. Hemen çalıştırmak için Run Immediately seçeneğini kullanın. 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. SQL Service Manager 28 BYTE Veritabanı Programlama 2 düşey çizgi 4. Durduruldu: Yuvarlak içerisinde kırmızı kare SQL Server ve XML Desteği Resim 13 SQL Server’i başlatmak, durdurmak veya duraklatmak için kullanılan basit bir hizmet yönetim programcığıdır. (Resim 13) Bu servis çalışırken sistem çubuğunda (sistem saatinin hemen yanı) durumunu gösteren (çalışıyor, duruyor, duraklatılmış) ikon ile birlikte görünür. Bu ikon çift tıklanırsa resimde görünen ekran açılır. İşletim Sistemi kapatılıp açıldığında otomatik olarak başlatılmak için bu seçeneği işaretli olarak bırakmak gerekir. SQL Server’de 4 farklı durum için durum ikonu mevcuttur. Aynı durum ikonunu, Enterprise Manager ile kaydettirdiğiniz her bir Veritabanı için de görebilirsiniz. Bu 4 ikon şu şekildedir: 1. Çalışıyor, bağlanılmadı: yeşil ok 2. Çalışıyor ve bağlanıldı: Yeşil Yuvarlak içinde beyaz ok 3. Duraklatıldı: Yuvarlak içinde iki 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 ankronimdir. 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 (Standartd 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. SQL Server 2000 veri aktarımı ve saklama konusundaki bu son teknoloji için şu destekleri sağlar: •SQL Server’e URL üstünden erişim. •XML Data Schema desteği ve bu şemalar üstünde XPath sorgulama. •XML içerikli veri çekme ve XML’den veri ekleyebilme. Veritabanı Programlama 2 BYTE 29 Resim 14 XML Web Servisleri ile de bir veritabanınızı XML destekli olarak Web’e veya başka bir kurumun kullanımına istediğiniz kısıtlar doğrultusunda, açabilirsiniz. XML konusunu serinin son kitabında detaylı olarak serinin son kitabı ‘XML ve Web Servisleri’nde bulabilirsiniz. Örnek 3: Bir sorguda tablolara arsında hiyerarşik ilişkiyi de içeren XML çıkış üretmek İçin SELECT * FROM kitap FOR XML RAW kullanılır. SQL Server’de Veritabanı Nesneleri Bu kısımda anlatılan nesnelerin bir kısmı bir önceki kitapçıkta detaylı olarak incelenmişti. Diğer bir kısmı da bu kitapçıkta anlatılacaktır. Önemli olduğu düşünülen nesneler hakkında detaylı bilgi bu seride yer almamaktadır. 30 BYTE Veritabanı Programlama 2 Nesneler veritabanı yapıları içerisinde yer alır. SQL Server ilk kurulduğunda kendi ihtiyaçları için bir dize veritabanı ve her bir veritabanı da kendi içerisinde sabit bir dize nesne içerir. Bunlara VTYS’nin kendisinin ihtiyacı vardır. Bir SQL Server kurulduğunda şu veritabanları standart olarak kurulur: Master: Hangi veritabanları oluşturuldu, disk kullanımı, kullanıcı hesapları, sistem ayarları vb. gibi veritabanı ile ilgili ortam değer ve değişkenleri bu veritabanında yer alır. Model: Yeni oluşturulacak tüm veritabanları için bu veritabanı model alınır. Yani şablon veritabanıdır. Oluşturulacak her veritabanında olması istenen değişiklikler (tablo, saklı prosedür, trigger vs.) bu veritabanında yapılır. Msdb: SQL Server Agent servisi tarafından kullanılan veritabanıdır. Tempdb: Geçici bilgilerin saklandığı veritabanıdır. Bir sonraki ünitede, kullanımı hakkında bilgi verilecektir. Pubs: Örnek bilgilerin yer aldığı veritabanıdır. (Resim 14) Her bir veritabanı içerisinde yer alan nesneler şu gruplardan birine aittir: Diyagramlar: Veritabanındaki tabloların birbiri ile ilişkisini gösterir. Burada mantıksal olarak zorlayıcılar vb. gibi öğelerle ile ilişkilendirilmiş tabloların ilişkilerinin fiziksel olarak görünümü yer alır. SQL Server2000’de Tanımlı Veritabanı Rolleri Rol AÇIKLAMA db_accessadmin Veritabanı Erişim Yöneticisi db_backupoperator Veritabanı Yedekleme Operatörü db_datareader Veritabanı Veri Okuyucusu db_datawriter Veritabanı Veri Yazıcısı db_ddladmin Veritabanı DDL Yöneticisi db_denydatareader Veritabanı engelli veri okuyucu db_denydatawriter Veritabanı engelli veri yazıcı db_owner Veritabanı Sahibi db_None Boş db_securityadmin Veritabanı Güvenlik Yöneticisi Tablolar: Veritabanının kayıtları saklayan mxn boyutlu matrisleridir. Bir çoğu kullanıcı tarafından tanımlanır. Sistem tarafından kurulum aşamasında oluşturulup kullanılan tablolar da yer alır. Tablolar hakkında ilk kitapta yeterince konuşmuştuk, burada sadece şunu da eklemek yeterli olur sanırım: Bir tablo 8060byte’ten daha uzun olmamalıdır. Bu, SQL Server’in disk yönetim birimi ‘sayfa’nın boyutundan kaynaklanan bir sınırlamadır. Tabloları meydana getiren satırlar, sayfalar halinde saklanır ve bir tablonun bir satırı en fazla bir sayfa yer kaplayabilir, ikinci sayfaya taşamaz. Görünümler (view): Gerçekte olmayan tablolardır. Veritabanında var olan tablolar üstünden select işlemi ile getirdikleri sonuçları ifade eden nesnelerdir. (Bir önceki kitapçıkta hakkında geniş bilgi verilmiştir.) Saklı prosedürler (Stored Procedures): Bir dize T-SQL(MSSQLServer - Sybase) veya PL/SQL(Oracle) komutunun bir işlevi yerine getirmek üzere paketlenmiş halidir. Kullanıcılar: Sistemdeki nesnelere erişim hakkı verilmiş birer kullanıcı adı ve şifrenin sistemdeki eşdeğeridir. Bir kısmı sistem tarafından oluşturulabileceği gibi örneğin (dbo) daha sonra veritabanı yöneticisi tarafından da ekleVeritabanı Programlama 2 BYTE 31 SQL Server 2000’de Tanımlı Server Rolleri Rol AÇIKLAMA dbcreator Veritabanı oluşturucusu diskadmin Disk Yöneticisi processadmin İşlem Yöneticisi securityadmin Güvenlik Yöneticisi serveradmin Sunucu Yöneticisi setupadmin Kurulum Yöneticisi sysadmin Sistem Yöneticisi bulkadmin Toplu Ekleme Yöneticisi nebilir. Roller: Veritabanında yapılabilecek belli başlı işlemler, belli nesneler üstünde belli haklar için erişim tanımlayarak oluşturulan hak grubu. Bu gruplar daha sonra kullanıcılara aktarılır. Böylece VTYS üstünde var olan sayısız erişim ve yetkilendirme için denetleme işlemi gruplar üstünden denetlenebilir. Default’lar: Bir alana değer girilmemesi halinde, bir değer ile başlaması için default nesneleri tanımlanır. Örneğin bir hesap yeni açıldığında para yatırmadığınız sürece hesabınızda 0 lira görünür. Kullanıcı Tanımlı Tipler: Her ne kadar ANSI SQL’de standartta tanımlı veri tiplerinin dışındaki veri tiplerini kullanamasak da VTYS’ler bunu aşarak kullanıcının gerektiğinde veri tipi tanım- 32 BYTE Veritabanı Programlama 2 lamalarına olanak sağlarlar. Kullanıcı Tanımlı Fonksiyonlar: ANSI SQL’de tanımlı fonksiyonların bir kısmını ve bazı VTYS’ler tarafından sağlanan ek fonksiyonları bir önceki kitapçıkta anlatılmıştı. Tüm bu ANSI ve Sistem fonksiyonlarının dışında kullanıcı ihtiyaç duyduğunda fonksiyon da tanımlayabilmektedir. Her ne kadar saklı prosedürler(SP) fonksiyon benzeri bir görevi yerine getirse de kullanıcı tanımlı fonksiyonlar işlev olarak daha özel işlemlerde kullanılır. Tetiklemeler (Trigger): Trigger’ler bir tabloya kayıt eklendiğinde veya silindiğinde otomatik olarak devreye giren özel saklı prosedürlerdir. Özellikle veritabanı tutarlılığını sağlamak için kısıtlayıcıların yetersiz kaldığı durumlarda (örneğin basamaklı güncelleme gibi) kullanılır. SQL Server ve Kullanıcı Yönetimi SQL Server’de kullanıcı yönetimi ile ilgili iki tip öğe bulunmaktadır: Roller ve kullanıcılar. Kullanıcı tek bir kişiye ait tanımlamaları içerirken roller yetki ve erişim tanımlamalarını gruplamada kullanılır. Bir rol bir çok kullanıcıya atanarak, haklar üstünde bir gruplamalı erişim yönetimi uygulanabilir. Böylelikle her bir kullanıcının haklarını teker teker oluşturup yönetmek yerine roller ciddi şekilde denetlenebilir. Çünkü bir çok kullanıcı için neredeyse aynı haklar ve yetkiler verilir. Bir okul otomasyonu gerçekleştiriyorsak, bir çok öğretmen kullanıcısının aynı tablo ya da T-SQL ifadelerine erişimleri olmak durumundadır. Öğrenciler için de aynı şey geçerlidir. Roller: Birden fazla kişiye verilebilen ve yetkilendirmeler için bir grup oluşturmada kullanılan kullanıcılara yönelik tanımlamalardır. Halihazırda var olan ve değiştirilemeyen rollere sabit sistem rolü(fixed system role) denir. İki grup sabit sistem rolü vardır: sabit server rolleri ve sabit veritabanı rolleri... Kullanıcılar: SQL Query Analyzer’de yeni bir kullanıcı oluşturmak için, create user deyimi kullanılır. Genel kullanımı şu şekildedir. CREATE USER (Kullanici_adi) identified by (sifre) default tablespace kullanici_verileri; Kullanici_adi: kullanıcı adı. Zorunlu. sifre: Kullanıcının şifresidir. kullanici_verileri: Kullanıcı verilerinin nerede tutulduğunu belirtir. sa (systemAdmin) rolüne sahip temel kullanıcıdır. Güvenlik nedeniyle bu kullanıcının adını değiştirilmesi önerilir. Ancak bu ayrı bir tartışma konusu. Yetki verme (Grant Komutu) Grant komutu ile bir kullanıcının veya tüm kullanıcıların bir T-SQL ifadesine ya da veritabanına erişimi için güvenlik sisteminde izin açmaya yarar. Bu komut ile yapılabilecek hemen her şey Enterprise Manager programı ile de yapılabilir. Genel kullanımı şu şekildedir: GRANT {ALL [PRIVILEGES] |izin[,....n]} { [(kolon[,...n])] ON {tablo|view} [(sutun[,...n])] |ON {sp|ep|udf} } TO guvenlik_hesabi[,...n] [WITH GRANT OPTION] [AS {kullanici_grubu|rol}] ALL: Tüm verilebilecek hakların verileceğini gösterir. db_owner, sysadmin ve database object owner tarafından kullaVeritabanı Programlama 2 BYTE 33 nılabilir. TO: iznin kimlere verileceğini belirtir. guvenlik_hesabi: Bir veritabanı giriş hesabı, işletim sistemi kullanıcısı ya da domain kullanıcısı olabilir. n: Bir önünde geçen şeyin n defa tekrar edebilir olduğunu gösteren yer tutucu. PRIVILEGES: ANSI-92’ye uyumlu olsun diye konmuş bir kelime olup kullanımı isteğe bağlıdır. sp: Saklı Prosedür adı. ep: Genişletilmiş Prosedür adı. udf: Kullanıcı Tanımlı Fonksiyon adı. izin: •Tablolar için SELECT, INSERT, DELETE, REFERENCES veya UPDATE gibi izinlerdir. UPDATE ve SELECT için gerekirse sütun tanımları da verilebilir. Aksi halde verilen izin tüm sütunlar için geçerli olur. REFERENCES ile tablo üstünde bir alana yabancı anahtar olarak referans içeren bir başka tablo vs. oluşturabilme izni verir. •Nesneler için (SP, EP, UDF) ek olarak tek izin vardır; EXECUTE. EXECUTE ile bir nesneye çalıştırılma izni verilebilir. Ayrıca REFERENCES ile referans verebilme izni de sağlanabilir. Nesneler için REFERENCES, View oluştururken kullanılan WITH SCHEMABINDING deyimi ile bu nesnenin ürettiği sonuçları içerebilmesine hak sağlar. tablo: Veritabanında yer alan tablo adı view: Veritabanında tanımlı view adı sutun: adı verilen tablo ya da view’de 34 BYTE Veritabanı Programlama 2 geçen sütun ad(lar)ı WITH GRANT OPTION: Sadece nesneler için geçerli olan bu deyim ile izin verilen bir kullanıcının bu nesne üstünde başka birine daha kullanım izni verebilme hakkı sağlayabilmesine yarar. AS: Nesne için yetki tanımlaması, kullanım yetkisi olanların dışında Bir kullanıcı grubuna ya da role de yetkilendirme yetkisi açmak için kullanılır. Örnek 4: sp_kitapbul adında bir saklı yordam üstünde SQLServer’e giriş hakkı olan herkese tüm haklarını açalım: GRANT ALL ON sp_kitapbul TO public; ile bu iş tanımlanır. Yetki Kaldırma (Revoke Komutu) GRANT komutu ile verilen hakların bir çoğu Enterprise Manager kullanılarak görsel bir ortamda geri alınabilir ancak Query Analyzer ile kod yazarak bu hakları geri almak için REVOKE komutu kullanılır. Genel kullanımı şu şekildedir: REVOKE [GRANT OPTIONS FOR] {ALL [PRIVILEGES] |izin[,....n]} { [(kolon[,...n])] ON {tablo|view} [(sutun[,...n])] |ON {sp|ep|udf} } {TO|FROM} guvenlik_hesabi[,...n] [CASCADE] [AS {kullanici_grubu|rol}] REVOKE komutunu çalıştırabilmek için sys_admin sabit sunucu rolüne veya db_owner, db_securityAdmin sabit veritabanı rollerine sahip kullanıcı olmak ve elbette nesne için dbo olmak gerekir. ALL: Nesne üstünde verilen tüm izinlerin iptal edileceğini anlatır. FROM: Güvenlik hesabı listesi belirtmede kullanılır. GRANT OPTION FOR: Bu kelimelerle REVOKE komutu çalıştırıldığında kullanıcılılar nesneleri kullanmaya devam eder ancak yeni kullanım hakkı tanımlayamaz. guvenlik_hesabi: Bir veritabanı giriş hesabı, işletim sistemi kullanıcısı ya da domain kullanıcısı olabilir. n: Bir önünde geçen şeyin n defa tekrar edebilir olduğunu gösteren yer tutucu. PRIVILEGES: ANSI-92’ye uyumlu olsun diye konmuş bir kelime olup kullanımı isteğe bağlıdır. sp: Saklı Prosedür adı. ep: Genişletilmiş Prosedür adı. udf: Kullanıcı Tanımlı Fonksiyon adı. izin: •Tablolar için SELECT, INSERT, DELETE, REFERENCES veya UPDATE gibi izinlerdir. UPDATE ve SELECT için gerekirse sütun tanımları da verilebilir. Aksi halde verilen izin tüm sütunlar için geçerli olur. REFERENCES ile tablo üstünde bir alana yabancı anahtar olarak referans içeren bir başka tablo vs. oluşturabilme izni verir. DİKKAT: Bir saklı prosedür için yetki verme yetkisi dbo’ya aittir.(Yani bu nesneyi oluşturan kişiye) Bu nedenle REVOKE komutu çalıştırıldığında bu saklı prosedürü oluşturan kişinin nesne üstündeki yetkilendirme ve kullanma hakkı kaybolmaz. •Nesneler için (SP, EP, UDF) ek olarak tek izin vardır; EXECUTE. EXECUTE ile bir nesneye çalıştırılma izni verilebilir.Ayrıca REFERENCES ile referans verebilme izni de sağlanabilir. Nesneler için REFERECES, View oluştururken kullanılan WITH SCHEMABINDING deyimi ile bu nesnenin ürettiği sonuçları içerebilmesine hak sağlar. tablo: Veritabanında yer alan tablo adı view: Veritabanında tanımlı view adı sutun: Adı verilen tablo ya da view’de geçen sütun ad(lar)ı CASCADE: Hak verme hakkını kaldırırken kullanılır. Yetki verme yetkisi kaldırıldıktan sonra, bu kişiler tarafından yetkilendirilen kişilerin yetkilerini de kaldırır. Örnek 5: ogrenci kullanıcısından saklı prosedür ve tablo oluşturma yetkilerini kaldıralım: REVOKE CREATE PROC, CREATE TABLE FROM ogrenci Örnek 6: Bir önceki bölümde üstünde yetki tanımVeritabanı Programlama 2 BYTE 35 2. Bölüm T-SQL ve VTYS temelli programlama A NSI SQL, veritabanı ile ilgili veri işleme ve düzenleme işlevleri için geliştirilmiş bir standart dildir. Ancak bu dil zaman zaman bir programlama dili olmadığından kayıt işlemede yetersiz kalabilmektedir. Çünkü, gelişmiş programlama dillerinde yer aldığı halde bu dilde WHILE, IF gibi temel mantık ve döngü yapıları mevcut değildir. Değişken kullanımı da tanımda yer almaz. İşte Transact-SQL bu noktada devreye giren ANSI 92 dahilinde bir standart dışı dildir. T-SQL’in geliştirilmesindeki en temel amaç, VTYS dışında döngü veya mantıksal karşılaştırma gerektiren konularda ayrıca bir derleyiciye, programlama dili öğrenmeye, sistem oturtmaya gerek kalmadan bu türden işlemleri yerine getirebilecek olanakları sağlamaktır. Bir sonraki konuda yer alan stored procedures, triggers gibi programcıkları yazarken DİKKAT: T-SQL Microsoft SQL Server ve Sybase için geçerli bir dildir. Oracle kullananların, PL/SQL öğrenmeleri gerekir. Ancak bu iki dil birbiri ile yaklaşık aynı özellikleri haizdir. bu dili kullanacağız. T-SQL ile ANSI-SQL komutlarını çalıştırma: T-SQL ile SQL komutlarını VTYS’ye çalıştırmasını söyleyebiliriz: Bir defada, SQLServer birden fazla SQL komutunu arka arkaya çalıştırabilir. Ancak her bir komutun sonuna go eklememizi ister. Genel yapısı şu şekildedir: ANSI-SQL KOMUTLARI BU SATIRLARA YAZILIR go Örnek 7: Bu projede kullandığımız veritabanını oluşturalım: CREATE database dbKutuphane on default go use dbKutuphane go CREATE TABLE kitaplar( kitapNo INTEGER NOT NULL, kitapAdi VARCHAR(63) NOT NULL, ISBNNo VARCHAR(15), sayfaSayisi INTEGER, kitapOzeti VARCHAR(255)) go Değişken Tanımlama ve Kullanma: T-SQL kullanmamızın en büyük nedenVeritabanı Programlama 2 BYTE 37 tanımlayabiliriz: DİKKAT: SQL’deki ve bir çok diğer programlama dillerinin aksine, T-SQL’deki değişkenler @ ile başlamak zorundadır. Örnek 9: declare @kitapNo INT,@kitapAdi VARCHAR(63) go Değişkenlere değer atama, lerinden birinin değişken tanımlama olduğunu söylemiştik. Değişken: Programlama dillerinde, değeri daha sonra akışlara göre değişecek bir değer için hafızada(RAM’de) bir yer ayırmak için kullanılan yapıdır. Hafızadaki bu değere daha sonra değişkenin adı ile erişilir ve yeni değeri atanır. Değişkene atanan her yeni değer bir eski değeri siler. Değişkenler şu şekilde tanımlanır: declare @degisken_adi veritipi[(boyut)] declare @kitapNo INT, @kitapAdi VARCHAR(63) SET @kitapNo=255 SET @kitapAdi= ‘107 Kimya Öyküsü’ SET @kitapNo=256 -- Artık kitapNo değişkeninin değeri 256,255 silindi. go şeklinde yapılır. Ancak T-SQL’in asıl amacı SQL’in yeteneklerini artırmaktır. Bundan dolayı değişkenlerin en genel kullanım amacı, bir sorgunun sonucundaki değerlerden birini alıp bir değişkene aktarmaktır. Örnek 8: declare @kitapNo INT declare @kitapAdi VARCHAR(63) go ya da bir satırda birden fazla değişken İPUCU: Değişken isimlerinin nelerden oluşması gerektiği hakkında genel bilgi için serinin ilk kitabında [Veritabanı Programlama-I, s .15, Temmuz 2003] bulabilirsiniz. Seride yer alması nedeniyle kurallara burada yeniden bu konuya yer verilmedi. 38 BYTE Veritabanı Programlama 2 Örnek 10: declare @enSonEklenenKitap INT SELECT @enSonEklenenKitap=MAX(kitapNo) FROM Kitap go Değişkenler ve Sistem Fonksiyonları: Bir veritabanına aynı anda bir çok kişi oturum açabilir. Bir tek oturumda geçerli değişkenlere yerel değişken denir. Bazen bütün oturumlarda geçerli değişkenlere ihtiyaç duyulur. Bu tür durumlarda, ortam değerlini ayarlamak üzere veya çeşitli durumları tanımlamak üzere fonksiyonlar kullanılır. Bu fonksiyonların bir listesini kitabın sonundaki ek kısmında bulabilirsiniz. Örnek 11: Üstünde çalışmakta olduğunuz SQLServer’e açıldığından beri toplam kaç kere kullanıcılar veya programlar tarafından bağlanılmıştır? SELECT @@connections; ->>27 SQL Server’i durdurup yeniden başlatın ve aynı şeyi tekrar deneyin. Şimdi ne görüyorsunuz? Sayının tekrar sıfırdan başladığını göreceksiniz. Print komutu: Bazen değişkenlerin değerini, hata mesajlarını vs. mesaj olarak görmek isteriz. Bu tür durumlarda, print komutu kullanılır. Örnek 12: Kitap numarasını SQL sorgusu ile bulalım ve bu sonucu yazdıralım: declare @sonuc int SELECT @sonuc= COUNT(*) FROM Kitap print @sonuc go ->> 16 Akış Kontrolleri: T-SQL’i ANSI-SQL’e eklenti olarak gerektiren en önemli nedenlerden biri, ANSI-SQL’in akış kontrollerine izin vermemesidir. T-SQL bir programlama dili kadar geniş olmasa da belli başlı akış kontrollerini sağlar. T-SQL’de akış kontrolleri BEGIN ile DİKKAT: SYBASE’de yapılandırma fonksiyonlarının yerine ortam değerleri, global değişkenler adı ile anılırlar. Kullanım konusunda bariz bir fark olmamasına rağmen her türlü teknik dokümanda isimler bu şekilde kullanılmaktadır. başlayıp END ile biten bloklar arasında yazılır. Genel Kullanımı şu şekildedir: BEGIN Program kodları .... ... END T-SQL’in sunduğu belli başlı akış kontrolleri şunlardır: İPUCU: T-SQL’de bir satırın dikkate alınmaması isteniyorsa, ‘--’ ile bu belirtilebilir. MSSQLServer ve Sybase’de aynı işlemi C, C++, C#, Java’da olduğu gibi ‘/*..... */’ ile de yapabilirsiniz. SYBASE, ‘--’ işaretini bazı toolarında dikkate almazken, MS SQL Query Analyzer de ‘//’ işaretini dikkate almamaktadır. Aslında ‘--’ SQL92’de tanımlanan bir açıklama belirtici işarettir. Veritabanı Programlama 2 BYTE 39 1.IF ... ELSE karar yapısı if(şart1) deki şart1 doğru ise if(şart1)’den sonra gelen BEGIN ile END arasındaki kodlar çalıştırılır. Daha sonra if bloğunun en altındaki kodlardan devam eder. Şart1 doğru değil ise, elseif(şart2)deki şart2’ye bakılır. Bu şart doğru ise, şartı takip eden BEGIN ile END ifadeleri arasındaki kodlar çalıştırılır, if bloğunun sonuna gider ve takip eden kodları çalıştırır. Şart2 de yanlışsa, elseif(şart3)’deki şart3’e bakılır. Şart3 doğru ise takip eden Go Komutu Bir SQL Server’e bir seferde birden fazla komut gönderilebilir. SQL Server bu komutları yığınlar halinde almaktadır. GO komutu, T-SQL komut yığının sonunu belirtmek için kullanılır. Genel kullanımı, GO şeklindedir. GO aslında kendisi T-SQL’in bir parçası değildir. Query Analyzer, osql ve isql tooları tarafından algılanabilen bir komuttur. SQL Server tooları GO komutunu, T-SQL komutlarından oluşan yığını SQL Server’e gön- 40 BYTE BEGIN ile END deyimleri arasındaki kodlar çalıştırılır, if bloğunun en sonuna gider ve takip eden kodları çalıştırır. Şart3 yanlış ise bu aradaki kodları da çalıştırmadan geçer. genel yapısı şu şekildedir: if(şartlar) begin .... end else if(şartlar) begin ... end dermek için bir işaret olarak yorumlarlar. En sonunda GO komutu verilmedikçe, Client uygulamaları komutları sunucuya göndermezler, doğaçlama sorgu oturumunun kapanması için de yine GO komutuna ihtiyaç duyulur. T-SQL komutları, GO komutu ile aynı satırda yer alamaz, ancak Go komutundan sonra açıklama gelebilir. Kullanıcının komut yığınları hususunda kurallar riayet etmelidir. Örneğin, Stored Procedure (SP için bkz. Bölüm: 3) çağırırken, SP ya yığının ilk komutu olmalıdır Veritabanı Programlama 2 veya EXEC komutu ile birlikte kullanılmalıdır. Ayrıca, bir yerel değişkenin etki alanı komut yığını ile sınırlıdır. Bir yerde GO dendikten sonra, yeni bir yığın başladığından GO komutundan önce tanımlanan ya da değer atanan skaler değişkenler ve içerikleri kaybedilecektir. Ancak aynı şey veriye satır satır erişmek için kullandığımız Cursor’lerde geçerli değildir. Yine SP tanımlayacaksak, bu komutun yığının ilk satırında yer alması gerekir. Aksi halde SQL server hata verir ve SP oluşturmaz. Örnek 13: -- dbKutuphane veri- else begin .... end •kitabın sayfa sayısı 500’den fazla ise burası çalışır. Örnek 14: Kitaplıktaki en kalın kitap hakkında fikir beyan eden T-SQL kodu: declare @sayfaSayisi int SELECT @sayfaSayisi=MAX(sayfaSayisi) FROM Kitap if (@sayfaSayisi>500) BEGIN tabanını kullanmaya başlaması için -- veritabanına bir kod yığını gönderelim. -- Bir satırlık bir yığın. USE dbKutuphane GO -- Bir T-SQL komut yığını bitti ve yenisi başladı. Bu satır -- bir üst satırda, GO komutu ile birlikte açıklama satırı kullanıldı. DECLARE @degisken VARCHAR(50) SELECT @degisken = ‘Merhaba T-SQL.’ GO -- @degisken adlı değişken artık geçerli değil çünkü T-SQL komut yığını bitirildi.. PRINT @degisken -- Haliyle de bu kısımda hata meydana gelecektir. Çünkü değişken artık yok.. GO -- Yeni bir T-SQL komut yığını burada başladı. -- Burada çağrılan saklı prosedür düzgün olarak çağrılacaktır. -- çünkü yığının ilk komutu... sp_who SELECT @@VERSION; print ‘Bu kitaplıkta çok kalın bir kitap varmış.’ END else if(@sayfaSayisi>100) BEGIN •kitabın sayfa sayısı 100’den büyük, 500 den küçük ise burası çalışır print ‘kitaplıktaki en kalın kitap çok da kalın değil.’ -- Hata verecek çünkü ilk satır olmayan bir yerde saklı prosedür çağrılıyor. -- SP ya yığının ilk komutu olmalı veya EXEC komutu ile birlikte kullanılmalıdır. sp_who GO ODBC, OLE-DB ve diğer bileşenler üstünden çalışan uygulamalar, GO komutunu SQLServer’e göndermezler. Böyle bir komut bu bileşenler üstünden gönderilmeye çalışılırsa bir hata meydana gelir. GO komutunu kullanabilmek için bir izin gerekmez. Sistemdeki herhangi bir kullanıcı tarafından bu komut çalıştırılabilir. Çünkü tek başına veritabanı için hiçbir şey demektir. Veritabanı Programlama 2 BYTE 41 print ‘bu kitaplıkta kalın kitap yok’ END -- İPUCU: BEGIN ve END, C/C++/C#/Java gibi programlama dillerindeki ‘{‘ ve ‘}’ gibi kullanılır. Aynı işlev için Delphi’de BEGIN ve END kullanılır. •kitabın sayfa sayısı 100’den küçük ise bu kısım çalışır. print ‘bu kütüphanede broşürden başka bir şey yok mu?’ END go ->> kitaplıktaki en kalın kitap çok da kalın değil. Bir sorguya bağlı if yapıları kullanılabilir: Örnek 15: if(SELECT MAX(SayfaSayisi) FROM Kitap)>=500 BEGIN print ‘bu kitaplıkta kalın kitaplar var’ END else BEGIN İPUCU: Prosedürel dillerde olduğu gibi, tek satırlık if için blok kullanımına gerek yoktur. BYTE Bu durumda bir önceki örneğimizi şu şekilde de kodlayabiliriz: if(SELECT MAX(SayfaSayisi) FROM Kitap)>=500 print ‘bu kitaplıkta kalın kitaplar var’ else END else BEGIN 42 >> bu kitaplıkta kalın kitap yok Veritabanı Programlama 2 print ‘bu kitaplıkta kalın kitap yok’ Herhangi bir dallanmayı iki satıra tamamlayın. Ne görüyorsunuz? (Query Analyzer hata verecektir.) IF yapısının en yaygın kullanımlarından biri de IF EXISTS yapısıdır. Genellikle bir veri ya da nesnenin daha önceden var olup olmadığı bu yapı ile test edilir. Örnek 16: Hiçbir kitap kaydı yoksa kitap tablosunu silmek için: IF NOT EXISTS(SELECT * FROM Kitap) DROP TABLE kitap ->>(hiç satır silinmez) 2.CASE deyimi: Case yapısı ANSI92 standartları ile uyumlu bir karar döngüsüdür ve oldukça kısa kod ile etkin programlar oluşturmamıza yarar. Örneğin dışarıdaki kitaplar için ‘dışarıda’ yazabilecek bir kod bu komut sayesinde basitçe yazılabilir. Genel yapısı şu şekildedir: ... CASE WHEN şart THEN değer [ ELSE değer] END Örnek 17: Ödünç tablosunda yer alan kitap numaralarının bir dökümünü ve içerde ise yanına içeride; dışarıda ise dışarıda yazdıracak T-SQL kodunu oluşturalım: Örnek 18: declare @degisken VARCHAR(29) SELECT ISNULL(@degisken,’boşluk ise bu değer seçilecek’) ->> boşluk ise bu değer seçilecek 3.While Döngüsü WHILE ile, bir işlemi istediğimiz kadar tekrarlatabiliriz. Bu bize tekrar gerektiren işlemlere kolaylık sağlar. Genel yapısı şu şekildedir: WHILE şart BEGIN Tekrarlaması gereken kodlar buraya yazılır END Şart sağlanıncaya kadar, BEGIN ile END arasına yazılan kodlar çalıştırılacaktır. SELECT kitapNo,geldiMi, ‘kitapDurumu’= Case Örnek 19: Integer bir değişken tanımlayalım ve değeri 15 oluncaya kadar bir artıralım. 15 olduğunda da yazdıralım: WHEN geldiMi = 0 THEN ‘Dışarıda’ WHEN geldiMi = 1 THEN ‘İçeride’ End FROM odunc ISNULL fonksiyonu: ISNULL(kontrol_edilecek_deger, null_ ise_cikacak_deger) şeklinde kullanılır. kontrol_edilecek_deger: Bir sütun adı ya da değişken adı olabilir. null_ise_cikacak_deger: Bir sütun adı, değişken adı veya sabit bir değer olabilir. İPUCU: Query Analyzer’de bir komut ya da kelime hakkında yardım almak isterseniz, (normal bir kurulum için) o kelimeyi seçtikten sonra, klavyenizden Shift + F1 tuşlarına basmanız yeterli olacaktır. Böylelikle, MSSQL Server’iniz ile birlikte kurulan Books Online’den aradığınız kelime ile ilgili konular seçilecektir. Veritabanı Programlama 2 BYTE 43 DECLARE @sayac INT SELECT @sayac = 1 WHILE (@sayac < 15) BEGIN SELECT @sayac = @sayac END + 1 print ‘sayac :’ print @sayac ->> sayac : >>15 BREAK komutu: Break komutu, WHILE döngüsünden bir uç şarttan dolayı çıkmak üzere kullanılır. BREAK ile while döngüsünden çıkıldığında, WHILE’in END’ini takip eden kodlardan devam edilir. Örnek 20: Yukarıdaki örnek için, sayac değerinin 15 olması durumu bizim için yeterlidir ve bu durumda döngüden çıkmamız gereksin: DECLARE @sayac INT SELECT @sayac = 0 WHILE (@sayac <> 15) BEGIN SELECT @sayac = @sayac + 2 if @sayac > 15 BEGIN print ‘Bir alt satır olmasa kısır döngü hatası olacaktı’ break END else BEGIN Print ‘Henüz bir kısır döngü hatası olmadı’ END END print ‘sayac :’ print @sayac ->>Henüz bir kısır döngü hatası olmadı >>Henüz bir kısır döngü hatası olmadı >>Henüz bir kısır döngü hatası olmadı >>Henüz bir kısır döngü hatası olmadı >>Henüz bir kısır döngü hatası olmadı 44 BYTE Veritabanı Programlama 2 >>Henüz bir kısır döngü hatası olmadı >>Henüz bir kısır döngü hatası olmadı >>Bir alt satır olmasa kısır döngü hatası olacaktı >>sayac : >>16 CONTINUE komutu: Break komutu gibi, WHILE döngüsünde bir uç şartı kontrol etmek için kullanılır. Ancak bu komut, break’in aksine WHILE yapısının başlangıcına götürür ve eldeki değerlerle oradan programcığın devam etmesini sağlar. Örnek 21: DECLARE @sayac INT SELECT @sayac = 1 WHILE (@sayac < 15) BEGIN SELECT @sayac = @sayac if (@sayac=11) BEGIN Continue END print ‘sayac : ‘ print @sayac + 1 END go Sonucunda, 1,2,3,4,5,6,7,8,9,10,12,13, 14,15 yazdırılacaktır ama 11 yazdırılmayacaktır. T-SQL ile oluşturulup yönetilebilecek nesneler şunlardır: Örnek 22: (Ev Ödevi)Bir önceki örneği, continue yerine break koyarak tekrar ediniz. Ne sonuç ile karşılaştınız? Cevap: 1,2,3,4,5,6,7,8,9,10 Geçici Tablolar Bazen geçici bir süre için ek tablolara ihtiyaç duyabiliriz. Bu tür durumlarda, T-SQL ile geçici tablolar oluşturup onları DİKKAT: ÖLÜMCÜL HATA!!! WHILE döngüsünde, döngünün devam edip etmeyeceğini tayin eden şart kısmına, mutlaka sağlanacak bir koşul yazdığınızdan emin olun. Aksi halde, sonsuza kadar çalışacak bir kod yazabilirsiniz ki böyle bir şey pratikte mevcut değildir. Sadece SQL Server’in kilitlenmesine neden olursunuz. Bir önceki örnekte, @sayac değişkeni 14 ve 16 değerlerini alacak anacak asla 15 değerini alamayacaktır. Bu durumda sonsuza kadar çalışacak bir kod yazmış oluruz. Durumu if deyimi içerisinde kontrol ederek ölümcül hatayı engelledik. kullanabiliriz. Geçici tablolar, kullanıcı çıkış yaptığında veya SQLServer kapatıldığında otomatik olarak silinirler. Geçici tablolar oluşturmanın iki yolu vardır: 1.Yöntem: Oturum boyunca geçerli geçici tablolar oluşturmak için kullanılır. CREATE TABLE #tablo_adi( Alan1 tur1[(boyut1)] [[NOT] NULL], Alan2 tur2[(boyut2)] [[NOT] NULL], .... Alann turn[(boyutn)] [[NOT] NULL] ) Bu şekilde oluşturulan tablolar oturum kapandığında veya SQL Server durdurulduğunda silinir. Örnek 23: Geçici bir kitaplar tablosu oluşturalım: CREATE TABLE #kitap( KitapNo INT, KitapAdi VARCHAR(55), ISBNNo CHAR(16) ) Daha sonra tabloya, normal bir tabloymuş gibi kayıt ekleyebiliriz: INSERT INTO #kitap SELECT kitapNo,kitapAdi,ISBNNo FROM Kitap WHERE kitapNo < 10 Ya da tabloda yer alan kayıtları SELECT * FROM #kitap İle görebiliriz. Kayıtları güncelleyebiliriz ya da silebiliriz. Ancak bu tablo, oturumu kapattığımız anda veya SQLServer kapatıldığı anda silinecektir. Bunun dışında biz de istediğimiz zaman bu tabloyu bildiğimiz yöntemle silebiliriz: DROP TABLE #kitap go 2.Yöntem: Geçici tablo oluşturmanın bir diğer yolu, tempdb adlı veritabanı dosyasına bir tablo açmaktır. Bu veritabanındaki tablolar, sadece SQLServer kapatıldığında silinir. Genel yapısı şöyledir: CREATE TABLE tempdb..tablo_adi( Alan1 tur1[(boyut1)] [[NOT] NULL], Alan2 tur2[(boyut2)] [[NOT] NULL], .... Alann turn[(boyutn)] [[NOT] NULL] ) Bu yöntemle oluşturulan geçici tablolar, SQL Server durdurulduğu anda kaybolur. Çünkü tempdb adlı veritaVeritabanı Programlama 2 BYTE 45 banını SQL server açıldığı anda boşlatacaktır. Bazen, kullanıcı çıkış yaptığı halde geçici tablonun saklanması ihtiyacı olabilir. Bu tür durumlarda, geçici tablo SQL Server kapanıncaya kadar hafızada kalıp, SQL server kapatıldığında silinecekse, tempdb’de tablo açma yöntemi kullanılabilir. Örnek 24: CREATE TABLE tempdb..kitap( KitapNo INT, KitapAdi VARCHAR(55), ISBNNo CHAR(16) ) go (Resim 15) Örnek 25: (ev ödevi) Yöntem ile geçici tabloyu oluşturun. Daha sonra bu tabloya bir değer girin. Enterprise manager ile tabloyu görmeye çalışın. Query Analyzer ile tabloyu görmeye çalışın (select ile). Query Analyzer’i kapatıp açın. Tablodaki kayıtları seçmeyi deneyin. Ne gördünüz? Aynı işlemi ikinci şekilde geçici tablo açarak onun üstünde test edin. Kontrol Zorlayıcıları (Check Constraints): Diğer zorlayıcılar hakkında daha geniş bilgi ilk kitapçıkta verilmişti. Zorlayıcılar genel olarak bir tablo oluşturulurken 46 BYTE Veritabanı Programlama 2 Resim 15 tanımlanır ve veri bütünlüğünü sağlamayı amaçlayan tanımlamalardır.Bir tablo oluşturulurken, herhangi bir alan için girilebilecek veri türlerini bir grup veya kural ile sınırlamak için kontrol zorlayıcıları kullanılır. Örnek 26: Bir il tablosu oluşturacağız. Tüm illerin trafik kodlarının (ülkemizde) 1-81 arasında olduğunu biliyoruz ve telefon kodlarının da 111 ile 999 arasında olduğunu biliyoruz. Bu tanımları tabloya yansıtalım: CREATE TABLE tblIL( ilTrKod INT CONSTRAINT cns_ilTrKod CHECK ( ilTrKod BETWEEN 1 AND 8181), ilAdi VARCHAR(15), ilTelKod INT CONSTRAINT cns_ilTelKod CHECK (ilTelKod BETWEEN 111 AND 999), ) şeklinde oluşturulan il tablosundaki zorlayıcılar il trafik kodu olarak 1-81 aralığının dışında, il telefon kodu olarak da 100 ile 999 arasındaki sayıların dışında bir değer girilmesini önleyecektir. 3. Bölüm Saklı Prosedürler (Stored Procedures) Prosedür ne demektir? Nesneye dayalı programlama bu kadar popüler değilken, programlar sadece prosedür denilen parçacıklardan oluşurdu. Her bir prosedür, belli bir işlevi yerine getirmek için özenle yapılandırılmış program parçacığıdır. Mesela, iki sayı alıp bunların toplamlarını hesaplayan bir kod parçasını toplayıcı adında bir prosedür içerisine paketleyebiliriz. Bir prosedür, başka bir prosedür içerisinden çağrılabilir. Bu da sık kullanılan işlemler için yazılmış kodların bir defa yazılıp çok defa kullanılmasını böylelikle de programlamayı kolaylaştırmayı amaçlar. Saklı prosedürler, bir çok gelişmiş programlama dilindeki fonksiyon yapılarına karşılık gelir. Birden fazla işlemi, paketlenmiş bir halde bir tek komut ile çalıştırmamız gerektiğinde stored procedures kullanılır. İşlemden kasıt T-SQL ile yapılabilen her şeydir. Stored procedure, 1980’li yılların sonunda Sybase SQLServer ile birlikte kullanıma girdi. En büyük özelliği sorguların önceden hazırlanması (derlenmesi) ve VTYS ile aynı uzayda çalışmasından dolayı daha hızlı sonuç vermesidir. Bir SP oluşturulduktan sonra, veritabanı sunucusunda saklanır. Her ihtiyaç 48 BYTE Veritabanı Programlama 2 duyulduğunda aynı sp defalarca çağrılabilir. Cursor gibi oturum kapandığında silinmez. Network bazlı çalışmalarda ağ trafiği ve sistem kaynaklarının kullanımını düzenleyerek de performans artışı sağlar. Bir dize işlem, bir tek paket içerisinde yer alır. Gerektiğinde bir tek komut ile tetiklenebilir. Paketin tamamı çalışıncaya kadar istemde bulunan terminale hiçbir şey gönderilmez. Tüm komutlar bittiğinde bir tek sonuç gönderilir. Bu da bazı durumlarda ağ trafiğini rahatlatır. Bir SP sistem tarafından oluşturulduğu anda şu aşamalara tabi tutulur: 1. SP’nin bileşenleri parçalara ayrıştırılır 2. Veritabanı içerisinde table,view gibi başka nesnelere atıfta bulunan referanslar varsa, geçerli olup olmadıkları kontrol edilir. (Geçerli:1-nesne varmı, 2-izin var mı) 3. Kontrollerden geçen SP’nin adı sysobjects tablosuna, kodları ise syscomments tablosuna saklanır. 4. Bu işlemlerle birlikte derleme işlemi yapılır. Normalizasyon işlemleri olarak da anılan bu işlemler sonucunda, ağaç şeması elde edilir. Bu şema da sysprocedures tablosunda saklanır. 5. SP herhangi bir anda çağrıldığında, ilk kez çalışıyorsa bu işlemler gerçekleştirilir. İlk sefa çağrılmıyorsa, kontrol, sorgulama ağacı oluşturma işlemleri yapılmaz ve oldukça hızlı bir şekilde SP’nin derlenmiş hali çalışır. Bundan dolayı sp’ler derlenen nesnelerden biri olarak anılır. SP’ler şu faydaları sağlar: 1. Uygulamanın getirdiği bazı iş kuralları prosedür içinde tanımlanabilir. Bir kez oluştuktan sonra bu kurallar birden çok uygulama tarafından kullanılarak daha tutarlı bir veri yönetimi sağlanır. Ayrıca bir fonksiyonelliğin değişmesi ihtiyacı doğduğunda her uygulama için değişiklik yapmak yerine, sadece bir platformda değişiklik yapılır. 2. Tüm prosedürler üstün performansla çalışır ancak birden fazla çalıştırılacak olan prosedürler sorgulama planları procedure tamponcache içinde saklandığından daha da hızlı çalışırlar. 3. Stored Procedure’ler SQL Server start ettikten sonra otomatik olarak çalıştırılmak üzere ayarlanabilirler. 4. Stored Procedure’ler harici olarak kullanılırlar. Trigger’lardan farklı olarak prosedürler uygulama tarafından ya da script tarafından bir şekilde çağrılmak zorundadırlar. Otomatik devreye giremezler. 5. Stored Procedure’lerın içinde SQL sorgulama diline ek olarak T-SQL komutlarını kullanabiliriz. 6. Kullanıcının bir tabloya erişim izni olmasa bile o tablo üzerinde işlem yapan bir stored procedure’ü kullanma izni olabilir. SP oluşturma: CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] Örnek 27: Çalıştırıldığı tarih itibariyle, aldığı kitapları getirmeyen üyelerin adını-soyadını veren bir SP yazalım: CREATE PROCEDURE sp_cezaliUye AS DECLARE @buGun DATETIME SET @buGun = GetDate() SELECT uye.Adi,uye.soyadi FROM odunc INNER JOIN uye ON uye.UyeNo = odunc.UyeNo WHERE geldiMi=0 AND VermeTarihi + VermeSuresi < @buGun GO ->>The command(s) completed successfully. Daha sonra bu SP şu komut ile çağrılır: EXEC sp_cezaliUye (Resim 16) Veritabanı Programlama 2 BYTE 49 İPUCU: Bir SP’nin bittiği yerde go deyimini kullanmak, sp’nizin bittiği yeri tam olarak belirtmenizi sağlayacağından istemediğiniz kodların sp ile birlikte derlenmesine ve istenmeyen hatalar meydana getirmesine engel olur. Örnek 28: En çok yapılan hata, bir SP’nin çağrılma kodunu da yanlışlıkla SP ile birlikte derlemektir. Aşağıda yanlış yazılmış bir sp yer almaktadır. Doğru ‘go’ ifadesi sizce nereye konmalı? CREATE AS PROCEDURE sp_cezaliUye DECLARE @buGun DATETIME SET @buGun = GetDate() SELECT uye.Adi,uye.soyadi FROM odunc INNER JOIN uye ON uye.UyeNo = odunc.UyeNo WHERE geldiMi=0 AND VermeTarihi + VermeSuresi < @buGun --go burada yer almalı EXEC sp_cezaliUye SP üstünde değişiklik yapmak: sp_helptext sp_adi Sp_helptext sp_cezaliUye DECLARE @buGun DATETIME SET @buGun = GetDate() SELECT uyeAdi FROM odunc WHERE geldiMi=0 AND VermeTarihi + VermeSuresi < @buGun ->> The command(s) completed successfully. SP’nin yeni halini kaydettirebiliriz. Bir SP’yi Silmek: Bir sp’yi artık kullanmayacağımıza karar verdiğimizde silmemiz gerekir. Bu durumda şu komut ile silinir: DROP PROC sp_adi go Örnek 29: Oluşturduğumuz sp’yi silmek istersek: DROP PROC sp_cezaliUye Go ->>The command(s) completed successfully. SP’ye Parametre Yollama: Bazen SP’ler dışarıdan parametre alabilirler: Örnek 30: Herhangi bir tarih verildiğinde, bu tarihte süresi bittiği halde teslim edilmeyen dersek: (Resim 17)’de ki sonuç elde edilir. Daha sonra bu içeriği Query Analyzer kod penceresine yapıştırıp, CREATE yerine ALTER yazarsak: ALTER PROCEDURE sp_cezaliUye AS 50 BYTE Veritabanı Programlama 2 Resim 17 İPUCU: Bir çok işlemi kod yazmaksızın yapmayı sağlayan Enterprice Manager’i kullanarak sp’leri de kolayca değiştirebilirisiniz. Bunun için Enterprice manager ile bir sp’yi seçip çift tıklamak yeterlidir. kitapları bulan bir SP yazalım ancak tarih olarak bu günden daha büyük bir parametre alamasın. Böyle bir durum olduğunda, bu günün tarihini versin. CREATE PROCEDURE sp_cezaliUye_1 @referansTarih DATETIME AS DECLARE @buGun DATETIME SET @buGun = GetDate() IF @referansTarih > @buGun SET @referansTarih = @buGun SELECT uye.Adi,uye.soyadi FROM odunc INNER JOIN uye ON uye.UyeNo = odunc.UyeNo WHERE geldiMi=0 AND VermeTarihi + VermeSuresi < @referansTarih Bazen dışarıdan gelen parametrelerin isteğe bağlı olması istenebilir. Bu durumda DEFAULT değer atama seçeneği kullanılır. Şayet dışarıdan parametreye değer atanmazsa, geçerli değer default atanmış değer olarak alınır ve işlem yapılır: Örnek 31: CREATE PROCEDURE sp_cezaliUye_2 @referansTarih DATETIME = NULL -- dışarıdan referans tarihi gelmedi ise, NULL olarak kabul et. AS DECLARE @buGun DATETIME SET @buGun = GetDate() IF (@referansTarih IS NULL) OR (@referansTarih>@buGun) SET @referansTarih = @buGun SELECT uye.Adi,uye.soyadi FROM odunc INNER JOIN uye ON uye.UyeNo = odunc.UyeNo WHERE geldiMi=0 AND VermeTarihi + VermeSuresi < @referansTarih Go şeklinde yazabiliriz. Daha sonra EXEC sp_cezaliUye_2 @referansTarih=’06.20.2003’ ->>(HİÇ SONUÇ DÖNMEYECEKTİR) EXEC sp_cezaliUye_2 diyerek sp’yi çağırabiliriz. Örnek 32: Kitaplar tablosu üstünde aşağıdaki parametrelere göre arama yapabilecek bir SP yazalım. Parametrelerden gelenler için filtreleme yapılsın. Dışarıdan alınabilecek Parametreler: ISBNNo, KitapAdi, Ozeti (Resim 18) ALTER PROCEDURE sp_kitapBul @ISBNNo CHAR(16) =NULL, @KitapAdi VARCHAR(55)=NULL, @KitapOzeti VARCHAR(55)=NULL AS DECLARE @sSQL VARCHAR(500) Set @sSQL= ‘SELECT * FROM Kitap WHERE 1=1 ‘ IF @ISBNNo IS NOT NULL SET @sSQL = @sSQL + ‘ AND ISBNNo = ‘’’ + @ISBNNo + ‘’’’ IF @KitapAdi IS NOT NULL SET @sSQL =@sSQL + ‘ AND KitapAdi LIKE ‘’%’ + @KitapAdi + ‘%’’’ IF @KitapOzeti IS NOT NULL SET @sSQL = @sSQL + ‘ AND KitapOzeti LIKE ‘’%’ + @KitapOzeti + ‘%’’’ --print @sSQL --nasıl bir SQL oluşturduk? EXEC(@sSQL) Go Farklı parametre değerleri ile SP’yi çağırabiliriz: EXEC Sp_kitapBul @ISBNNo=’12345’ EXEC Sp_kitapBul @ISBNNo=’12345’, @kitapAdi=’Yol’ ... Veritabanı Programlama 2 BYTE 51 Resim 18 Bir sp, başka bir sp’yi çağırabilir. Sp’den Değer Döndürme: OUTPUT opsiyonu başka bir prosedüre değer döndürmeye yarar. Yani bir prosedür kendisini çağıran başka bir prosedüre kendi ürettiği bir çıktı değerini yanıt olarak verebilir. Örnek 33: 5 adet tamsayı girildiğinde ortalamalarını hesaplayıp, OUTPUT parametresi ile döndürecek bir sp yazalım: CREATE PROC ortalayici @sayi1 smallint, @sayi2 smallint, @sayi3 smallint, @sayi4 smallint, @sayi5 smallint, @ortalama smallint OUTPUT AS SELECT @ortalama = (@sayi1 + @sayi2 + DİKKAT: SP’de bir parametre için default değer tanımı yaparken, bu değerin sabit bir değer veya NULL olması gerektiğine dikkat etmelidir. 52 BYTE Veritabanı Programlama 2 @sayi3 + @sayi4 + @sayi5) / 5 GO Bu prosedürün döndürdüğü sonucu nasıl alabiliriz? Bu prosedürdeki ortalama değerini alabilmek için öncelikle bir değişken tanımlayıp sonra prosedürü çalıştırabiliriz. Örnek 34: Output olarak tanımlı parametre örnek33’te en son parametredir. Daha önce tanımladığımız değişkeni buraya verirsek bu değişkende SP’nin ürettiği değer döndürülecektir. Değeri görmek için daha sonra SELECT komutunu çalıştırıyoruz. (Resim 19) DECLARE @sonuc smallint EXEC ortalayici 1,2,11,20,21,@sonuc OUTPUT SELECT ‘ORTALAMA:’,@sonuc go Prosedürden değer döndürmek için bir başka seçenek olarak RETURN ifadesi kullanılabilir. Bu şekilde OUTPUT ifadelerini hem prosedür içinde hem DİKKAT: Bazı durumlarda, SP içerisinde SQL ifadesini bir değişkene atamak suretiyle durumlara göre dinamik olarak meydana getirip, daha sonra da onu çalıştırabiliriz. Bu durumda da EXEC komutu kullanılır. EXEC komutunun başka nerelerde kullanıldığını öğrenmek için yardım menüsünü kullanabilirsiniz. rında kullanıcıyı uyarmak için kullanılırlar veya SQL Server’in ileri sürümlerinde kullanılmak üzere ayrılmışlardır. Kullanıcı, RETURN ile bunlar haricindeki (-1 ila –99 haricindeki) değerleri döndürebilir. Örnek 35: CREATE PROC toplayici @toplayan smallint, @toplanan smallint, @toplam smallint AS de prosedürün çağrıldığı yerde tanımlamak zorunda kalınmadan doğrudan değer döndürülebilir. Normal olarak SQL Server 0 ile -99 arasında değerleri bu şekilde döndürebilir. Bu değerler, sistem bazlı durumları belirlemek üzere ayrılmış kodlardır. Örneğin sıfır değeri prosedürün çalışmasında bir hata oluşmadığını belirtir. Bu haliyle de elbette kullanıcı tarafından da kullanılabilir. Diğerleri ise muhtelif hata durumla- Resim 19 Resim 20 SELECT @toplam = @toplayan + @toplanan RETURN @toplam go Prosedürü oluşturduktan sonra aşağıdaki şekilde dönen sonucu yakalayabiliriz: DECLARE @toplamlar smallint EXEC @toplamlar = toplayici 1,11,0 SELECT ‘Sonuç : ‘, @toplamlar (Resim 20) Örnek 36: Bir kitap ödünç verilmek istendiğinde, bu kitabı öncelikle içeride mi diye kontrol eden bir sp yazınız. Girdi parametre: KitapNo Daha sonra ödünç verilen kitap no, tarih, üye No , kalma süresi verildiğinde bu kitap dışarıda değil ise yeni bir ödünç verme işlemi başlatan (odunc tablosuna kayıt ekleyen) bir sp yazınız. Sizce böyle bir sp hatalı bir kayıt girilme ihtimalini kökten halleder mi? (Tabloya hatalı kayıt girilmemesi için onu her yönü ile korur mu?) Öncelikle, Kitapların durumunu kontrol eden SP’yi oluşturalım: kitap Veritabanı Programlama 2 BYTE 53 içerde ise 1, değil ise 0 döndürüyor. (Resim 21) CREATE PROC sp_kitapIcerdeMi @kitapNo SMALLINT AS declare @sonuc INTEGER IF (SELECT COUNT(*) FROM odunc WHERE kitapNO=@kitapNo AND geldiMi=0 ) > 0 SET @sonuc=0 else SET @sonuc=1 return @sonuc go Sonra da ödünç bilgisini kaydedecek sp’yi yazalım: CREATE PROC sp_oduncVer @kitapNo INT, @vermeTarihi DATETIME =’01.01.2003’, @uyeNo INT, @vermeSuresi INT = 15 AS declare @sonuc SMALLINT EXEC @sonuc=sp_kitapIcerdeMi @kitap No=@kitapNo IF (@sonuc=1) BEGIN print ‘içerde.....’ INSERT INTO odunc(kitapNo,UyeNo, VermeTarihi,vermeSuresi,geldiMi) VALUES(@kitapNo,@uyeNo,@vermeTarihi,@vermeSuresi,0) END ELSE BEGIN print ‘kitap dışarda ödünç verilemedi.....’ END Go Test etmek için: EXEC sp_oduncVer @kitapNo=1, @vermeTarihi=’01.01.2003’,@uyeNo=1 Örnek 39: SQL Server’in performansını izleyip performans istatistiklerini alalım: Resim 21 SP’yi VTYS Uzayı Dışından MDACs ile Çağırmak Bir sp’nin ASP uygulamasından, ASP.NET uygu- eden kitapçıklarda özet olarak yer almakta- lamasından, herhangi bir programlama dili dır. Ancak bu süre içerisinde VTYS uzayının ile yazılmış veritabanı uygulamasından para- dışındaki uygulamalardan SP çağırmak için bu metre ile çağrılması mümkündür ve aynen örnekleri kullanabilirsiniz. yukarıdaki şekillerde çağrılır. Bu durumlarda veritabanına erişmek için MDACs (ADO, OLEDB,ODBC,ADO.NET vs.) için kullanılır. EXEC sp_adi [@parametre=değer,...n] Böylelikle, T-SQL’in avantajlarını VTYS uzayının dışında bir uygulamadan da kullanabiliriz. Burada anlatılan kodları anlayabilmek için VB Script-ASP veya ASP.NET-VB.NET bilmeniz gerekecektir. Bu konular, takip 54 BYTE Veritabanı Programlama 2 Örnek 37: İşte cezali uyelerimizi Web’de teşhir edecek bir ASP-VBScript kodu: Örneği daha iyi anlamak için daha önce örnekte oluşturduğumuz sp_cezaliUye SP’sinin tanımına bakınız. <html> <head> <title>ABC kütüphanesi</title> <meta http-equiv=”Content-Type” content=”text/html; charset= windows-1254”> </head> <body bgcolor=”#FFFFFF” text=”#000000”> <% response.write “CEZALI ÜYELERİMİZ<br>” set objConn = Server.CreateObject(“ADODB.Connection”) objConn.Open “DRIVER={SQL Server};” _ ”server=BILISIMCI;UID=yasar;” _ ”PWD=yasar;Database=dbKutuphane” strGlobSQL=”EXEC sp_cezaliUye” set rsCezaliUye = objConn.Execute(strGlobSQL) DO UNTIL rsCezaliUye.EOF response.write rsCezaliUye(“adi”) & _ “ “ & rsCezaliUye(“soyadi”) & “<br>” rsCezaliUye.MoveNext LOOP %> </body> </html> Örnek-38: İşte aynı işlemi yapacak ASP.NET-VB.NET kodları: <%@ Page Language=”VB” %> <script runat=”server”> sub page_Load() dataGrid1.dataSource=exec_sp_proc() dataGrid1.dataBind() end sub ‘ Function exec_sp_proc() As System.Data.DataSet Dim connectionString As string = “server=BILISIMCI;user id=yasar;password=yasar;Database=dbKutuphane” Dim objConn As System.Data.SqlClient.SqlConnection = New em.Data.SqlClient.SqlConnection(connectionString) ‘Dim queryString As String = “SELECT [Kitap].[kitapNo], [Kitap].[kitapAd i], [Kitap].[ISBNNo], [Kitap].[sayfaSay”& _ “isi], [Kitap].[kitapOzeti] FROM [Kitap]” Dim strGlobSQL=”EXEC sp_cezaliuye” Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlCl ient.SqlCommand(strGlobSQL, objConn) Dim dataAdapter As System.Data.SqlClient.SqlDataAdapter = New System.Data. SqlClient.SqlDataAdapter(sqlCommand) Dim dataSet As System.Data.DataSet = New System.Data.DataSet dataAdapter.Fill(dataSet) Return dataSet End Function </script> <html> <head> </head> <body> <form runat=”server”> <asp:DataGrid id=”DataGrid1” runat=”server”></asp:DataGrid> <!-- Insert content here --> </form> </body> </html> Veritabanı Programlama 2 BYTE 55 Resim 22 sp_monitor SP’ler hakkında son olarak şunu da bilmemiz gerekir, SP’ler sadece select işlemi için kullanılmaz. INSERT, UPDATE ve DELETE işlemlerinin tamamını SP’ler aracılığıyla yapmak, veritabanını uygulamadan izole etmek için iyi bir yöntemdir. (Resim 22) Cursor’ler VTYS’deki cursor’lar metin editörlerindeki cursorler ile aynı işi yapar; metin editörlerinde o an için cursor nerede ise, oradaki verileri baz alan işlemler yapabilirsiniz. Veritabanı sistemlerinde ise, cursor’ün bulunduğu yerdeki verileri yazdırabiliriz. SQL sorgularının sonucunda elde edilen kayıtların tamamına resultset denir. Bazen bir resultset üstünde gezinmemiz gerekebilir. Bu tür durumlarda, Cursor’leri kullanırız. Curserler özetle bir select ifadesinin döndürdüğü resultset’e satır satır erişmeye olanak verir. Cursor’leri kullanmak biraz karmaşık gibi gelebilir ama normalde 5 adımlık ardışık işlemler dizisinden ibarettir. 1. Cursor bir SELECT ifadesi için 56 BYTE Veritabanı Programlama 2 tanımlanır. 2. Cursor veriler üzerinde gezinilmek üzere, OPEN komutu ile açılır. 3. Resultset’in sonuna gelinceye kadar her seferinde bir kayıt olmak üzere FETCH NEXT komutu ile kayıtlar üstünde ilerlenir. 4. Resultset ile ilgili işlemler sona erdiğinde cursor CLOSE ile kapatılır. Ancak kapatılan cursor henüz hafızada yer kaplamaya devam eder. 5. Cursor ile ilgili işlerimiz bittiği anda hafızadan da silmek için cursor DEALLOCATE ile hafızadan boşaltılır. Örnek 40: Kitaplar listesini ekrana yazdıracak(resultset olarak değil de teker teker) bir kod parçası yazalım: 1.Cursor tanımlanır: DECLARE cursor_adi CURSOR FOR SELECT İFADESİ Şeklinde tanımlanır. DECLARE cr_kitapListesi CURSOR FOR SELECT kitapNo, kitapAdi FROM Kitap GO 2.Cursor açılır: OPEN cursor_adi OPEN cr_kitapListesi GO 3.Cursor üstünde dolaşmak için FETCH komutundan faydalanılır: FETCH NEXT FROM cursor_adi [INTO icine_doldurulacak_degisken1 [, ....] ]DECLARE @kitapNo INTEGER,@kitapAdi VARCHAR(55) FETCH cr_KitapListesi INTO @kitapNo, @kitapAdi -- ilk satırın üstüne geldik ve ilk kayıtta yer alan iki değeri yazdırdık. print @kitapNo print @kitapAdi go FETCH komutu ile ikinci kaydı yazdırmayı deneyin. Cursor’ün sona gelip gelmediğini anlamak için @@FETCH_STATUS ve @@rowcount global fonksiyonlarından faydalanacağız: @@FETCH_STATUS fonksiyonu, en son çalıştırılan FETCH komutunun sonucu hakkında bize bilgi verir. Bu fonksiyon, şu üç değerden birini verecektir: 0: Bir önceki FETCH komutu başarı ile gerçekleştirildi. -1: Bir önceki FETCH komutunda bir hata ile karşılaşıldı. -2: Resultsetteki tüm kayıtlar bittiği için en sona gelindi, daha fazla kayıt yer almıyor. (end of resultset) @@rowcount, bir önceki FETCH komutu icra edildikten sonra resultsette toplam kaç kayıt kaldığını tutar. Hiç FETCH komutu kullanılmadı ise Cursor’ün işaretlediği resultsette toplam kaç kayıt yer aldığını gösterir. Şimdi artık, kitaplar listesini sonuna kadar yazdırabiliriz. Bu iş için WHILE yapısını kullanacağız: DECLARE cr_KitaplarListesi CURSOR FOR SELECT kitapNo,KitapAdi Başlıca Sistem Saklı Prosedürleri FROM Kitap go DECLARE @kitapNo INTEGER,@kitapAdi VARCHAR(55) Go FETCH cr_KitaplarListesi INTO @kitapNo, @kitapAdi WHILE (@@FETCH_STATUS = 0) BEGIN PRINT @kitapNo DDL’e yönelik Sistem sp’leri: sp_ addtype sp_foreignkey PRINT @kitapAdi •bir önceki FETCH ile aldığımız sp_primarykey kaydı yazdırdık. Bir sonraki kayda sp_help geçelim: sp_helptext FETCH cr_kitaplarListesi INTO @kitapNo, @kitapAdi sp_helpdb •kayıtlarımızı doldurduk. Başa döndüğünde yazılacak. sp_helpconstraint sp_rename END Go sp_spaceused Kitaplar listesini yazdıran cursor ile bizim işimiz bitti ancak yapmamız geresp_depends ken işlemler bitmedi. sp_dropkey 4.Cursor’ı kapatmamız gerekiyor: sp_rename CLOSE cursor_adi sp_dbremove CLOSE cr_kitapListesi sp_renamedb CLOSE komutu ile sadece bir cursor’ün içerdiği resultset boşaltılır. Ancak sp_helptrigger Cursor için hafızada açılan yer halen kullanımdadır ve Mesaj bir cursor Kullanıcı Tanımlı Sistemhafızadan sp’leri: tam olarak silinmediği sürece aynı adda sp_addmessage başka bir cursor daha oluşturulamaz. Cursor yeniden açılırsa, aynı resultsete ensp_dropmessage baştan erişilebilir. sp_getmessage 5. Cursor şu şekilde hafızadan silinir: sp_altermessage Veritabanı Programlama 2 BYTE 57 ap.KitapNo DECLARE @kitapAdi VARCHAR(25), @Durumu BIT open cr_kitapDurumu FETCH NEXT FROM cr_kitapDurumu INTO @kitapAdi, @Durumu WHILE @@FETCH_STATUS =0 BEGIN print @kitapAdi IF @Durumu = 0 print ‘dışarıda’ ELSE Print ‘içeride’ FETCH NEXT FROM cr_kitapDurumu INTO @kitapAdi, @Durumu END GO Close cr_kitapDurumu Resim 23 Deallocate cr_kitapDurumu (Resim 24) Resim 24 DEALLOCATE cursor_adi DEALLOCATE cr_kitapListesi (Resim 23) Örnek 41: Projelerin çeşitli aşamalarında, özellikle de dışarıdan veri alınırken, bazı kayıtların bire bir tekrarladığı olabilir. Bu durumda kayıtlardan sadece birini bırakıp diğerlerini silecek bir Cursor oluşturmak gerekir. Varsayalım ki bizim de kitap tablomuz üstünde hiçbir indeks alan yoktu ve iki- üç kere aynı bilgiler tekrarladı. (Hatta bazı kitaplar 2, diğerleri 3 diğerleri n kere ...)Bunları silecek bir Cursor oluşturalım: DECLARE cr_kitapDurumu CURSOR FOR SELECT kitap.kitapAdi,odunc.GeldiMi FROM Kitap LEFT JOIN odunc ON odunc.KitapNo=Kit- 58 BYTE Veritabanı Programlama 2 Örnek 42: Kitaplar tablosunda aynı kitap numarasından iki tane olan varsa sildirecek bir cursor yazalım: SET ROWCOUNT 0 DECLARE @kitapNo INTEGER, @tekrarSayisi INTEGER, @sayac BIT DECLARE crKitaplar CURSOR FOR SELECT kitapNo, COUNT(kitapNo)-1 FROM Kitap GROUP BY kitapNo HAVING COUNT(kitapNo)>1 ORDER BY kitapNo --kitapNo bir kereden fazla geçenleri sileceğimize göre --doğru kitap numaralarını seçelim: OPEN crKitaplar FETCH NEXT FROM crKitaplar INTO @KitapNo, @tekrarSayisi WHILE @@FETCH_STATUS=0 BEGIN BEGIN SET ROWCOUNT @tekrarSayisi --tekrar sayısının bir eksiği kadar kayıt silinecek DELETE FROM Kitap WHERE kitapNo = @kitapNo --sonra tekrardan tüm kayıtlar --dikkate alınacak şekilde ROWCOUNT=0 atanıyor SET ROWCOUNT 0 END FETCH NEXT FROM crKitaplar INTO @KitapNo,@tekrarSayisi --print CAST(@kitapNO VARCHAR(2)) + ‘ nolu kitap silindi’ END close crKitaplar deallocate crKitaplar (Resim 25) Örnek 43: Sayfa sayısına göre ilk beş kitabı görmek için: SELECT TOP 5 * FROM kitap ORDER BY sayfaSayisi DESC Resim 25 İPUCU: Herhangi bir kritere göre sıralandıktan sonra ilk n kaydı getirip ötesiyle ilgilenmeyeceksek SELECT TOP N deyimini kullanırız. Veritabanı Programlama 2 BYTE 59 4. Bölüm İşlemler (Transactions) Tetiklemeler (Triggers) İşlemler (Transactions) Bir banka uygulamasını düşünün. Bir kullanıcı başka bir kullanıcıya havale yaptığında ne olur? Öncelikle havale yapanın hesap bilgilerinden havale yaptığı miktar düşülür. Ardından alıcının hesabına bu miktar eklenir ve havale gerçekleşmiş olur. Ancak her zaman şartlar istendiği gibi olmayabilir. Örneğin, gönderenin hesabından para düşüldüğü anda elektrik kesilebilir ya da program takılabilir. Bu durumda, ne olur? Gönderenin hesabından para düşülmüştür ama Alıcının hesabına da geçmemiştir yani bir kısım paranın sahibinin kimliği kaybedilmiş olur. Ya da siz tam da bir hesaba havale yapacakken, düşük bir ihtimal ama arkadaşınız da aynı hesabı kapattırdı ise?... Bu da sistemin olası durumlar dışında veri kaybetmeye müsait bir hal alması demektir, önlenmesi gerekir. İşte Transaction bu nedenle, verileri korumak için kilitler (‘LOCK’ koyar) Daha küçük parçalara ayrılamayan en küçük işlem yığınına transaction denir. Geçerli kabul edilmesi bir dize işlemlerin tamamının yolunda gitmesine bağlı durumlarda transaction kullanılır. Transaction bloğu ya hep ya hiç mantığı ile çalışır. Ya tüm işlemler düzgün olarak gerçekleşir ve geçerli kabul edilir veya bir kısım işlemler yolunda gitse bile, blok sona ermeden bir işlem bile yolunda gitmese hiçbir işlem olmamış kabul edilir. Transaction tanımına girebilen işlemler UPDATE, INSERT ve DELETE işlemleridir. Bir Transaction bloğunu işletmenin temel mantığı şu şekildedir: 1.Transaction bloğu başlatılır. Bu işlemden sonra gerçekleşen işlem logları işaretlenir. Bu arada işlem kullandığı kaynakları diğer kullanıcılara karşı kilitleyerek korur. 2.Transaction bloğu arasında yapılan her bir işlem bittiği anda başarılı olup olmadığına bakılır, başarılı olmadığı anda geri alım işlemine geçilir (ROLLBACK). Başarılı ise, bir sonraki işleme geçilir. 3.Tüm işlemler tamamlandığı anda COMMIT ile bilgiler yeni hali ile sabitlenir. Başarısız bir sonuç ise ROLLBACK ile en başa alınır ve bilgiler ilk hali ile sabitlenir. Bu örnek için aşağıdaki tabloyu kullanacağız: Hesap tablosu Alanlar: HesapNo CHAR(20) NOT NULL PRIMARY KEY Adi VARCHAR(55) Veritabanı Programlama 2 BYTE 61 Soyadi VARCHAR(55) Sube INTEGER Bakiye FLOAT Genel Yapısı şu şekildedir: 1.Transaction başlatılır: BEGIN TRAN[SACTION] [transaction_adi] İle bir transaction başlatılır. Örnek 44: DECLARE @havaleMiktar FLOAT DECLARE @aliciHesap VARCHAR(20), @gonderenHesap VARCHAR(20) SET @aliciHesap=’1’ SET @gonderenHesap=’2’ SET @havaleMiktar=20000000 -- 20 milyon havale edilecek BEGIN TRANSACTION UPDATE tblHesap SET bakiye=bakiye - 20000000 WHERE hesapNo=@gonderenHesap UPDATE tblHesap SET bakiye=bakiye - 20000000 WHERE hesapNo=@aliciHesap 2.İşlem başarılı olursa, COMMIT ile transaction bitirilir. Başarısız olduğunun anlaşılması haline ROLLBACK komutu ile transaction başarısız olarak bitirilebilir.(Yani en baştaki duruma geri dönülür) COMMIT Sabitleme noktaları: Bazen, bir noktaya kadar gelindikten sonra, işlemlerin buraya kadar olanını geçerli kabul etmek isteriz ama, bundan sonraki işlemler için de transaction (geri alabilme seçeneği)’ne ihtiyaç duyarız. Bu türden durumlarda sabitleme noktalarından faydalanılır. Bir sabitleme noktası başlatıldığı anda, en başa dönme seçeneği saklı kalmak üzere, noktanın oluşturulduğu yere de dönme seçeneği sunar Genel yapısı şu şekildedir: SAVE TRANSACTION sabitleme_ notkasi_adi Örnek 45: SELECT * FROM hesap --İlk baştaki hesap durumlarına dikkat: BEGIN TRANSACTION UPDATE Hesap SET bakiye = 5000000 WHERE hesapNo=’1’ -- transaction açıldıktan sonra bir UPDATE geldi. --Yeni Durum: SELECT * FROM hesap SAVE TRANSACTION svp_kaydet DELETE FROM Hesap WHERE HesapNo=’1’; --Kaydetme noktasından sonra bir nolu hesap silindi --yeni durum: SELECT * FROM hesap ROLLBACK TRAN svp_kaydet; --kaydetme noktasına dönüldü(Silinene hesap geri geldi) SELECT * FROM Hesap; ROLLBACK TRAN ; --İşte son durum(havale geri alındı, her şey ilk haline geldi.) SELECT * FROM Hesap; Örnek 46: 62 BYTE Veritabanı Programlama 2 Kitap tablosu üstünde kilitlemeden seçme işlemi yapmak için: SELECT kitap.* FROM kitap WITH(NOLOCK) WHERE kitapNo>5 Trigger’lar Triggers (Tetikler), aslında özel bir Stored Procedure’dür. SP’lerden farkı, bir tablo üstünde UDATE , INSERT, DELETE komutları ile bir işlem yapılmak istendiğinde, ilk olarak bu SP’lere bakılması ve gerekli ise çalıştırılmasıdır. Nesneye dayalı Programlamada var olan, event based programlama bu mantık ile örtüşür. Trigger’lar izin verilmeyen ya da tutarsızlığa neden olacak işlemleri engelleyerek veri bütünlüğünün korunmasına yardımcı olurlar. Daha önceki veritabanı sistemlerinde triggerlar tablolar arası birbirlerine referans yapan verilerin bütünlüğünü sağlamak maksadıyla kullanılırlardı (yabancı anahtar zorlayıcısını hatırlayınız). Ancak SQL Server 6.5’ dan itibaren bu işlem zaten Referantial Integrity tanımlamalarıyla sağlandığı için bu maksatla kullanılmaları gereksizdir. Triggerlar genellikle değişik tablolar üzerinde bulunan ve birbirleri arasında mantıksal ilişkilere sahip verilerin tutarlılığını sağlamak üzere oluşturulurlar. İhtiyaca göre uygulamanın getirdiği bazı kuralları kontrol etmek için de kullanılabilirler. Genel kullanımı: CREATE TRIGGER trigger_adi ON tablo_adi FOR INSERT [,UPDATE,DELETE] AS SQL ifadesi Şeklindedir. Trigger’lerin bir UPDATE, INSERT veya DELETE komutuna cevap olarak çalışması, Transaction mantığı ile aynıdır: 1. Bir tablo için TRIGGER tanımlı ise INSERT, DELETE veya UPDATE işlemi başlamadan hemen önce bir Transaction başlatılır. 2. INSERT, DELETE veya UPDATE komutu yerine getirilir. 3. Trigger çağrılır ve içindeki SQL ifadesi çalıştırılır. 4. Trigger işlemi onaylarsa geçerli kılar veya onaylamaz ve geçersiz bulur. Transaction geri alınır. (ROLLBACK TRANSACTION). Bir Trigger oluştururken şu durumlara dikkat etmek gerekir: 1. View ya da geçici tablolar üzerinde oluşturulamazlar. Fakat bunlara referans UYARI: Recursive olarak çalışmazlar. Yani bir tablonun herhangi bir sütununda yapılan değişiklik üzerine bir trigger çalışıp aynı tablonun başka bir sütununda değişikliğe neden oluyorsa ikinci yapılan değişiklik trigger için tetiklenmeye neden olmaz. Kısaca update trigger’ı tekrar tekrar çalışmaz, yalnızca bir kez çalışır. Veritabanı Programlama 2 BYTE 63 Ardından odunc için DİKKAT: DELETE FROM ODUNC WHERE oduncNo=8 Genellikle bir tablo için en fazla UPDATE,INSERT ve DELETE trigger’i olmak üzere 3 Trigger kullanılır. Yapılacak bir çok iş varsa, hangi olay ile birlikte tetiklenecekse o trigger içerisinde yerleştirilir. içerebilirler. 2. Çalıştıktan sonra bir kullanıcıya değer kümesi döndüremezler. Dolayısıyla SELECT ifadesi dahil edileceği zaman dikkatli olunmalıdır. 3. Veri bütünlüğünü, farklı tablolardan birbirine referans yapan verilerin tutarlılığını sağlamak için ve uygulamanın ihtiyacına göre bazı kuralları tanımlamak üzere kullanılabilirler. Ancak zorlayıcılarla düzenlenebilecek trigger kullanmamak daha faydalıdır. 4. İstenirse syscomments tablosunda şifrelenmiş tekilde saklanabilirler. 5. CREATE, DROP, ALTER TABLE, ALTER DATABASE, SELECT INTO gibi ifadeler trigger içinde kullanılmazlar. Örnek 47: Ödünç tablosundaki kayıtlar üstünde değişiklik yapıldığında kaç kaydı etkilediğini yazan bir trigger oluşturalım: CREATE TRIGGER tr_AffectedRows ON odunc FOR INSERT, UPDATE,DELETE AS raiserror(‘%d kayıt üzerinde değişiklik yapılmıştır’, 0, 1, @@rowcount) RETURN 64 BYTE Veritabanı Programlama 2 Gibi bir cümlecik çalıştırdığımızda, Mesajı gelir. Eklenen-Silinen Kayıtlar: Triggerlar çalıştığı zaman Inserted ve Deleted tablolarını kullanırlar. Bu tabloların her ikisi de ana tabloyla yani triggerın tetiklendiği tabloyla eşdeğer alanlara sahiptirler. Bu tablolar, mantıksal tablo şeklinde RAM’ de bulunurlar. Ana tabloya bir kayıt eklendiği zaman bu kayıt aynı zamanda inserted tablosuna da eklenir. İhtiyacımız olduğu zaman yeni eklenen değerlere bu tablodan ulaşarak, bu bilgileri tutmak maksadıyla değişken tanımlamak zorunda kalmaktan kurtuluruz. Tablodan bir kayıt silindiğinde silinen kayıt deleted tablosunda saklanır. Update işlemi ise delete ve hemen ardından yapılmış bir insert işlemi olarak ele alınır. Bir kayıt update edildiğinde orijinal kayıt deleted tablosuna işlenir, değişen kayıt da inserted tablosunda (ve ana tabloda) saklanır. Trigger’lere dışarıdan parametre yollayamayız. Ancak, INSERTED ve DELETED tabloları sayesinde kısıtlı da olsa, son işlemden etkilenmekte olan kayıtları tespit edebiliriz. Örnek 48: Kitaplardan bir kısmı, ödünç verildiği ve gelmediği halde bir başkasına daha ödünç verilmiş görünebiliyor. Böyle bir hata yapılmasını kökten çözmek için bir Trigger oluşturalım: CREATE TRIGGER tr_oduncKontrol ON odunc FOR INSERT,UPDATE AS IF(SELECT COUNT(odunc.kitapNo) FROM odunc,inserted WHERE odunc.geldiMi=0 AND inserted.kitapNo=odunc.KitapNo)>1 BEGIN Print ‘dışarıdaki kitabı bir başkasına veremezsiniz..’ ROLLBACK TRANSACTION IF(SELECT COUNT(odunc.kitapNo) FROM odunc,inserted WHERE odunc.geldiMi=0 AND inserted.kitapNo=odunc.KitapNo)>20 BEGIN Print ‘Bu kitabı 20’’den fazla defa ödünç vermişsiniz. Kütüphaneden çıkaramazsınız.’ ROLLBACK TRANSACTION END Örnek 50: Ödünç tablosu üstünde hangi trigger’lerin bulunduğunu öğrenmek için gerekli TSQL komutunu yazalım: sp_helptrigger odunc END Bu örnekte verilen durumun içerisinden foreign key zorlayıcısı ile çıkılamayacağına dikkat edin. Şimdi odunc üstünde şöyle bir cümlecik çalıştıralım (1 nolu kitap ödünç verilmiş ve gelmemiş ise): INSERT INTO odunc(kitapNo,uyeNo, vermeTarihi,VermeSuresi,GeldiMi) VALUE S(1,1,’01.01.2003’,15,0) ->> dışarıdaki kitabı bir başkasına veremezsiniz.. mesajı gelecektir. Trigger’ler, uygulamaya özgü kuralları veritabanı sisteminin bir parçası olarak tayin etmek istenildiğinde de kullanılır: Örnek 49: 20’den fazla kez ödünç alınan kitapların silinmesini önleyecek bir trigger yazalım: CREATE TRIGGER tr_oduncKontrol_20 ON odunc FOR DELETE AS Sonuçta Trigger ve Stored Procedure’leri karşılaştırırsak, her ikisi de önceden derlenmiş SQL ifadeleri olduğundan hemen hemen aynı hızda ve aynı külfet miktarına sahiptirler. SQL Server’ iın işlem sırası, önce View ve Stored Procedure’ leriı sonra Trigger’ları çalıştıracak şekildedir. Daha iyi performans elde etmek için mümkün olduğu kadar trigger seviyesine inilmemeye gayret edilmelidir. Eğer problemi,Zorlayıcılar seviyesainde yakalayabiliyorsak bu seviyede, stored procedure içinde yakalayabiliyorsak sp seviyesinde o da olmuyorsa, trigger seviyesinde yakalamak gerekir. Sp ile yakalanan bir durum olduğunda, trigger yüzünden, yapılan her şeyin geri alınması gerekmez. Ancak SPsp’lerin otomatik devreye girmediğini unutmamak gerekir. Veritabanı Programlama 2 BYTE 65