Professional Documents
Culture Documents
Veritabani Program Lama II-YGOZUDELI WwwJavaDiliCom
Veritabani Program Lama II-YGOZUDELI WwwJavaDiliCom
Veritabanı
Programlama 2
Şubat 2004
c
ili.Yaşar Gözüdeli
ad
Veritabanı Programlama 2
jav
w.
ww
Eğitim dizisi
ww
w.
jav
ad
ili.
c om
om
Veritabanı
Programlama
c
2
ili.
ad
Şubat 2004
Yaşar GÖZÜDELİ
jav
om
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
c
Teknik Destek ................................................................. 10
ili.
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
ad
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
jav
Roller ........................................................................... 33
Kullanıcılar .................................................................... 33
Yetki verme (Grant Komutu) ................................................ 34
Yetki Kaldırma (Revoke Komutu) ........................................... 35
om
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
c
Print komutu .................................................................. 39
Akış Kontrolleri ............................................................... 39
Go Komutu..................................................................... 40
ili.
1.IF ... ELSE karar yapısı .................................................... 40
2.CASE deyimi................................................................. 42
3.While Döngüsü .............................................................. 43
Geçici Tablolar ................................................................ 45
ad
Kontrol Zorlayıcıları (Check Constraints) ................................. 46
Cursor’ler ...................................................................... 56
Başlıca Sistem Saklı Prosedürleri ........................................... 57
Trigger’lar ..................................................................... 62
Eklenen-Silinen Kayıtlar ..................................................... 64
om
Sorumlu Yazı İşleri Müdürü:
Önsöz
Murat Yıldız Veritabanı kavramının ilk olarak ortaya
c
myildiz@byte.com.tr atıldığı 1980’li yılların üstünden henüz
Yönetici Editör: 23 yıl geçti. Ancak bu gün, operasyonel
İbrahim Özdemir iş dünyası, Veritabanı Yönetim Sistem-
ili.
iozdemir@byte.com.tr leri (VTYS) olmadan hiçbir şey yapa-
Editörler: maz hale geldi. İşletim sistemlerinden
Burak Kahyaoğlu sonra en popüler ve en çok kazandıran
bkahyaoglu@byte.com.tr yazılımlar Veritabanı Yönetim Sistem-
Üsame İldar Özdemir leridir.
ad
uildar@byte.com.tr Günümüzde, bir çok alanda ope-
Tasarım ve Uygulama: rasyonel veri işlemlerinde VTYS’ler
Yağız Akay yaygın olarak kullanılmakta. Bu prog-
yakay@byte.com.tr ramlar için bir çok nesne birbiri ile aynı
temel işlevi yerine getirir ve yaklaşık
olarak aynı teorilere dayanarak çalışır.
jav
ETAM A.Ş.
tılan konular sadece MS SQL Server
Film Çıkış: kullanıcıları için değil, Sybase, Oracle
Figür hatta Advantage (Türk programcılar
Merkez Ofis: tarafından geliştirilmiş bir VTYS. Bu
Fulya Cad. Fulya Bayırı Sk. vesile ile projede emeği geçenleri da
ww
Bilsan Plaza 11/4 80300 tebrik etmek gerekir.) için bile bir çok
Mecidiyeköy - İSTANBUL teknik olarak uygulanabilirlik seviye-
Tel: (212) 212 62 06
Faks: (212) 212 62 11
www.byte.com.tr
om
sinde yer almaktadır. Bu kapsamda, programlamadan ziyade yönetimi ile
c
hemen her VTYS’de ortak olarak yer daha çok ilgili olan, Kullanıcı Yönetimi,
alan saklı prosedürler, trigger’ler, kur- Yedekleme-Kurtarma, DTS-BCP gibi
sörler, transaction’lar, zorlayıcılar ve konulara da kısıtlı sayfa sayısı nedeniyle
ili.
diğer nesneler yine sırayla bu kitapta ele değinilmedi.
alınan konular arasında. Başta, gece gündüz demeden yoğun
Bu kitapçıkta genel olarak MS bir çalışmayla siz değerli okurlara bu
SQLServer ve Sybase’de kullanılan T- seriyi ulaştırmak için uğraşan Yönetici
SQL komutları yer alıyor. Oracle tara- Editör İbrahim Özdemir ve ekibine,
ad
fından kullanılan PL/SQL komutları Veritabanı konusunda tecrübelerini
da aslında T-SQL ile bir çok noktada çekinmeden aktaran ve kitap için
hemen hemen aynıdır. Bu nedenle düzeltmeler yapan sayın Nurullah
VTSY’ler için bir noktaya kadar ortak Kılıç’a ve kitabın içerdiği örnekleri
bir kitapçık ortaya çıktığını söyleyebi- test eden eşim Lale Gözüdeli’ye olmak
liriz. üzere kitapçıkta emeği geçen her-
jav
c
erişimlerini düzenleyen sistemlerdir.
İlişkisel VTYS’ler günümüzde yaygın MS SQL Server: Bir orta ve büyük
olarak kullanılmaktadır. ölçekli VTYS’dir. ANSI SQL’e eklentiler
ili.
VTYS’ler fiziksel hafızayı ve veri yazmak için T-SQL’i destekler.
tiplerini kullanıcılar adına şekillendirip
denetleyen ve kullanıcılarına standart Oracle: Daha çok yüksek ölçekli uygu-
bir SQL arayüzü sağlayarak onların lamalarda tercih edilen bir VTYS’dir.
dosya yapıları, veri yapısı, fiziksel hafıza ANSI SQL’e eklentiler yapmak için
ad
gibi sorunlarla ilgilenmek yerine veri PL/SQL geliştirilmiştir.
giriş-çıkışı için uygun arayüzler geliştir-
melerine olanak sağlayan yazılımlardır. Sybase: Bir orta ve büyük ölçekli
VTYS’de verileri tutmak üzere bir çok VTYS’dir. ANSI SQL’e eklentiler
türde nesne ve bu nesnelere erişimleri yazmak için T-SQL komutlarını destek-
düzenlemek üzere kullanıcılar, roller ve ler. Ülkemizde daha çok bankacılık ve
jav
gruplar yer alır. Her bir kullanıcının belli kamusal alanlarda tercih edilmektedir.
hakları vardır. Bu haklar, kısıtlanabilir.
Örneğin bir tablo ya da programcığı bir Informix: Bir orta ve büyük ölçekli
kullanıcı kullanabilirken bir başkasının VTYS’dir.
hakları veritabanı yöneticisi tarafından
kısıtlanmış olabilir. MySQL: Genellikle Unix-Linux temelli
VTYS’lerin bir çoğu ANSI SQL’in Web uygulamalarında tercih edilen
w.
c
Digerleri ................. %14.3
Advantage: Türk programcılar tarafın-
dan geliştirilen bir orta ve büyük ölçekli 2001 yılında bir araştırmaya göre Avrupa
VTYS’dir.
ili.
çapında VTYS’lerinin pazar payları
[kaynak: Gartner]
DB/2: IBM’in framework’lere yönelik
büyük ölçekli VTYS’dir.
Bir Proje İçin Hangi
Bunların dışında daha bir çok VTYS
VTYS’yi Seçmeli?
mevcut olabilir. Burada yer alanlarına
ad
popüler olmaları nedeni ile değinildi. Bir projede hangi veritabanının seçile-
ceği, projenin çapı ile ilgili bir karardır.
VTYS’lerinin Avrupa genelindeki Şu soruları kendinize sormanız proje-
pazar payları yaklaşık olarak şu şekilde: nizin çapı konusunda karar vermenize
En büyük pay IBM(DB/2) ile Oracle yardımcı olacaktır.
arasında. Hemen arkasında MS SQL
jav
araştırmaya göz atmak için aşağıdaki •Projeniz en fazla ne kadarlık yer kap-
adresi tıklayabilirsiniz. layacak bir veritabanı dosyasına ihtiyaç
duyacak?
http://www.tbd.org.tr/sayi77_html/
insan.htm •Projeniz için güvenlik ne derece
c
Veritabanı Programlama 2 ger’ler de programlanabilir. Transaction,
Kitapçığı Neleri İçeriyor Daha küçük parçalara ayrılamayan en
küçük işlem birimi demektir. Trigger’ler
ili.
1.Bölüm: Veritabanı Yönetim Sistem- ise Stored Procedure’lerin bir özel hali-
leri ele alınıyor. VTYS’ler, SQL’den dir ve bir tabloda değişiklik yapıldığında
anlayabilen programlardır. Verdiğimiz otomatik olarak devreye girerler. Zorlayı-
SQL komutlarını yerine getiren, sahne cılar ve SP’ler ile sağlayamadığımız veri
arkasındaki iş bitirici veritabanı yönetim kararlığını ve bütünlüğünü trigger’ler ile
ad
sistemidir. VTYS’ler SQL ile ifade ede- sağlamaya çalışacağız.
bildiğimiz tüm işlemleri yerine getirebi-
lirler. Bu bölümde VTYS’ler hakkında Teknik Destek
detaylı bilgi edineceğiz.
Eğitim serisi ile ilgili iletmek istediğiniz
2.Bölüm: T-SQL komutları ele anıyor. öneri, istek, şikayet ya da düzeltmeleri-
jav
Bazen, SQL’de yer alan komutlar, derdi- nizi doğrudan BYTE Türkiye dergisine
mizi anlatmamız için yeterli olmayabilir. iletmek için www.byte.com.tr/bizeulas.asp
Bu tür durumlarda Transact SQL içeri- adresini tıklayınız.
sinde yer alan komutlardan faydalanaca- Kitapçık ve içerdiği konular hakkın-
ğız. Transact SQL, kısaca T-SQL olarak daki her türlü soru ve sorunlarınızla
anılır. Bu konudaki detaylı bilgiyi ikini ilgili olarak ygozudeli@hotmail.com adre-
ünitede edineceğiz. sine e-posta göndermekten çekinmeyin.
w.
c
TYS temelli programlamayı çok veri yönlendirmeli Web sitesi bu gün
öğrenmek istiyorsanız, öncelikle bu program üstünde inşa edilmiş durum-
bu ünitede anlatılan her şeyi dadır. Bu bölümde MS SQLServer 2000
ili.
anlamaya çalışmayınız. 2.Üniteyi çok iyi Developer Edition(artık MSDE olarak
etüt ettikten sonra bu üniteyi daha iyi anılacak)’in kurulumu ve kaldırılması
anlayabilirsiniz. anlatılacaktır. MSDE, Eğitim ve kişisel
Ancak SQL Server konusunda başlan- kullanım maksatlı en geniş SQL Server
gıç seviyesinde bilginiz varsa, bu bölüm 2000 sürümüdür. Bu bölüm boyunca
ad
ile onu daha etkili bir şekilde nasıl kulla- verilen uygulamalar SQL Server’in bah-
nacağınızı öğrenmiş olacaksınız. sedilen sürümü üstünde test edilmiştir.
MS SQL Server, orta ve büyük ölçekli
VTYS’ler arasında en yaygın olanların- MSDE’nin Kurulumu ve
dan biridir. Bunun sonucu olarak da bir
Kaldırılması
jav
c
Gereksinimler hazırda zaten olan bir MSDE sunucu-
sunu kontrol etmek isterseniz, Windows
Gerçek hayatta veritabanı uygulama- 98 de yeterli olabilir. Ancak, buradaki
ili.
ları ciddi manada kaynak ihtiyacı olan bütün uygulamaları bir tek PC’de test
uygulamalardandır. Hafıza büyüklüğü, etmek istiyorsanız, MSDE’nin tamamını
işlemci hızı ve benzeri gibi sistem para- kurmanız gerekir.
matrelerini, üstünde kurgulamayı plan-
ladığınız projeye göre şekillendirmeniz Kurulumu
ad
gerekir. Burada verilen gereksinimler
sadece öğrenme amaçlı uygulamaların Bu kısımda bir tek PC üzerine tüm
denenebileceği bir sistem elde etmek için MSDE’nin nasıl kurulacağı anlatılacak-
yeterlidir. MSDE kurulumu için en azın- tır.
dan bir Windows 2000 Professional veya
jav
1. Adım: IIS ve diğer SQL Server’i kul- retli bırakın. Daha önce bu programı
lanacak servisleri durdurun. Registry’e kurdunuz ve üstünde değişiklik yapmak
erişecek gereksiz uygulamalar varsa istiyorsanız ikinci seçeneği işaretleye-
ad
kapatın. bilirsiniz. Instance, SQL Server’in bir
tek makinede iki ayrı uzayda çalışmak
2. Adım: Sıkıştırılmış paketi bir yere üzere yeniden kurulmasını kasteder.
açın ve x86\setup\setupsql.exe progra- Bu durumda ikinci Instance(kopya)’ya
mını çalıştırın. (Resim 1) MAKINEADI/INSTANCEADI notas-
yonu ile erişilir. Bir makinede birden
jav
3. Adım: Bu aşamada programı nereye fazla kopya çalışma özelliği tam olarak
kuracağınız sorulmaktadır. Kendi maki- MSSQL Server 2000 sürümünde mev-
nenize kuracaksanız, Local Computer cuttur. 6,0 sürümünde ise bu konuda
seçeneğini işaretleyin. Uzaktaki bir bil- hiçbir destek yer almaz. Aynı makinede
gisayara bağlanıp o bilgisayara kurmak ne fazla 16 kopya çalışabilmektedir.
isterseniz, Remote Computer seçene-
ğin işaretleyebilirsiniz. Virtual Server 5. Adım: Adınızı ve firmanızı giriniz.
w.
işlemlerini yerine getirebilmesi amacıyla 7. Adım: Server and client tools seçe-
kurulmasıdır. (Resim 2) neğini işaretli bırakın. Server olarak
SQL Server daha önce kurulu ise veya
4. Adım: İlk seçenek olan create new bulunduğunuz ağ ortamında başka bir
instance of SQLServer seçeneğini işa- bilgisayarda kurulu ise ilk seçeneği de
9. Adım: Karşınıza çıkan pencereden, 11. Adım: SQL Server, iki çeşit yetkilen-
Typical seçeneğini işaretli bırakın. SQL dirmeyi destekleyebilir.
Server bileşenleri hakkında yeterli a. İşletim sistemi ve domain ayarla-
bilginiz varsa, Costum seçeneğini, rından gelen yetkilendirmeleri geçerli
w.
c
olacak) ve şifresini unutmayacağınız görsel bir arayüzden yönetilmesi için
bir şekilde güvenli bir yerlere kaydedin. geliştirilmiş bir istemci taraf parçasıdır.
Daha sonra gerekli olacaktır. Ancak a’ya Kullandığı temel arayüz MMC (Micro-
ili.
göre bir yetkilendirme tercih ederseniz, soft Management Console) temelli bir
işletim sistemi şifrenizi korumanız gere- arayüzdür. Bu konuda, MMC’nin nasıl
kecektir. kullanıldığı anlatılmayacaktır. Sadece
yapılabilecekler hakkında özet bilgiler
12. Adım [Next] butonunu tıklayarak bulabilirsiniz.
ad
dosyaların kurulumunu sağlayın. Dos- Enterprise manager ile aynı zamanda
yaların kopyalanması bittiğinde [Finish] birden fazla veritabanı sunucusuna
butonunu tıklayın. Böylelikle kurulum bağlanılabilir. Bu işlem için veritabanı
tamamlanmış olur. sunucularının (SQL Server) kaydının
yapılması gerekir. Kaydın yapılabilmesi
Kaldırılması için de yetkilendirilmiş bir kullanıcı ile
jav
erişim şarttır.
MSDE’yi ya da SQL Server’i kaldırmaya •Bir veritabanı sunucusuna eriştikten
karar vermeden önce, üstünde çalışacak sonra, üstünde yer alan kullanıcıları, yet-
projelerinizin olmadığından emin olma- kimiz olan veritabanı dosyalarını, stored
nız gerekir. Aksi halde kaldırıldıktan procedure, view, tablo gibi veritabanı
sonra MSDE’yi kullanan projeleriniz öğelerini görebiliriz.
çalışamayacaktır. •Yetkimiz dahilinde değişiklerde bulu-
w.
nabiliriz.
1. SQL Server’i kullanmakta olan bütün •SQL server grupları tanımlanabilir
servisleri durdurun. •Her bir grup içerisinde yer alacak tekil
2. SQL Server hizmetini durdurun. Açık SQL Server’ler kaydedilebilir.
olan tüm SQL server toollarını kapatın •Kaydı yapılan her bir SQL server için
ww
c
tirmeniz gerekir.
•Yetki çerçevesinde, kaydedilmiş SQL
Server’ler üstünde SQL Server yönetim
ili.
Enterprise Manager’e Bir
görevleri çalıştırılabilir, tanımlanabilir.
•SQL ifadelerinin, yığınlarının ve
SQLServer Kaydı Eklemek:
scriptlerinin çalıştırılması için gereken Herhangi bir SQL Server’i Enterprise
yerden Query Analyzer’e geçiş sağlar. Manager ile yönetebilmek için kaydettir-
•Veri ithal-ihraç etme işlemleri başta mek gerektiğini biliyoruz. Bu işlem için
ad
olmak üzere bir çok işlem için kolaylaştı- şu aşamalar takip edilir:
rıcı sihirbazların başlangıç noktasıdır. 1. Bu işlem için öncelikle Enterprise
MMC, Microsoft’un sunucu uygu- Manager bir önceki konuda anlatıldığı
lamalarını yönetmek için geliştirdiği bir şekilde başlatmak gerekir.
genel arayüzdür. Bu nedenle bir çok 2. Ardından, Microsoft SQL Serve-
sunucu uygulamada bu standart arayüz r>SQL Server Group ağaç yapılarını
jav
Server’ın de böyle bir eklentisi mevcuttur. 5. Ağda geçerli SQL Server’lerin bir lis-
Bu eklenti ile MCC’nin birlikte oluştur- tesi sol tarafta belirecektir. Kendi maki-
duğu yönetim programının adı da SQL nenizdeki SQL kopyasını normal olarak
Enterprise Manager olarak anılmaktadır. kurduysanız, (local) şeklinde gösterili-
(Resim 5) yordur. Uygun sunucuyu seçtikten sonra
ww
yapacaksanız, Veritabanı Yöneticisine diniz ise resim 7’deki gibi bir ekran elde
danışmanız daha iyi olacaktır. Kendi edeceksinizdir. (Resim 7)
ad
kurduğunuz SQL Server’e bağlana- SQL Server kaydını kaldırmak
caksanız, kurulum aşamasında hangi oldukça kolaydır:
yetkilendirmeyi seçtiğinizi hatırlayın ve 1. Kaydını kaldırmak istediğiniz SQL
aynı seçeneği burada da seçip [Next]’i Server’i fareniz ile sol tıklayın. (Resim
tıklayın. (Resim 6) 8)
7. Hangi SQL Server Goup’a ekleyece- 2. Gelen doğrulatma mesaj kutusunda
jav
bakışta pek de önemli bir dosya değil (database owner – veritabanı sahibidir)
gibi görünür. Ama aslında bir çok bilgi
işlem en kara günlerden bu loglar saye- Enterprise Manager ile Yeni
sinde kurtulur. Transaction log dosyaları, bir Veritabanı Oluşturmak
SQL Server’da verilerin depolanması ve
kurtarılması durumunda oldukça büyük Enterprise Manager ile bir çok işlem gibi
önem arzetmektedir. Bir tablonun içer- veritabanı oluşturma işi de görsel bir
w.
c
etkili bir diğer faktördür. Bu seçenekler
Ölçeklemek kısaca:
Enterprise manager ile bir veritabanının
ili.
özelliklerini görmek için öncelikle o Autoshrink: Veritabanının otomatik
veritabanına dosyası seçilir. Daha sonra olarak küçültülmesini ayarlayan özellik-
bu veritabanının üstünde sağ tık yapılır. tir. Bu özellik seçili iken veritabanı dos-
Ardından properties seçeneği tıklanır. yası ve log dosyası belli aralıklarla sistem
Ardından options sekmesi tıklanarak tarafından otomatik olarak gereksiz
ad
üstünde değişiklikler yapılır. alanları dosyadan çıkarılmaya zorlanır.
c
dikkate alınır. transaction log tutma seçeneğidir. Daha
çok küçük ölçekli ve deneme amaçlı veri-
Kurtarma Modeli Seçenekleri: Verita- tabanlarında veya sadece okuma amaçlı
ili.
banı ölçeklemede bir diğer seçenek de kullanılan veritabanı dosyaları için
veri kurtarma modelidir. Bu işlem için kullanılır. Bunun dışında ticari amaçlı
olan seçenekler de aşağıdaki şekildedir. veritabanı uygulamalarında bu türden
bir kurtarma modelinin seçilmemesi
1. Full Recovery Model: Bu seçenekte gerekir.
ad
veritabanı üstünde yapılan işlemlerin
logları tutulur. Bir veri kurtarma işle- SQL Query Analyzer
minde, log dosyaları ile birlikte verita-
banı kayıtları da elde edildikten sonra Query Analyzer, SQL ve T-SQL temelli
veritabanı kurtarma işlemi gerçekleştiri- komutlarla Veritabanı Sunucularının
lebilir. Standart olan kurtarma seçeneği konfigüre edilmesini sağlamanın yanı
jav
cun ne olarak görünmesini istediğinizi bu menüden belirleyin. (3) Sorgunuzda bir sen-
taks 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.
c
(Data Dictionary) terimi kullanılır. oluşturma işini T-SQL komutlarını
Veritabanı oluşturulduğunda bir kullanarak nasıl yapabileceğimize deği-
neceğiz. Bu işlem için kullanacağımız
ili.
çok verinin yer aldığı bir çok tablo
sistem tarafından oluşturulur ve komutu, Create Database deyimini bir
sistemin kendi ihtiyacı olan bilgiler önceki kitapçıkta özet olarak anlatmış-
tutulur. Bir de proje tarafından tık.
referans alınan ve il listesi, tür kod- Genel kullanımı şu şekildedir:
ları ve benzeri gibi sabit kayıtları
ad
CREATE DATABASE veritabani_adi
içeren tablolar vardır ki bu türden [ON
tablolara da look-up table(referans [PRIMARY] (NAME= veri_dosyasi_adi,
FILENAME= fiziksel_veri_dosyasi_adi
tablosu) denir. [, SIZE = veri_dosyasi_boyutu ]
[, MAXSIZE= maksimum_veri_dosyasi_
boyutu ]
[, FILEGROWTH=veri_artim_miktari])
[LOG ON
(NAME= log_dosyasi_adi,
jav
FILENAME= fiziksel_log_dosyasi_adi
tırma planı ile Query analiz etme seçe- [, SIZE = log_dosyasi_boyut]
neği ile daha az kaynak tüketen sorgula- [, MAXSIZE= maksimum_veri_dosyasi_
boyutu ]
malar geliştirme imkanı [, FILEGROWTH=veri_artim_miktari]
)
8. Index ayarlama sihirbazı ile T-SQL ]
komutlarını analiz ederek daha iyi sorgu
performansı için bir tablo üstünde ek bir PRIMARY: Bazen veritabanı tanım-
index alana gerek olup olmadığını bula- lanırken birden fazla dosya üstünde
w.
bilme.(İndeksler hakkında geniş bilgi için veri saklayabilecek bir şekilde tanım-
serinin ilk kitabına bakınız.) lanabilir. Bu durumda birinci dosya
(Resim 10) PRIMARY ile belirtilen dosyadır. Bir
dosya bir ana gruba sahip olabilir.
Query Analyzer ile PRIMARY deyimi kullanılmazsa bir
ww
c
bilsin. Veri dosyaları için isim kutup-
veri_dosyasi_adi: Veritabanının fiziksel hane_data olsun ve fiziksel dosya adı ‘D:
adı. Bu isim işletim sistemi tarafından \data\dbKutuphane.mdf ’ olsun.
ili.
bilinene ismidir. Loglar için başlangıçta sadece 1 MB
yer ayrılsın. Ancak bu alan dolarsa, her
fiziksel_veri_dosyasi_adi: İşletim sis- seferinde 1MB olmak üzere en fazla
temi üzerinde saklanacak dosyanın adını 1GB’a kadar sistem tarafından çıkarı-
ve yolunu belirtir. labilisin. Loglar için sistem dosya adı
ad
kutuphane_log olsun ve fiziksel dosya
veri_dosyasi_boyut: Veri dosyasının MB adı ‘D:\data\dbKutuphane.ldf ’ olsun.
cinsinden boyutunu belirtir. En az ve
CREATE DATABASE dbKutuphane
standart değer 1MB’tır. Bir birim belir- ON PRIMARY
tilmezse MB olarak alınır ancak diğer (NAME =kutuphane_data,
FILENAME= ‘D:\data\dbKutuphane.mdf’,
hafıza birimlerini de belirterek kullan- SIZE = 1,
jav
MAXSIZE = 1GB,
mak mümkündür. GB, MB, KB gibi. FILEGROWTH = 20%
)
LOG ON(
maksimum_veri_dosyasi_boyutu: Bu NAME = kutuphane_log,
FILENAME= ‘D:\data\dbKutuphane.ldf’,
veritabanının ne kadar boyut ile sınır- SIZE = 1MB,
landırılacağını belirtir. Şayet bir değer MAXSIZE = 1GB,
FILEGROWTH = 1MB
girilmezse, tüm disk doluncaya kadar )
veritabanı dosyasına veri eklenebilir.
w.
c
TRUNCATE TABLE ile WHERE eklenen her kayıt için artmaya devam
cümleciği olmayan DELETE komutu eder.
aynı işlevi yapar; bir tablonun tüm satır- TRUNCATE TABLE komutu,
ili.
larını boşaltır. TRUNCATE TABLE yabancı anahtar zorlayıcılarına takılır.
komutunu, WHERE koşulu olmayan Bunun anlamı şudur, ödünç tablo-
DELETE cümlelerinin yerine kul- sunda, kitapNo yabancı anahtar olarak
lanmak daha hızlı bir tablo boşaltma tanımlandığı için; kitap tablosu üstünde
yöntemidir. Sistem kaynaklarını da TRUNCATE komutu çalıştırıldığında,
ad
TRUNCATE komutu daha az meşgul komut çalıştırılmayacaktır. Aksine
eder. Çünkü, her bir silinen satır için log
oluşturmasında gerek yoktur. DELETE * FROM kitap
c
Aynı şekilde bu özelliği tekrardan yapılan işlemleri özetleyen bir ikon ile
kapatmak için bu özelliği kapatmak gösterilir. Bu ikonların anlamı için SQL
yeterli olacaktır bunun için de şu Server ile birlikte kurulan Books Online
ili.
komutu çalıştıracağız: ya da MSDN’den yardım alabilirsiniz.
Books Online’den Query Analyzer’in
SET SHOWPLAN_ALL OFF
komut ekranına ‘Query Analyzer’
Go
yazıp bu iki kelimeyi seçtikten sonra
Çalıştırma Planını gösterirken SQL SHIFT + F1 tuşuna basmanız yeter-
ad
server kendisine gelen sorguları çalıştır- lidir. Bulunan konulardan en baştakini
mak yerine analiz ederek hangi işlemler- tıklayarak ikonlar hakkındaki detaylara
den geçerek çalıştırılacağını, hangi işle- erişebilirsiniz. Diğer konularda da bilgi
min yaklaşık ne kadar zaman alacağını almak için aynı yolu kullanabilirsiniz.
gösterir, öngörür.
Çalıştırma planı özellikle DML(Veri
jav
yazıp enter’i tuşlamanız yeterlidir. işlemler aynıdır. Değişen tek şey hedef
Programın daha detaylı kullanımı ile kaynak türlerinin değişmesinden
için BOL(Books Online)’den yardım ibarettir.
alabilirsiniz.
c
XML, yazılım ve donanımdan bağımsız
veri taşıma ve saklama standardı olup
eXtensible Markup Language (Genişle-
ili.
tilebilir İşaretleme Dili) kelimelerinden
elde edilmiş bir ankronimdir. XML ile
Resim 13
işaretlenmiş bir bilgi bir cep telefonunda
SQL Server’i başlatmak, durdurmak bir PC’de gösterildiği kadar kolay göste-
veya duraklatmak için kullanılan basit rilebilir. XML ayrıca farklı platformlarda
ad
bir hizmet yönetim programcığıdır. çalışan uygulamalar arasında veri pay-
(Resim 13) laşımı için ve HTML’den arındırılmış
Bu servis çalışırken sistem çubu- olarak bilgilerin Web’e açılması için de
ğunda (sistem saatinin hemen yanı) kullanılır. XML de verinin görünümü
durumunu gösteren (çalışıyor, duruyor, ve sunumu ile ilgilenen işaretleme dili
duraklatılmış) ikon ile birlikte görünür. HTML (Hiper Metin İşaretleme Dili)
jav
erişim.
1. Çalışıyor, bağlanılmadı: yeşil ok •XML Data Schema desteği ve bu
2. Çalışıyor ve bağlanıldı: Yeşil Yuvarlak şemalar üstünde XPath sorgulama.
içinde beyaz ok •XML içerikli veri çekme ve
3. Duraklatıldı: Yuvarlak içinde iki XML’den veri ekleyebilme.
c
vardır.
Bir SQL Server kurulduğunda şu
veritabanları standart olarak kurulur:
ili.
Resim 14 Master: Hangi veritabanları oluştu-
ruldu, disk kullanımı, kullanıcı hesap-
XML Web Servisleri ile de bir veri- ları, sistem ayarları vb. gibi veritabanı
tabanınızı XML destekli olarak Web’e ile ilgili ortam değer ve değişkenleri bu
veya başka bir kurumun kullanımına veritabanında yer alır.
ad
istediğiniz kısıtlar doğrultusunda, aça-
bilirsiniz. Model: Yeni oluşturulacak tüm verita-
XML konusunu serinin son kitabında banları için bu veritabanı model alınır.
detaylı olarak serinin son kitabı ‘XML ve Yani şablon veritabanıdır. Oluşturulacak
Web Servisleri’nde bulabilirsiniz. her veritabanında olması istenen deği-
şiklikler (tablo, saklı prosedür, trigger
jav
kısmı bir önceki kitapçıkta detaylı olarak rın birbiri ile ilişkisini gösterir. Burada
incelenmişti. Diğer bir kısmı da bu mantıksal olarak zorlayıcılar vb. gibi
kitapçıkta anlatılacaktır. Önemli olduğu öğelerle ile ilişkilendirilmiş tabloların
düşünülen nesneler hakkında detaylı ilişkilerinin fiziksel olarak görünümü
bilgi bu seride yer almamaktadır. yer alır.
c
db_datareader Veritabanı Veri Okuyucusu
ili.
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ı
ad
db_owner Veritabanı Sahibi
db_None Boş
db_securityadmin Veritabanı Güvenlik Yöneticisi
jav
c
processadmin İşlem Yöneticisi
ili.
securityadmin Güvenlik Yöneticisi
serveradmin Sunucu Yöneticisi
setupadmin Kurulum Yöneticisi
sysadmin Sistem Yöneticisi
ad
bulkadmin Toplu Ekleme Yöneticisi
Kullanıcı Tanımlı Tipler: Her ne kadar tabloya kayıt eklendiğinde veya silindi-
ANSI SQL’de standartta tanımlı veri ğinde otomatik olarak devreye giren özel
tiplerinin dışındaki veri tiplerini kul- saklı prosedürlerdir. Özellikle veritabanı
lanamasak da VTYS’ler bunu aşarak tutarlılığını sağlamak için kısıtlayıcıların
kullanıcının gerektiğinde veri tipi tanım- yetersiz kaldığı durumlarda (örneğin
c
ilgili iki tip öğe bulunmaktadır: Roller kullanıcı adı. Zorunlu.
ve kullanıcılar. Kullanıcı tek bir kişiye
ait tanımlamaları içerirken roller yetki sifre: Kullanıcının şifresidir.
ili.
ve erişim tanımlamalarını gruplamada kullanici_verileri: Kullanıcı verilerinin
kullanılır. Bir rol bir çok kullanıcıya nerede tutulduğunu belirtir.
atanarak, haklar üstünde bir gruplamalı sa (systemAdmin) rolüne sahip temel
erişim yönetimi uygulanabilir. Böylelikle kullanıcıdır. Güvenlik nedeniyle bu
her bir kullanıcının haklarını teker teker kullanıcının adını değiştirilmesi önerilir.
ad
oluşturup yönetmek yerine roller ciddi Ancak bu ayrı bir tartışma konusu.
şekilde denetlenebilir. Çünkü bir çok
kullanıcı için neredeyse aynı haklar ve Yetki verme
yetkiler verilir. Bir okul otomasyonu ger- (Grant Komutu)
çekleştiriyorsak, bir çok öğretmen kulla-
nıcısının aynı tablo ya da T-SQL ifade- Grant komutu ile bir kullanıcının veya
jav
veritabanı rolleri...
c
edebilir olduğunu gösteren yer tutucu. AS: Nesne için yetki tanımlaması, kulla-
PRIVILEGES: ANSI-92’ye uyumlu olsun nım yetkisi olanların dışında Bir kullanıcı
diye konmuş bir kelime olup kullanımı grubuna ya da role de yetkilendirme yet-
ili.
isteğe bağlıdır. kisi açmak için kullanılır.
sp: Saklı Prosedür adı.
ep: Genişletilmiş Prosedür adı. Örnek 4:
udf: Kullanıcı Tanımlı Fonksiyon adı. sp_kitapbul adında bir saklı yordam
izin: üstünde SQLServer’e giriş hakkı olan
ad
•Tablolar için SELECT, INSERT, herkese tüm haklarını açalım:
DELETE, REFERENCES veya
UPDATE gibi izinlerdir. UPDATE ve GRANT ALL ON sp_kitapbul TO public;
c
bu saklı prosedürü oluşturan kişinin
ALL: Nesne üstünde verilen tüm izinlerin nesne üstündeki yetkilendirme ve
iptal edileceğini anlatır.
ili.
kullanma hakkı kaybolmaz.
FROM: Güvenlik hesabı listesi belirtmede
kullanılır.
GRANT OPTION FOR: Bu kelimelerle •Nesneler için (SP, EP, UDF) ek olarak
REVOKE komutu çalıştırıldığında kul- tek izin vardır; EXECUTE. EXECUTE
lanıcılılar nesneleri kullanmaya devam ile bir nesneye çalıştırılma izni verilebi-
ad
eder ancak yeni kullanım hakkı tanım- lir.Ayrıca REFERENCES ile referans
layamaz. verebilme izni de sağlanabilir. Nesneler
guvenlik_hesabi: Bir veritabanı giriş için REFERECES, View oluştururken
hesabı, işletim sistemi kullanıcısı ya da kullanılan WITH SCHEMABINDING
domain kullanıcısı olabilir. deyimi ile bu nesnenin ürettiği sonuçları
n: Bir önünde geçen şeyin n defa tekrar içerebilmesine hak sağlar.
jav
edebilir olduğunu gösteren yer tutucu. tablo: Veritabanında yer alan tablo adı
PRIVILEGES: ANSI-92’ye uyumlu olsun view: Veritabanında tanımlı view adı
diye konmuş bir kelime olup kullanımı sutun: Adı verilen tablo ya da view’de
isteğe bağlıdır. geçen sütun ad(lar)ı
sp: Saklı Prosedür adı. CASCADE: Hak verme hakkını kaldırır-
ep: Genişletilmiş Prosedür adı. ken kullanılır. Yetki verme yetkisi kaldırıl-
udf: Kullanıcı Tanımlı Fonksiyon adı. dıktan sonra, bu kişiler tarafından yetki-
w.
c
NSI SQL, veritabanı ile ilgili bu dili kullanacağız.
veri işleme ve düzenleme işlev-
leri için geliştirilmiş bir standart
ili.
T-SQL ile ANSI-SQL
dildir. Ancak bu dil zaman zaman bir
programlama dili olmadığından kayıt
komutlarını çalıştırma:
işlemede yetersiz kalabilmektedir. T-SQL ile SQL komutlarını VTYS’ye
Çünkü, gelişmiş programlama dillerinde çalıştırmasını söyleyebiliriz:
yer aldığı halde bu dilde WHILE, IF gibi Bir defada, SQLServer birden fazla SQL
ad
temel mantık ve döngü yapıları mevcut komutunu arka arkaya çalıştırabilir.
değildir. Değişken kullanımı da tanımda Ancak her bir komutun sonuna go ekle-
yer almaz. İşte Transact-SQL bu nok- memizi ister.
tada devreye giren ANSI 92 dahilinde bir Genel yapısı şu şekildedir:
standart dışı dildir.
ANSI-SQL KOMUTLARI
T-SQL’in geliştirilmesindeki en BU SATIRLARA
jav
c
go
ili.
declare @kitapNo INT, @kitapAdi VARC-
olduğunu söylemiştik. HAR(63)
Değişken: Programlama dillerinde, SET @kitapNo=255
SET @kitapAdi= ‘107 Kimya Öyküsü’
değeri daha sonra akışlara göre değişecek SET @kitapNo=256 -- Artık kitapNo
değişkeninin değeri 256,255 silindi.
bir değer için hafızada(RAM’de) bir yer go
ayırmak için kullanılan yapıdır. Hafıza-
ad
daki bu değere daha sonra değişkenin adı şeklinde yapılır.
ile erişilir ve yeni değeri atanır. Değişkene Ancak T-SQL’in asıl amacı SQL’in
atanan her yeni değer bir eski değeri siler. yeteneklerini artırmaktır. Bundan dolayı
Değişkenler şu şekilde tanımlanır: değişkenlerin en genel kullanım amacı,
bir sorgunun sonucundaki değerlerden
declare @degisken_adi veritipi[(boyut)] birini alıp bir değişkene aktarmaktır.
jav
Örnek 8:
Örnek 10:
declare @kitapNo INT
declare @kitapAdi VARCHAR(63)
declare @enSonEklenenKitap INT
go SELECT @enSonEklenenKitap=MAX(kitapNo)
FROM Kitap
go
ya da bir satırda birden fazla değişken
Değişkenler ve Sistem Fonksiyonları:
w.
c
SELECT @@connections;
-- olmamasına rağmen her türlü teknik
>>27 dokümanda isimler bu şekilde kulla-
ili.
nılmaktadır.
SQL Server’i durdurup yeniden baş-
latın ve aynı şeyi tekrar deneyin. Şimdi ne
görüyorsunuz? başlayıp END ile biten bloklar arasında
Sayının tekrar sıfırdan başladığını yazılır.
göreceksiniz. Genel Kullanımı şu şekildedir:
ad
BEGIN
Print komutu: Program kodları
Bazen değişkenlerin değerini, hata mesaj- ....
...
larını vs. mesaj olarak görmek isteriz. Bu END
tür durumlarda, print komutu kullanılır.
T-SQL’in sunduğu belli başlı akış
jav
--
lebilir. MSSQLServer ve Sybase’de
>> 16
aynı işlemi C, C++, C#, Java’da
Akış Kontrolleri: olduğu gibi ‘/*..... */’ ile de yapa-
T-SQL’i ANSI-SQL’e eklenti olarak bilirsiniz. SYBASE, ‘--’ işaretini bazı
gerektiren en önemli nedenlerden biri, toolarında dikkate almazken, MS
ww
c
şart2’ye bakılır. Bu şart doğru ise, şartı
if(şartlar)
takip eden BEGIN ile END ifadeleri begin
arasındaki kodlar çalıştırılır, if bloğunun ....
ili.
end
sonuna gider ve takip eden kodları çalış-
else if(şartlar)
tırır. Şart2 de yanlışsa, elseif(şart3)’deki begin
şart3’e bakılır. Şart3 doğru ise takip eden ...
end
Go Komutu
ad
dermek için bir işaret veya EXEC komutu ile
Bir SQL Server’e bir olarak yorumlarlar. En birlikte kullanılmalıdır.
seferde birden fazla sonunda GO komutu Ayrıca, bir yerel değiş-
komut gönderilebilir. verilmedikçe, Client kenin etki alanı komut
SQL Server bu komutları uygulamaları komutları yığını ile sınırlıdır. Bir
yığınlar halinde almak- sunucuya göndermezler, yerde GO dendikten
jav
tadır. GO komutu, T-SQL doğaçlama sorgu oturu- sonra, yeni bir yığın baş-
komut yığının sonunu munun kapanması için ladığından GO komutun-
belirtmek için kullanılır. de yine GO komutuna dan önce tanımlanan ya
Genel kullanımı, ihtiyaç duyulur. da değer atanan skaler
GO T-SQL komutları, GO değişkenler ve içerikleri
şeklindedir. komutu ile aynı satırda kaybedilecektir. Ancak
GO aslında kendisi yer alamaz, ancak Go aynı şey veriye satır satır
w.
SQL Server tooları Örneğin, Stored Proce- alması gerekir. Aksi halde
GO komutunu, T-SQL dure (SP için bkz. Bölüm: SQL server hata verir ve
komutlarından oluşan 3) çağırırken, SP ya yığı- SP oluşturmaz.
yığını SQL Server’e gön- nın ilk komutu olmalıdır Örnek 13:
-- dbKutuphane veri-
c
BEGIN
declare @sayfaSayisi int
•kitabın sayfa sayısı 100’den büyük,
SELECT @sayfaSayisi=MAX(sayfaSayisi) 500 den küçük ise burası çalışır
ili.
FROM Kitap
print ‘kitaplıktaki en kalın kitap çok
if (@sayfaSayisi>500)
BEGIN da kalın değil.’
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ı.
ww
-- 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;
c
if(SELECT MAX(SayfaSayisi) FROM
END Kitap)>=500
else print ‘bu kitaplıkta kalın kitaplar
ili.
BEGIN var’
else
print ‘bu kitaplıkta kalın kitap yok’
var’
END
else
BEGIN 2.CASE deyimi:
Case yapısı ANSI92 standartları ile
uyumlu bir karar döngüsüdür ve oldukça
İPUCU:
ww
c
Örnek 17:
Ödünç tablosunda yer alan kitap numa- 3.While Döngüsü
ralarının bir dökümünü ve içerde ise WHILE ile, bir işlemi istediğimiz kadar
ili.
yanına içeride; dışarıda ise dışarıda yaz- tekrarlatabiliriz. Bu bize tekrar gerekti-
dıracak T-SQL kodunu oluşturalım: ren işlemlere kolaylık sağlar.
Genel yapısı şu şekildedir:
WHILE şart
BEGIN
Tekrarlaması gereken kodlar buraya
yazılır
ad
END
Örnek 19:
jav
c
>> sayac :
>>15 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
ili.
BREAK komutu: devam etmesini sağlar.
Break komutu, WHILE döngüsünden Örnek 21:
bir uç şarttan dolayı çıkmak üzere kul-
DECLARE @sayac INT
lanılır. BREAK ile while döngüsünden SELECT @sayac = 1
çıkıldığında, WHILE’in END’ini takip WHILE (@sayac < 15)
BEGIN
ad
eden kodlardan devam edilir. SELECT @sayac = @sayac + 1
if (@sayac=11)
BEGIN
Örnek 20: Continue
END
Yukarıdaki örnek için, sayac değerinin print ‘sayac : ‘
print @sayac
15 olması durumu bizim için yeterlidir
ve bu durumda döngüden çıkmamız END
jav
gereksin: go
Sonucunda, 1,2,3,4,5,6,7,8,9,10,12,13,
DECLARE @sayac INT
SELECT @sayac = 0 14,15 yazdırılacaktır ama 11 yazdırılma-
WHILE (@sayac <> 15) yacaktır.
BEGIN
SELECT @sayac = @sayac + 2 T-SQL ile oluşturulup yönetilebilecek
if @sayac > 15
BEGIN nesneler şunlardır:
print ‘Bir alt satır olmasa kısır Örnek 22:
döngü hatası olacaktı’
w.
nacak bir koşul yazdığınızdan emin Daha sonra tabloya, normal bir tabloy-
c
olun. Aksi halde, sonsuza kadar muş gibi kayıt ekleyebiliriz:
çalışacak bir kod yazabilirsiniz
INSERT INTO #kitap
ili.
ki böyle bir şey pratikte mevcut SELECT kitapNo,kitapAdi,ISBNNo
değildir. Sadece SQL Server’in FROM Kitap
WHERE kitapNo < 10
kilitlenmesine neden olursunuz. Bir
önceki örnekte, @sayac değişkeni Ya da tabloda yer alan kayıtları
14 ve 16 değerlerini alacak anacak
asla 15 değerini alamayacaktır. Bu SELECT * FROM #kitap
ad
durumda sonsuza kadar çalışacak İle görebiliriz. Kayıtları güncelleyebi-
bir kod yazmış oluruz. Durumu if liriz ya da silebiliriz. Ancak bu tablo, otu-
deyimi içerisinde kontrol ederek rumu kapattığımız anda veya SQLServer
ölümcül hatayı engelledik. kapatıldığı anda silinecektir. Bunun
dışında biz de istediğimiz zaman bu tab-
loyu bildiğimiz yöntemle silebiliriz:
jav
c
ğında silinecekse, tempdb’de tablo açma
yöntemi kullanılabilir. Resim 15
ili.
Örnek 24: tanımlanır ve veri bütünlüğünü sağla-
mayı amaçlayan tanımlamalardır.Bir
CREATE TABLE tempdb..kitap(
KitapNo INT, tablo oluşturulurken, herhangi bir alan
KitapAdi VARCHAR(55), için girilebilecek veri türlerini bir grup
ISBNNo CHAR(16)
) veya kural ile sınırlamak için kontrol
ad
go zorlayıcıları kullanılır.
Yöntem ile geçici tabloyu oluşturun. kodlarının da 111 ile 999 arasında oldu-
Daha sonra bu tabloya bir değer girin. ğunu biliyoruz. Bu tanımları tabloya
Enterprise manager ile tabloyu gör- yansıtalım:
meye çalışın.
CREATE TABLE tblIL(
Query Analyzer ile tabloyu görmeye ilTrKod INT CONSTRAINT cns_ilTrKod
çalışın (select ile). CHECK ( ilTrKod BETWEEN 1 AND 8181),
ilAdi VARCHAR(15),
Query Analyzer’i kapatıp açın. ilTelKod INT CONSTRAINT cns_ilTelKod
w.
c
Prosedür ne demektir? duyulduğunda aynı sp defalarca çağrıla-
Nesneye dayalı programlama bu kadar bilir. Cursor gibi oturum kapandığında
popüler değilken, programlar sadece silinmez.
ili.
prosedür denilen parçacıklardan olu- Network bazlı çalışmalarda ağ trafiği
şurdu. Her bir prosedür, belli bir işlevi ve sistem kaynaklarının kullanımını
yerine getirmek için özenle yapılandı- düzenleyerek de performans artışı sağlar.
rılmış program parçacığıdır. Mesela, iki Bir dize işlem, bir tek paket içerisinde
sayı alıp bunların toplamlarını hesapla- yer alır. Gerektiğinde bir tek komut ile
ad
yan bir kod parçasını toplayıcı adında bir tetiklenebilir. Paketin tamamı çalışın-
prosedür içerisine paketleyebiliriz. Bir caya kadar istemde bulunan terminale
prosedür, başka bir prosedür içerisinden hiçbir şey gönderilmez. Tüm komutlar
çağrılabilir. Bu da sık kullanılan işlemler bittiğinde bir tek sonuç gönderilir. Bu da
için yazılmış kodların bir defa yazılıp bazı durumlarda ağ trafiğini rahatlatır.
çok defa kullanılmasını böylelikle de Bir SP sistem tarafından oluşturul-
jav
c
CREATE PROC [ EDURE ] procedure_name
olarak anılır. [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [
SP’ler şu faydaları sağlar:
ili.
OUTPUT
] ]
1. Uygulamanın getirdiği bazı iş kural- [ ,...n ]
ları prosedür içinde tanımlanabilir. Bir
kez oluştuktan sonra bu kurallar birden Örnek 27:
çok uygulama tarafından kullanılarak Çalıştırıldığı tarih itibariyle, aldığı kitap-
daha tutarlı bir veri yönetimi sağlanır. ları getirmeyen üyelerin adını-soyadını
ad
Ayrıca bir fonksiyonelliğin değişmesi veren bir SP yazalım:
ihtiyacı doğduğunda her uygulama için
CREATE PROCEDURE sp_cezaliUye
değişiklik yapmak yerine, sadece bir AS
platformda değişiklik yapılır. DECLARE @buGun DATETIME
SET @buGun = GetDate()
2. Tüm prosedürler üstün performansla SELECT uye.Adi,uye.soyadi
FROM odunc INNER JOIN uye ON uye.UyeNo
çalışır ancak birden fazla çalıştırılacak = odunc.UyeNo
jav
c
hatalar meydana getirmesine engel
olur. Bir SP’yi Silmek:
Bir sp’yi artık kullanmayacağımıza
ili.
karar verdiğimizde silmemiz gerekir. Bu
Örnek 28: durumda şu komut ile silinir:
En çok yapılan hata, bir SP’nin çağ-
DROP PROC sp_adi
rılma kodunu da yanlışlıkla SP ile birlikte
go
derlemektir. Aşağıda yanlış yazılmış bir sp
ad
yer almaktadır. Doğru ‘go’ ifadesi sizce Örnek 29:
nereye konmalı? Oluşturduğumuz sp’yi silmek ister-
sek:
CREATE PROCEDURE sp_cezaliUye
AS
DROP PROC sp_cezaliUye
DECLARE @buGun DATETIME Go
SET @buGun = GetDate() --
>>The command(s) completed
jav
c
VermeSuresi < @referansTarih
lamak yeterlidir. Go
şeklinde yazabiliriz. Daha sonra
EXEC sp_cezaliUye_2
ili.
@referansTarih=’06.20.2003’
--
kitapları bulan bir SP yazalım ancak >>(HİÇ SONUÇ DÖNMEYECEKTİR)
tarih olarak bu günden daha büyük bir EXEC sp_cezaliUye_2
seçeneği kullanılır. Şayet dışarıdan para- SET @sSQL =@sSQL + ‘ AND KitapAdi
LIKE ‘’%’ + @KitapAdi + ‘%’’’
metreye değer atanmazsa, geçerli değer IF @KitapOzeti IS NOT NULL
SET @sSQL = @sSQL + ‘ AND KitapOzeti
default atanmış değer olarak alınır ve LIKE ‘’%’ + @KitapOzeti + ‘%’’’
işlem yapılır: --print @sSQL --nasıl bir SQL
oluşturduk?
EXEC(@sSQL)
Go
ww
ili.
@sayi3 + @sayi4 + @sayi5) / 5
Bir sp, başka bir sp’yi çağırabilir.
GO
c
da onu çalıştırabiliriz. Bu durumda Örnek 35:
da EXEC komutu kullanılır. EXEC
CREATE PROC toplayici
ili.
komutunun başka nerelerde kul-
lanıldığını öğrenmek için yardım @toplayan smallint,
@toplanan smallint,
menüsünü kullanabilirsiniz. @toplam smallint
AS
c
FROM odunc
WHERE kitapNO=@kitapNo AND geldiMi=0 END
) > 0 Go
SET @sonuc=0
else Test etmek için:
ili.
SET @sonuc=1 EXEC sp_oduncVer @kitapNo=1,
@vermeTarihi=’01.01.2003’,@uyeNo=1
return @sonuc
go Örnek 39:
Sonra da ödünç bilgisini kaydedecek
sp’yi yazalım: SQL Server’in performansını izleyip
CREATE PROC sp_oduncVer performans istatistiklerini alalım:
@kitapNo INT,
@vermeTarihi DATETIME =’01.01.2003’,
ad
@uyeNo INT,
@vermeSuresi INT = 15
AS
declare @sonuc SMALLINT
EXEC @sonuc=sp_kitapIcerdeMi @kitap
No=@kitapNo
IF (@sonuc=1)
BEGIN Resim 21
jav
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.
w.
c
strGlobSQL=”EXEC sp_cezaliUye”
set rsCezaliUye = objConn.Execute(strGlobSQL)
DO UNTIL rsCezaliUye.EOF
response.write rsCezaliUye(“adi”) & _
“ “ & rsCezaliUye(“soyadi”) & “<br>”
ili.
rsCezaliUye.MoveNext
LOOP
%>
</body>
</html>
Örnek-38:
İşte aynı işlemi yapacak ASP.NET-VB.NET kodları:
ad
<%@ 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;passwor-
jav
d=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.
w.
SqlClient.SqlDataAdapter(sqlCommand)
Dim dataSet As System.Data.DataSet = New System.Data.DataSet
dataAdapter.Fill(dataSet)
Return dataSet
End Function
</script>
<html>
<head>
</head>
ww
<body>
<form runat=”server”>
<asp:DataGrid id=”DataGrid1” runat=”server”></asp:DataGrid>
<!-- Insert content here -->
</form>
</body>
</html>
c
Resim 22 üstünde ilerlenir.
4. Resultset ile ilgili işlemler sona
sp_monitor erdiğinde cursor CLOSE ile kapatılır.
ili.
SP’ler hakkında son olarak şunu da bil- Ancak kapatılan cursor henüz hafızada
memiz gerekir, SP’ler sadece select işlemi yer kaplamaya devam eder.
için kullanılmaz. INSERT, UPDATE ve 5. Cursor ile ilgili işlerimiz bittiği
DELETE işlemlerinin tamamını SP’ler anda hafızadan da silmek için cursor
aracılığıyla yapmak, veritabanını uygula- DEALLOCATE ile hafızadan boşaltılır.
ad
madan izole etmek için iyi bir yöntemdir.
(Resim 22) Örnek 40:
Kitaplar listesini ekrana yazdıracak(re-
Cursor’ler sultset olarak değil de teker teker) bir
kod parçası yazalım:
VTYS’deki cursor’lar metin editörlerin-
jav
şık gibi gelebilir ama normalde 5 adımlık 3.Cursor üstünde dolaşmak için
ardışık işlemler dizisinden ibarettir. FETCH komutundan faydalanılır:
1. Cursor bir SELECT ifadesi için
c
go
sp_foreignkey
PRINT @kitapAdi
FETCH komutu ile ikinci kaydı yaz- •bir önceki FETCH ile aldığımız
sp_primarykey
dırmayı deneyin. kaydı yazdırdık. Bir sonraki kayda
ili.
sp_help
geçelim:
Cursor’ün sona gelip gelmediğini
anlamak için @@FETCH_STATUS sp_helptext
FETCH cr_kitaplarListesi INTO
@kitapNo, @kitapAdi
ve @@rowcount global fonksiyonların- sp_helpdb
dan faydalanacağız: •kayıtlarımızı doldurduk. Başa dön-
ad
@@FETCH_STATUS fonksiyonu, sp_helpconstraint
düğünde yazılacak.
en son çalıştırılan FETCH komutunun
sonucu hakkında bize bilgi verir. Bu sp_rename
END
Go
fonksiyon, şu üç değerden birini vere-
sp_spaceused
cektir: Kitaplar listesini yazdıran cursor ile
0: Bir önceki FETCH komutu başarı sp_depends
bizim işimiz bitti ancak yapmamız gere-
jav
komutu icra edildikten sonra resultsette sor’ün içerdiği resultset boşaltılır. Ancak
toplam kaç kayıt kaldığını tutar. Hiç sp_helptrigger
Cursor için hafızada açılan yer halen
FETCH komutu kullanılmadı ise Cur- kullanımdadır ve Mesaj
Kullanıcı Tanımlı bir cursor
Sistemhafızadan
sp’leri:
sor’ün işaretlediği resultsette toplam kaç tam olarak silinmediği sürece aynı adda
kayıt yer aldığını gösterir. sp_addmessage
başka bir cursor daha oluşturulamaz.
ww
Şimdi artık, kitaplar listesini sonuna Cursor yeniden açılırsa, aynı resultsete
kadar yazdırabiliriz. Bu iş için WHILE ensp_dropmessage
baştan erişilebilir.
yapısını kullanacağız: sp_getmessage
5. Cursor şu şekilde hafızadan silinir:
DECLARE cr_KitaplarListesi CURSOR FOR
SELECT kitapNo,KitapAdi sp_altermessage
open cr_kitapDurumu
WHILE @@FETCH_STATUS =0
BEGIN
c
print @kitapAdi
IF @Durumu = 0
print ‘dışarıda’
Resim 23 ELSE
ili.
Print ‘içeride’
FETCH NEXT FROM cr_kitapDurumu INTO
@kitapAdi, @Durumu
END
GO
Close cr_kitapDurumu
Deallocate cr_kitapDurumu
(Resim 24)
ad
Örnek 42:
Kitaplar tablosunda aynı kitap numara-
Resim 24
sından iki tane olan varsa sildirecek bir
DEALLOCATE cursor_adi
DEALLOCATE cr_kitapListesi
cursor yazalım:
jav
SET ROWCOUNT 0
(Resim 23) DECLARE @kitapNo INTEGER, @tekrarSa-
yisi INTEGER, @sayac BIT
DECLARE crKitaplar CURSOR FOR
Örnek 41: SELECT kitapNo, COUNT(kitapNo)-1
FROM Kitap
Projelerin çeşitli aşamalarında, özel- GROUP BY kitapNo
likle de dışarıdan veri alınırken, bazı HAVING COUNT(kitapNo)>1
ORDER BY kitapNo
kayıtların bire bir tekrarladığı olabilir. --kitapNo bir kereden fazla geçenleri
sileceğimize göre
Bu durumda kayıtlardan sadece birini --doğru kitap numaralarını seçelim:
w.
(Resim 25)
c
Örnek 43:
Sayfa sayısına göre ilk beş kitabı görmek
için:
ili.
SELECT TOP 5 *
FROM kitap
ORDER BY sayfaSayisi DESC
ad
jav
Resim 25
İPUCU:
Herhangi bir kritere göre sıralandık-
tan sonra ilk n kaydı getirip ötesiyle
ilgilenmeyeceksek SELECT TOP N
w.
deyimini kullanırız.
ww
c
İşlemler (Transactions) gerçekleşir ve geçerli kabul edilir veya bir
Bir banka uygulamasını düşünün. Bir kısım işlemler yolunda gitse bile, blok
kullanıcı başka bir kullanıcıya havale sona ermeden bir işlem bile yolunda git-
ili.
yaptığında ne olur? Öncelikle havale mese hiçbir işlem olmamış kabul edilir.
yapanın hesap bilgilerinden havale Transaction tanımına girebilen işlem-
yaptığı miktar düşülür. Ardından alı- ler UPDATE, INSERT ve DELETE
cının hesabına bu miktar eklenir ve işlemleridir.
havale gerçekleşmiş olur. Ancak her Bir Transaction bloğunu işletmenin
ad
zaman şartlar istendiği gibi olmayabilir. temel mantığı şu şekildedir:
Örneğin, gönderenin hesabından para 1.Transaction bloğu başlatılır. Bu işlem-
düşüldüğü anda elektrik kesilebilir ya den sonra gerçekleşen işlem logları
da program takılabilir. Bu durumda, işaretlenir. Bu arada işlem kullandığı
ne olur? Gönderenin hesabından para kaynakları diğer kullanıcılara karşı kilit-
düşülmüştür ama Alıcının hesabına leyerek korur.
jav
da geçmemiştir yani bir kısım paranın 2.Transaction bloğu arasında yapılan her
sahibinin kimliği kaybedilmiş olur. Ya bir işlem bittiği anda başarılı olup olma-
da siz tam da bir hesaba havale yapacak- dığına bakılır, başarılı olmadığı anda geri
ken, düşük bir ihtimal ama arkadaşınız alım işlemine geçilir (ROLLBACK).
da aynı hesabı kapattırdı ise?... Bu da Başarılı ise, bir sonraki işleme geçilir.
sistemin olası durumlar dışında veri kay- 3.Tüm işlemler tamamlandığı anda
betmeye müsait bir hal alması demektir, COMMIT ile bilgiler yeni hali ile
w.
önlenmesi gerekir. İşte Transaction bu sabitlenir. Başarısız bir sonuç ise ROLL-
nedenle, verileri korumak için kilitler BACK ile en başa alınır ve bilgiler ilk
(‘LOCK’ koyar) hali ile sabitlenir.
Daha küçük parçalara ayrılamayan Bu örnek için aşağıdaki tabloyu kul-
en küçük işlem yığınına transaction lanacağız:
ww
c
İle bir transaction başlatılır. alabilme seçeneği)’ne ihtiyaç duyarız. Bu
türden durumlarda sabitleme noktaların-
dan faydalanılır.
ili.
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:
ad
SAVE TRANSACTION sabitleme_
Örnek 44: notkasi_adi
dikkat:
SET @havaleMiktar=20000000 BEGIN TRANSACTION
-- 20 milyon havale edilecek UPDATE Hesap
SET bakiye = 5000000
BEGIN TRANSACTION WHERE hesapNo=’1’
UPDATE tblHesap -- transaction açıldıktan sonra bir
SET bakiye=bakiye - 20000000 UPDATE geldi.
WHERE hesapNo=@gonderenHesap --Yeni Durum:
SELECT * FROM hesap
UPDATE tblHesap SAVE TRANSACTION svp_kaydet
SET bakiye=bakiye - 20000000 DELETE FROM Hesap
WHERE hesapNo=@aliciHesap WHERE HesapNo=’1’;
w.
Örnek 46:
Şeklindedir.
c
Trigger’lar Trigger’lerin bir UPDATE, INSERT
veya DELETE komutuna cevap olarak
Triggers (Tetikler), aslında özel bir Stored çalışması, Transaction mantığı ile aynıdır:
ili.
Procedure’dür. SP’lerden farkı, bir tablo 1. Bir tablo için TRIGGER tanımlı ise
üstünde INSERT, DELETE veya UPDATE
UDATE , INSERT, DELETE komut- işlemi başlamadan hemen önce bir Tran-
ları ile bir işlem yapılmak istendiğinde, ilk saction başlatılır.
olarak bu SP’lere bakılması ve gerekli ise 2. INSERT, DELETE veya UPDATE
ad
çalıştırılmasıdır. komutu yerine getirilir.
Nesneye dayalı Programlamada var 3. Trigger çağrılır ve içindeki SQL ifadesi
olan, event based programlama bu mantık çalıştırılır.
ile örtüşür. 4. Trigger işlemi onaylarsa geçerli kılar
Trigger’lar izin verilmeyen ya da tutar- veya onaylamaz ve geçersiz bulur. Tran-
sızlığa neden olacak işlemleri engelleyerek saction geri alınır. (ROLLBACK TRAN-
jav
mantıksal ilişkilere sahip verilerin tutar- ikinci yapılan değişiklik trigger için
lılığını sağlamak üzere oluşturulurlar. tetiklenmeye neden olmaz. Kısaca
İhtiyaca göre uygulamanın getirdiği bazı update trigger’ı tekrar tekrar çalış-
kuralları kontrol etmek için de kullanıla- maz, yalnızca bir kez çalışır.
bilirler.
c
trigger içerisinde yerleştirilir.
ili.
içerebilirler. Mesajı gelir.
2. Çalıştıktan sonra bir kullanıcıya değer
kümesi döndüremezler. Dolayısıyla Eklenen-Silinen Kayıtlar:
SELECT ifadesi dahil edileceği zaman Triggerlar çalıştığı zaman Inserted ve
dikkatli olunmalıdır. Deleted tablolarını kullanırlar. Bu tablola-
ad
3. Veri bütünlüğünü, farklı tablolardan rın her ikisi de ana tabloyla yani triggerın
birbirine referans yapan verilerin tutarlılı- tetiklendiği tabloyla eşdeğer alanlara
ğını sağlamak için ve uygulamanın ihtiya- sahiptirler. Bu tablolar, mantıksal tablo
cına göre bazı kuralları tanımlamak üzere şeklinde RAM’ de bulunurlar. Ana tabloya
kullanılabilirler. Ancak zorlayıcılarla bir kayıt eklendiği zaman bu kayıt aynı
düzenlenebilecek trigger kullanmamak zamanda inserted tablosuna da eklenir.
jav
Trigger oluşturalım:
c
Örnek 50:
CREATE TRIGGER tr_oduncKontrol
ON odunc Ödünç tablosu üstünde hangi trigger’lerin
FOR INSERT,UPDATE AS bulunduğunu öğrenmek için gerekli T-
ili.
IF(SELECT COUNT(odunc.kitapNo) FROM
odunc,inserted WHERE odunc.geldiMi=0 SQL komutunu yazalım:
AND inserted.kitapNo=odunc.KitapNo)>1
20’den fazla kez ödünç alınan kitapların bir durum olduğunda, trigger yüzünden,
silinmesini önleyecek bir trigger yazalım: yapılan her şeyin geri alınması gerekmez.
Ancak SPsp’lerin otomatik devreye girme-
CREATE TRIGGER tr_oduncKontrol_20
ON odunc diğini unutmamak gerekir.
FOR DELETE
AS