You are on page 1of 65

Veritabanı

Programlama 2
Şubat 2004

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ü:
Önsöz
Murat Yıldız Veritabanı kavramının ilk olarak ortaya
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-
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.
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.
VTYS’lerinden orta ve büyük ölçekli
olanlarından biri olan MS SQL Server
ACAR Yayıncılık adına imtiyaz sahibi:
Murat Yıldız 2000 bu kitapçıkta teferruatlı olarak ele
alınıyor.
Reklam Müdürü:
MS SQL Server 2000’i tanırken daha
Ahmet Aslantürk
çok VTYS’ler için ortak olan noktalara
Baskı: değinildi. Böylelikle kitapçıkta anla-
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
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
sinde yer almaktadır. Bu kapsamda, programlamadan ziyade yönetimi ile
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
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,
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-
Tüm bunlarla birlikte son yıllarda kese sonsuz teşekkürlerimi sunarım.
popülerlik kazanan VTYS uygulama Bununla birlikte, seride yer alan bütün
şekillerinden replication (çoğaltmalı hatalar bana aittir.
çalışma) ve Data Warehousing (Veri
ambarlama) konuları, kitapçığın ala- -Yaşar GÖZÜDELİ
nının kısıtlı olması nedeniyle yer veri- ygozudeli@hotmail.com
lemeyen konular arasında. XML veri-
tabanları 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 iste-
yen arkadaşlara fikir vermesi açısından
burada zikredilmiştir. Ayrıca veritabanı

Veritabanı Programlama 2 BYTE 7


Giriş
V
eritabanı Yönetim Sistemleri, nesneler yazılabilmektedir.
verilerin fiziksel hafızadaki
durumlarını, kullanıcıların Belli başlı VTYS’ler
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
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
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
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
karşılayamadığı durumlarda kullanıl- bir VTYS’dir. Açık kod bir yazılımdır.
mak üzere ek programlama komutları Küçük-orta ölçeklidir. Özellikle Web için
barındırırlar. Bu iş için MS SQL Server geliştirilmiş bir VTYS’dir denilebilir.
ve Sybase SQL Server Transact SQL
denilen komut takımlarını içerir. Oracle Postrage SQL: Bu da MySQL gibi açık
ise PL/SQL ile bu işe çözüm getirir. kod bir VTYS’dir.
Bu diller sayesinde, bu konu içerisinde
öğreneceğimiz Stored Procedure (saklı MS Access: Çoklu kullanıcı desteği
prosedürler), Trigger, Fonksiyon gibi yoktur. İşletim sisteminin sağladığı
veritabanları için vazgeçilmez olmuş güvenlik seçeneklerini kullanır. Bunun

8 BYTE Veritabanı Programlama 2


yanında belli sayıda kayda kadar
(1000000 civarı) ya da belli bir boyutun IBM ....................... %37.8
(yaklaşık 25MB) altına kadar bir sorun Oracle.................... %26.3
çıkartmadan kullanılabilecek bir küçük Microsoft ................ %15.4
ölçekli VTYS’dir.
Informix ................. %3.2
Sybase ................... %3
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. ç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
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
Server geliyor. Informix ve Sybase ise •Projede kaç tablo kullanacak?
onu takip ediyor.
Yeni başlayanlar için hangi VTYS’yi •Her bir tabloda en fazla kaç satır yer
öğrenmem en iyisi olur sorusunu yanıt- alabilir?
lamak gerekebilir. Ülkemizde insan kay-
nakları açısından en çok kalifiye elaman •Projenize aynı anda en fazla kaç kulla-
aranan VTYS Oracle ve arkasından da nıcı bağlanacak?
MS SQL Server gelmekte. Çok nadir
olarak Sybase bilen elemanlar da aran- •Projeniz günlük kaç transaction
maktadır. (INSERT-DELETE-UPDATE) ger-
Bu konuda TBD(Türkiye Bilişim çekleştirecek?
Vakfı) yayın organında yayınlanmış bir
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

Veritabanı Programlama 2 BYTE 9


önemli? Ancak bir VTYS kullanarak hazırda yer alan Stored Procedure’leri de
proje geliştirecekseniz, hangisini seçme- yakından tanıyacağız.
niz gerektiğinin dışında, hangi sürümleri
kullanacağınız ya da hangi donanımlar 4.Bölüm: Transaction’lar ve Trigger’ler
üstünde çalıştıracağınız da önemlidir. ele alınıyor. T-SQL ile Stored Procedu-
re’ler dışında Transaction’lar ve Trig-
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
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
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-
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.
Yine Veritabanı Programlama serisi
3.Bölüm: Stored Procedure ele alınıyor. hakkındaki görüş, şikayet ve önerile-
T-SQL ile Stored Procedure’ler yazmak, riniz için www.verivizyon.com/sqlkitabi/
VTYS’lerinin daha etkin bir şekilde kul- adresindeki formdan faydalanabilirsi-
lanılmasını sağlar ve çeşitli performans niz. Seri hakkındaki duyuruları da aynı
artırıcı etkileri vardır. Stored Procedure adresten takip edebilirsiniz.
ile, tekrar tekrar kullanmak üzere paket-
lenmiş T-SQL komutları oluşturacağız.
Ayrıca, SYBASE ve MSSQLServer
tarafından kullanılan ve sistemde hali

10 BYTE Veritabanı Programlama 2


1. Bölüm
MS SQL Server
2000’e Giriş
V
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
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
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ı

Web Matrix ve MS SQL Server Desktop Engine

MSDE ayrıca MS SQL nindeki setup.exe prog- tıklayın. Böylece, SQL


Server Desktop Edition ramını tıklayın. Server Desktop edition
için de kullanılmaktadır. Kurulum esnasında kurulduğunda sa kulla-
Desktop Edition’da bir bir güvenlik sorunu nıcı adında ve sasifresi
istemci arayüz bulun- ile karşılaşmamak için şifresinde temel verita-
mamakla birlikte SQL MSDE dizininde bulunan banı kullanıcısını oluş-
Server kurulumunu ger- setup.ini dosyasına şu turacak bir kurulumu
çekleştirebilirsiniz. Bu iki satırın yer aldığından başlatmış olursunuz.
programı ücretsiz olarak emin olun MS SQL Server’in bu
www.microsoft.com adre- [Options] sürümü için kısıtlı da
sinden indirebilirsiniz. SAPWD=sasifresi olsa bir arayüz sağlaya-
Desktop Edition’ı ve daha sonra bilmek üzere ücretsiz
kurmak için, MSDE dizi- setup.exe programını olarak Web Matrix prog-

12 BYTE Veritabanı Programlama 2


SQL Server Developer Edition kuru- XP Professional yüklü bir PC’ye ihtiyacı-
lumu, kullanıcı ayarlarını saymazsak ve nız olacaktır. Donanımsal ihtiyacınız ise
sadece kendi bilgisayarınıza kurmak veya bu işletim sistemlerinin duyduğu mini-
kaldırmak isterseniz, herhangi bir prog- mum ihtiyaçlardır. Bu, bütün programın
ram kurulumundan farkı yoktur. kurulumu için geçerli gereksinimdir.
Sadece istemci programları kurup, hali
Gereksinimler hazırda zaten olan bir MSDE sunucu-
sunu kontrol etmek isterseniz, Windows
Gerçek hayatta veritabanı uygulama- 98 de yeterli olabilir. Ancak, buradaki
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
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

MDACs bileşenlerini kul- sonuçta ücretsiz bir MS


lanarak kendiniz için bir SQL Server sürümünü
arayüz hazırlayabilirsi- elde etmiş olursunuz.
niz. Bunun bir benzerini Bu iki yazılımın
w w w. v e r i v i z y o n . c o m birlikte kullanımı konu-
download adresinden sunda daha geniş bilgiyi
indirebilirsiniz. ADO.NET ile .NET temelli
Desktop edition veritabanı uygulamaları
üstünde burada anlatılan geliştirme ve Web Ser-
işlemlerin bir çoğunu visleri konulu serinin 3.
ramını kullanabilirsiniz. yapamazsınız. Yapa- kitabında bulabilirsiniz.
Web matrix programını bilmek için en azından
www.asp.net/webmatrix bu ünitede anlatılan
adresinden ücretsiz istemci programlarını da
indirebilirsiniz. Ya da kurmanız gerekir. Ancak

Veritabanı Programlama 2 BYTE 13


Resim 1 Resim 2

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-
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
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.
seçeneği, Clustered Server kurmak için (Resim 3)
gerekli bir seçenek olup biraz ileri bir
konudur. Özetle Clustered: Birden fazla 6. Adım: Sözleşmeyi onaylamak için
SQL Server kurulu makinenin birbirinin [yes] botununu tıklayın.
devamı gibi iş yükü ve trafik dengeleme
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

14 BYTE Veritabanı Programlama 2


Resim 3 Resim 4

işaretleyebilirsiniz. neğinin karşısında yer alan [browse]


butonunu tıklayın ve aynı işlemi yapın.
8. Adım: SQL Server yapılandırma Windows konusunda yeterli bilginiz
konusunda tecrübeli değilseniz, bu yoksa, bu kısımla da oynamamanız
adımda default seçeneğini işaretli bıra- tavsiye edilir.
kın. Bir makinede, birden fazla SQL
Server kurulumu çalıştırabilirsiniz. Bu 10. Adım: Gelen seçenekleri aynen
durumda her bir kurulum farklı bir onaylayın. SQL Server ve Active Direc-
uzayda çalışacaktır. Aynı ismi iki SQL tory konusunda bilgi sahibi iseniz bu
Server kurulumuna veremezsiniz. konudaki ayarları uygun hale getirebi-
(Resim 4) lirsiniz.

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
sistem kaynaklarınızın kısıtlı olduğunu kabul eder ve SQL Server kaynaklarına
düşünüyorsanız, minimum seçeneğini erişimini geçerli kabul edebilir.(Bu
kullanın. SQL Server’in programı durumda, sistem yetkilendirmesi olan
farklı bir diske kurmasını istiyorsanız, kişi dbo(veritabanı sahibi) kullanıcısı
program files seçeneğinin önündeki olarak yetkilendirilir.)
[browse] butonunu tıklayın ve kurmak b. Sistem yetkilendirmelerinin yanı
istediğiniz klasörü seçtikten sonra [ok]’i sıra SQLServer’in kendi kullanıcılarını
tıklayın. SQL Server’in veri dosyalarını- da oluşturup yetkilendirmesini isteyebi-
(veritabanı dosyalarını) farklı bir adreste liriz. Bu durumda veritabanı kaynakla-
saklamasını istiyorsanız, data files seçe- rına erişim için iki yetkilendirmeden biri

Veritabanı Programlama 2 BYTE 15


SQL Server İstemci Taraf
tarafından yetkilendirilmiş bir kullanıcı-
nın erişimi geçerli sayılır. Bileşenleri
Uygun olan seçeneği işaretleyin.
Şayet kendiniz SQL Server için bir SQL Server Enterprise
kullanıcı oluşturursanız, bu kullanıcının Manager:
kullanıcı adını(muhtemelen bu isim sa Enterprise manager, SQL Server’in
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-
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.
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
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-
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
3. [Denetim masası\program ekle kal- istenilen ayar ve değişiklikler yapılabilir.
dır’dan SQL Server 2000]’i seçin ve •Herhangi bir SQL Server üstünde
normal bir program kaldırır gibi kaldı- veritabanları, nesneler, kullanıcılar,
rın. yetkilendirmeler ve izinler oluşturulup
düzenlenebilir.

16 BYTE Veritabanı Programlama 2


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
Resim 5 kopyası – ‘installation instance’) kaydet-
tirmeniz gerekir.
•Yetki çerçevesinde, kaydedilmiş SQL
Server’ler üstünde SQL Server yönetim 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
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ı
ile kullanıcıların sunucu uygulamalarını sırayla tıklayarak açın.
yönetmeleri sağlanmıştır. (IIS de bu 3. SQL Server Group seçeneğini, fare ile
türden bir yönetim paneli kullanıcı ara- sol tıklayın. Ardından açılan menüden
yüzüne sahiptir). Her bir uygulamanın New SQL Server Registration seçene-
kendisi için bir bileşen yüklenir ve arayüz ğini tıklayın.
bu bileşen sayesinde o uygulamanın 4. Register SQL Server Wizard başlatıla-
özelliklerini yönetecek bir hal alır. SQL caktır. [Next] butonunu tıklayın.
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
SQL Enterprise Manager’i başlatmak [Add >] butonunu tıklayın ve ardından
için (tabi öncelikle MSDE’yi kurduğu- [Next]’i tıklayın.
nuzu var sayıyoruz.) yukarıdaki şekilde 6. Hangi yetkilendirme seçeneğini kul-
görüldüğü gibi Başlar>Programla- lanacağınız belirleyin. Bunu, ağda daha
r>SQL Server>Enterprise Manager’i önceden kurulmuş bir SQL Server için

Veritabanı Programlama 2 BYTE 17


Resim 6 Resim 7

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)
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
ğinize karar verin ve işaretleyin. İlk defa [yes]’ i tıklayın.
kullanıyorsanız, standart ayarları takip
etmeniz önerilir. [Next]’i tıklayın.
8. Uygun sunucuyu seçin ve [Next]’i Enterprise Manager ile
tıklayın. Veritabanı Bakım ve Yönetimi
9. Kayıt işlemi burada sona erdi. Başarılı
bir şekilde ekleme işlemini yerine getir- Herhangi bir VTYS’de olduğu gibi
SQLServer’de de asıl verilerin tutul-
duğu yer veritabanıdır. Bir veritabanı bir
İPUCU: çok nesne ve verilerle birlikte kullanıcı
Bir SQL Server kayıt bilgisi silin- tanımları ve haklar gibi rolleri de içerir.
diğinde SQL Server’de yer alan (Resim 9)
bilgiler kaybolmaz, silinmez sadece SQL Server 2000’de verilerin ve
sizin Enterprice Manager’iniz kaydı tanımlamaların yer aldığı bir veritabanı
silinen SQL Server’i tekrar kaydet- dosyasının yanı sıra bir de log dosyası
mediğiniz sürece yönetemez. yer alır. Veritabanı dosyası *.mdf uzan-
tılıdır. Log dosyası ise *.ldf uzantılı bir

18 BYTE Veritabanı Programlama 2


Resim 8 Resim 9

dosyadır. log dosyasına işlenir.


Bu tür veritabanı dosyalarına ait Veritabanı yönetimi, veritabanı dos-
bilgileri görmek için Enterprise Mana- yalarının düzenlenmesi, oluşturulması
ger’de herhangi bir veritabanı dosyasını ve silinmesi işlemlerinden ibarettir.
sol tıklayın ve çıkan menüden properti- Bir SQL Server’deki en yetkili stan-
es’i tıklayarak detay bilgilerine erişebilir, dart kullanıcı sa(system admin-sistem
bir kısım değerleri değiştirebilirsiniz. yöneticisi) kullanıcısıdır. Bir veritabanı
Transaction log dosyaları aslında ilk dosyasındaki en yetkili standart rol dbo
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
diği verilerde yapılan değişiklikler önce arayüzden gerçekleştirilebilir. Bu işlem
transaction log dosyasına yazılır, ardın- için, öncelikle Enterprise Manager’e
dan veritabanına kaydedilir. Bu sistem girin. Ardından Databases üzerinde sağ
başta veritabanına yapılan kayıt işle- tıklayarak New Database seçin. Sizden
minin tutarlılığını sağlamak için böyle veritabanı adı girmeniz istenecektir. İste-
geliştirilmiştir ve hemen her VTYS’de diğiniz bir veritabanı adını girin.
aynı şekilde çalışır. Bir veritabanı tanımlanma aşama-
SQL Server’da INSERT, UPDATE sında ya da tanımlandıktan sonra şu
veya DELETE komutları çalıştırıldı- parametrelerini de ölçeklemek gerekir.
ğında oluşan değişiklikler transaction Ölçeklemek’ten kasıt projenin büyüklü-

Veritabanı Programlama 2 BYTE 19


ğüne göre performans-kapasite denge- yacağını düşündüğünüz transaction log
sini oturtmaktır. Bu biraz da veritabanı kayıtlarını truncate edebilirsiniz (silebi-
konusunda tecrübeli olmanızı gerektiren lirsiniz).
bir işlemdir.
Database Seçenekleri: Veritabanı seçe-
Bir Veritabanını nekleri, veritabanın ölçeklenmesinde
etkili bir diğer faktördür. Bu seçenekler
Ölçeklemek kısaca:
Enterprise manager ile bir veritabanının
ö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
üstünde değişiklikler yapılır. alanları dosyadan çıkarılmaya zorlanır.

Veritabanının boyutu: Veritabanına dbo use only: Bu özellik seçildiği


kayıt girdikçe ya da yeni tanımlamalar anda sistemde login olan kullanıcılar
- nesneler girdikçe boyutu büyür. Bir ve db_owner sabit sistem rolüne haiz
azami boyut tanımlanması halinde bu kullanıcılar dışında diğer kullanıcılar
değere çıkılmasından itibaren depolama bu veritabanı dosyasını kullanamazlar.
biriminde (harddisk) yer gerektiren veri- Halihazırda sisteme login olan kulla-
tabanı işlemleri yapılamaz. nıcılar ise sistemden çıkmaları halinde
db_owner rolüne haiz değil ise tekrar-
Transaction log dosyası azami boyutu: dan veritabanına erişemezler.
Bir veritabanında yapılan kayıt ekleme,
kayıt silme ve kayıt güncelleme işlem- read only: Veritabanı dosyasının sadece
lerinin veritabanı log dosyasında işaret- okunabilir olmasını sağlayan seçenektir.
lendiğini biliyoruz. Bu dosya üstünden Bu seçenek seçildiğinde kullanıcılar
veritabanının bütünlüğünün sağlandı- veritabanından veri okuma (SELECT)
ğına da değinmiştik. İşte bu dosya da komutlarını çalıştırabilir ancak
belirtilen azami boyutun üstüne çıkarsa DELETE, UPDATE, INSERT gibi
UPDATE-INSERT-DELETE işlemleri DML komutları ile ALTER, CREATE
gerçekleştirilemeyecektir. Transaction ve DROP gibi DDL komutlarını çalış-
Log’a işaretlenmesi gereken hiçbir şey tıramaz.
çalıştırılamayacaktır. Bu tür durumlarda
bir alternatif olarak artık işinize yarama- single user: Veritabanı dosyasını aynı

20 BYTE Veritabanı Programlama 2


anda bir tek kişinin kullanmasını nekleri kullanır. Farklı olarak toplu
sağlar. Bu komut çalıştırıldığı anda işlemler için daha az log tutar. Örneğin
veritabanında birden fazla kişi bağlıysa SELECT INTO vb. gibi komutlar için
bu özellik açıldıktan sonra kullanmaya daha kısıtlı bir log tutulur.
devam ederler ancak bağlantı kesildiği
andan itibaren bir tek kullanıcı kuralı 3. Simple Recovery Model: En basit
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ı
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.
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ı
bu seçenektir. sıra SQL ifadelerini çalıştırma ve analiz
etme konusunda faydalanılmak üzere
2. Bulk_Logged Recovery Model: Full geliştirilmiş bir SQL Server bileşenidir.
Recovery Model ile yaklaşık aynı seçe- Yine Query Analyzer ile bir veritaba-
nına erişebilmek için yetkilendirilmiş bir
işletim sistemi kullanıcısı veya domain
İPUCU: kullanıcısı yahut veritabanı sunucusu
Query Analyzer’i Enterprice Mana- yöneticisi hesabına sahip olmak gerekir.
ger’den çağırmak mümkündür. Bu kullanıcı grubunun hangisi veya
Bunun en büyük faydası yetkilen- hangilerinin geçerli olacağı, Enterprise
dirme bilgilerini yeniden girmemize Manager ile bir veritabanına sa (sistem
gerek kalmamasıdır. Bu işlem için yöneticisi) veya eşdeğeri bir hesap ile
Enterprice Manager’dan bağlanmak bağlandıktan sonra [properties\Security]
istediğiniz veritabanını seçtikten sekmesinden düzenlenebilir. Yine nes-
sonra [Tools\SQL Query Analyzer]’i neler için yetkiler Enterprise Manager
tıklamak yeterlidir. 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 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.

komutları ve Saklı Prosedür, Trigger, boyama


Cursor gibi veritabanın nesnelerinin 3. Nesne gezgini ve nesne arama seçe-
oluşturulması esnasında Query Analyzer nekleri ile bir veritabanını veya üstünde
programı kullanılacaktır. yer alan nesnelere erişim kolaylığı.
4. Tablo oluşturmak gibi bir çok işlem için
SQL Server Query Analyzer’in kullanılabilir hazır T-SQL şablonları.
belli başlı özellikleri: 5. Bir etkileşimli hata ayıklayıcı ile Saklı
yordamlar için analiz imkanı.
1. T-SQL ifadelerini çalıştırmak için bir 6. Resultset’leri metin (text) temelli veya
metin editörü ızgara (grid) temelli sunabilme.
2. ANSI-SQL ve T-SQL için Sentaks 7. Grafik ve metin temelli Sorgu çalış-

22 BYTE Veritabanı Programlama 2


zer ile de yapmak mümkündür. Hatta
İPUCU: bu ortamda doğrudan kodlarla muhatap
Veritabanında, kullanıcı bilgileri, olduğumuz için daha fazla detaya hük-
haklar, nesneler ve özellikleri gibi metme şansına sahibiz. Bu kısımda, bir
bilgilerin tutulduğu veri tabloları önceki bölümde Enterprise manager ile
için birçok literatürde Veri Sözlüğü nasıl yapılacağını anlattığımız veritabanı
(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-
çok verinin yer aldığı bir çok tablo neceğiz. Bu işlem için kullanacağımız
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ı
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,
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
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
veritabanı için tanımlanan ilk dosya
Veritabanı Oluşturmak: PRIMARY dosya olarak kabul edilir.
Create Database Bütün veritabanı tanımlama tabloları ve
Enterprise manager ile görsel ortamda değerleri birincil dosyada saklanır. Birin-
yaptığımız hemen her şeyi Query Analy- cil veri dosyası *.mdf ’ dir. İkincil veri

Veritabanı Programlama 2 BYTE 23


dosyalarının uzantısı ise *.ndf ’ dir. Bir önceki kitapçıkta da kullandığımız
veritabani_adi: Veritabanına vermeyi dbKutuphane veritabanını oluşturalım:
planladığınız isim. Bu isim VTYS tara- Başlangıç boyutu 1MB olsun. En fazla
fından geçerli kabul edilen ve T-SQL ile 1GB‘a kadar olmak üzere her seferinde
gönderimde bulunmak istediğiniz (ileri veri dosyası %20’si kadar artırılmak
seviyeli işlemlerde) isim. üzere en fazla 1GB’a kadar çıkarıla-
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.
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ı
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,
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.
Loglamadan Tablo Boşaltma:
artim_miktari: Veritabanının başlangıçta Truncate Table
belirtilen boyutu dolduğunda sistem
tarafından boyutu otomatik olarak artı- Bir tabloda yer alan tüm kayıtları silmek
rılır. Bu aşamada veritabanının boyunun ama bu silme işlemleri için de satır bazlı
ne kadar artırılacağı bu parametre ile birer transaction log oluşturulmasının
belirtilir. % oran değeri verilebileceği gibi istenmediği durumlar olabilir. (Özellikle
sabit bir artım boyutu da girilebilir. replication ile ilgili uygulamalarda). Bu
tür durumlarda TRUNCATE TABLE
Örnek 1: komutu kullanılır.

24 BYTE Veritabanı Programlama 2


Genel kullanımı şu şekildedir: fark olurdu?
1. işlemden sonra, kitapNo alanına en
TRUNCATE TABLE tablo_adi son verilen kitapNo değerinin bir fazla-
Burada, tablo_adi argümanı, İçeriğini sı(bir sonraki daha doğru olur.) verilirdi.
satır satır loglamaksızın boşaltacağımız 2. işlemde ise kitap no tekrardan 1 değe-
tablo adını ifade eder. rinden(ilk verilen değerden) başlar ve
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,
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,
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

TRUNCATE TABLE komutunun çalıştırılır. Çünkü DELETE komutu


neticesinde, tablonun sadece içerdiği log tutar ve bu nedenle bir TRIGGER
veriler silinir. Kolonlar, zorlayıcılar, tetikleyebilir. Ancak TRUNCATE
indeksler, trigger’ler ve benzeri diğer komutu log tutmadığı için trigger
tablo üstünde yer alan tanımlamalar harekete geçiremeyeceği önlem olarak
silinmez. Bu tür tanımlamaların da komut çalıştırılmaz.
silinmesini istiyorsanız, DROP TABLE TRUNCATE TABLE komutu son
komutu ile tabloyu silmek gerekir. olarak, indeksli görünüm(view) ‘lere işti-
rak eden tablolar için de çalıştırılamaz.
Örnek 2: TRUNCATE TABLE komutu, stan-
dart olarak tablonun sahibine(owner)
DELETE * FROM kitap aittir. Bu hak başka rollere ya da kullanı-
ile cılara aktarılamaz.

TRUNCATE TABLE kitap


Bir Sorguyu Query
Komutlarının herhangi biri çalıştı-
rılsa idi, daha sonra eklenecek bir kitap
Analyzer ile Analiz Etme
için sistem tarafından verilen kitap- SQL Query Analyzer ile bir sorgunun
No(kitap tablosunun otomatik artan çalıştırılma planını görsel ve metin bazlı
anahtar alanı) alanı değeri arasında ne olarak detaylı görerek üstünde optimi-

Veritabanı Programlama 2 BYTE 25


zasyon yapmak mümkündür. Böylece Bu özelliği tekrar kapatmak için çalış-
aynı sonucu daha hızlı üreten sorgular tırmamız gereken komut oldukça basit:
yazmak mümkün olabilmektedir.
SET SHOWPLAN_TEXT OFF
SQL Server Query Analyzer ile görsel
Go
çalıştırma planını görmek için
1. [Query>Display Execution Plan] dememiz yeterli olacaktır.
seçeneğini işaretleyin. Kısayol olarak Ayrıca daha özet ama kapsamı geniş
CTRL+L’yi de kullanabilirsiniz. bir çalışma planı çıktısı almak için SQL
2. Daha sonra analiz etmek istediğiniz Server’in SHOWPLAN_ALL özelliğini
sorguyu yazıp çalıştırın. açabiliriz. Bunun için de şu komutu
3. Ardından [Estimated Execution Plan]
sekmesini tıklayın.
SQL Server’in çalıştırma planını UYARI
metin ortamında bir resultset olarak Bir tablo oluşturacak SQL cümle-
döndürmesi için şu komutu kullanabi- ciğini çalıştırma planını görmek
lirsiniz: üzere Query Analyzer ile SQL Ser-
ver’e gönderdiğimizi varsayalım.
SET SHOWPLAN_TEXT ON
Bu durumda tablo oluşmayacağı
go
için bu tabloya kayıt eklemeye
Dedikten sonra çalıştırdığınız bütün kalkıştığımızda böyle bir tablonun
sorgular için bir metin bazlı çalıştırma olmadığına dair bir hata alırız.
planı da görüntülenecektir.

26 BYTE Veritabanı Programlama 2


çalıştırmamız gerekir: metin temelli çalıştırma planı daha tek
düzedir. Her bir parametere birer satır
SET SHOWPLAN_ALL ON
gibi gösterilir. Görsel çalıştırma planı ise
go
her bir düğüm için detaylı istatistikleri
dedikten sonra çalıştırılan bütün sor- düğümün üstüne gelindiğinde gösterir.
gular özet çalışma planı verilecektir. Ayrıca her bir düğüm için bu düğümde
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
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-
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
İş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(T-
rigger)’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 birin- Resim 11
cil anahtar alan oluşturursak, bu sorgu
artık table scan yerine indeks bulma (Resim 11)
(index seeking) yapacaktır. Bunun mali-
yeti de bir çok durumda table scan’a göre Import & Export Data
daha kısadır.
SHOWPLAN_TEXT ve SHOWP- Bazen MS Access(*.mdb), text dosyası
LAN_ALL özellikleri yardımı ile alınan ya da MS Excel ve benzeri gibi yapılan-

Veritabanı Programlama 2 BYTE 27


Resim 12

dırılmış dosyalardan veri almak veya


bu türden bir dosyaya veri aktarmak 1. Bunun için öncelikle [Başlat\
durumunda kalabiliriz. Bu durumda Programlar\Microsoft SQL Server\
Import & Export Data toolu kullanılır. Import and Export Data] takip edilerek
(Resim 12) program başlatılır.
2. Uygun olan kaynak seçilir. Örneğin
MS Access(*.mdb)
İPUCU: 3. Uygun olan hedef seçilir. Örneğin MS
MSDOS komut ortamından veri- Access’den SQL Server’e veri alacaksak,
tabanına erişmek için eski adı ile hedef SQL Server’dir.
isql(Sybase’de halen aynı adla 4. Kaynakta var olan tablolar getirilir ve
kullanılıyor), SQL Server’de ise kullanıcının hangi tabloları aktarmak
osql.exe programı kullanılabilir. istediği sorulur. İstediğiniz tabloları
Bunun için komut satırını açtıktan işaretleyin.
sonra osql deyip enter’i tuşlayın. 5. Hemen çalıştırmak için Run Immedi-
Ardından kullanıcı adı - şifreyi girin. ately seçeneğini kullanın.
SQL komutlarınızı yazıp go komutu 6. Bir sonuç ekranı ile size kaç tablonun
ile bitirdikten sonra enter tuşuna aktarıldığı gösterilecektir.
basarak sonucunu görebilirsiniz. SQL Server’den başka bir formata
Bu programı sonlandırmak için exit veri aktarmak için de yapılması gereken
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.

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


XML, yazılım ve donanımdan bağımsız
veri taşıma ve saklama standardı olup
eXtensible Markup Language (Genişle-
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
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)
Bu ikon çift tıklanırsa resimde görünen gibi SGML (Standartd Generalized
ekran açılır. Markup Language)’den türetilmiştir.
İşletim Sistemi kapatılıp açıldığında SGML çok geniş bir dil olduğundan
otomatik olarak başlatılmak için bu Web’de tam olarak kullanılması oldukça
seçeneği işaretli olarak bırakmak gere- zordur. Bu nedenle bu türden geliş-
kir. tirmelere gidilerek amaca özel kısıtlı
SQL Server’de 4 farklı durum için elemanlardan oluşan işaretleme dilleri
durum ikonu mevcuttur. Aynı durum elde edilmiştir.
ikonunu, Enterprise Manager ile kay- SQL Server 2000 veri aktarımı ve sak-
dettirdiğiniz her bir Veritabanı için de lama konusundaki bu son teknoloji için
görebilirsiniz. şu destekleri sağlar:
Bu 4 ikon şu şekildedir: •SQL Server’e URL üstünden
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.

Veritabanı Programlama 2 BYTE 29


Nesneler veritabanı yapıları içeri-
sinde yer alır. SQL Server ilk kurul-
duğ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:
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.
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
Örnek 3: vs.) bu veritabanında yapılır.
Bir sorguda tablolara arsında hiyerarşik
ilişkiyi de içeren XML çıkış üretmek Msdb: SQL Server Agent servisi tarafın-
İçin dan kullanılan veritabanıdır.
Tempdb: Geçici bilgilerin saklandığı
SELECT * FROM kitap FOR XML RAW veritabanıdır. Bir sonraki ünitede, kulla-
kullanılır. nımı hakkında bilgi verilecektir.
Pubs: Örnek bilgilerin yer aldığı verita-
SQL Server’de Veritabanı banıdır. (Resim 14)
Her bir veritabanı içerisinde yer alan
Nesneleri nesneler şu gruplardan birine aittir:
Bu kısımda anlatılan nesnelerin bir Diyagramlar: Veritabanındaki tablola-
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.

30 BYTE Veritabanı Programlama 2


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ı sakla- tablolardır. Veritabanında var olan tablo-


yan mxn boyutlu matrisleridir. Bir çoğu lar üstünden select işlemi ile getirdikleri
kullanıcı tarafından tanımlanır. Sistem sonuçları ifade eden nesnelerdir. (Bir
tarafından kurulum aşamasında oluş- önceki kitapçıkta hakkında geniş bilgi
turulup kullanılan tablolar da yer alır. verilmiştir.)
Tablolar hakkında ilk kitapta yeterince Saklı prosedürler (Stored Procedu-
konuşmuştuk, burada sadece şunu da res): Bir dize T-SQL(MSSQLServer
eklemek yeterli olur sanırım: Bir tablo - Sybase) veya PL/SQL(Oracle) komu-
8060byte’ten daha uzun olmamalıdır. tunun bir işlevi yerine getirmek üzere
Bu, SQL Server’in disk yönetim birimi paketlenmiş halidir.
‘sayfa’nın boyutundan kaynaklanan bir Kullanıcılar: Sistemdeki nesnelere
sınırlamadır. Tabloları meydana getiren erişim hakkı verilmiş birer kullanıcı
satırlar, sayfalar halinde saklanır ve bir adı ve şifrenin sistemdeki eşdeğeridir.
tablonun bir satırı en fazla bir sayfa yer Bir kısmı sistem tarafından oluşturula-
kaplayabilir, ikinci sayfaya taşamaz. bileceği gibi örneğin (dbo) daha sonra
Görünümler (view): Gerçekte olmayan veritabanı yöneticisi tarafından da ekle-

Veritabanı 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. lamalarına olanak sağlarlar.


Roller: Veritabanında yapılabilecek belli Kullanıcı Tanımlı Fonksiyonlar: ANSI
başlı işlemler, belli nesneler üstünde SQL’de tanımlı fonksiyonların bir
belli haklar için erişim tanımlayarak kısmını ve bazı VTYS’ler tarafından
oluşturulan hak grubu. Bu gruplar daha sağlanan ek fonksiyonları bir önceki
sonra kullanıcılara aktarılır. Böylece kitapçıkta anlatılmıştı. Tüm bu ANSI
VTYS üstünde var olan sayısız erişim ve Sistem fonksiyonlarının dışında
ve yetkilendirme için denetleme işlemi kullanıcı ihtiyaç duyduğunda fonksiyon
gruplar üstünden denetlenebilir. da tanımlayabilmektedir. Her ne kadar
Default’lar: Bir alana değer girilmemesi saklı prosedürler(SP) fonksiyon benzeri
halinde, bir değer ile başlaması için bir görevi yerine getirse de kullanıcı
default nesneleri tanımlanır. Örneğin bir tanımlı fonksiyonlar işlev olarak daha
hesap yeni açıldığında para yatırmadığı- özel işlemlerde kullanılır.
nız sürece hesabınızda 0 lira görünür. Tetiklemeler (Trigger): Trigger’ler bir
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

32 BYTE Veritabanı Programlama 2


basamaklı güncelleme gibi) kullanılır. kullanılır. Genel kullanımı şu şekildedir.

CREATE USER (Kullanici_adi)


SQL Server ve Kullanıcı identified by (sifre) default
tablespace kullanici_verileri;
Yönetimi
SQL Server’de kullanıcı yönetimi ile Kullanici_adi:
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.
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.
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
lerine erişimleri olmak durumundadır. tüm kullanıcıların bir T-SQL ifadesine
Öğrenciler için de aynı şey geçerlidir. ya da veritabanına erişimi için güvenlik
sisteminde izin açmaya yarar. Bu komut
Roller: ile yapılabilecek hemen her şey Enterprise
Birden fazla kişiye verilebilen ve yetki- Manager programı ile de yapılabilir.
lendirmeler için bir grup oluşturmada Genel kullanımı şu şekildedir:
kullanılan kullanıcılara yönelik tanım-
GRANT {ALL [PRIVILEGES] |izin[,....n]}
lamalardır. {
Halihazırda var olan ve değiştirile- [(kolon[,...n])] ON {tablo|view}
[(sutun[,...n])]
meyen rollere sabit sistem rolü(fixed |ON {sp|ep|udf}
}
system role) denir. İki grup sabit sistem TO guvenlik_hesabi[,...n]
rolü vardır: sabit server rolleri ve sabit [WITH GRANT OPTION]

veritabanı rolleri... [AS {kullanici_grubu|rol}]

Kullanıcılar: ALL: Tüm verilebilecek hakların veri-


SQL Query Analyzer’de yeni bir kulla- leceğini gösterir. db_owner, sysadmin ve
nıcı oluşturmak için, create user deyimi database object owner tarafından kulla-

Veritabanı Programlama 2 BYTE 33


nılabilir. geçen sütun ad(lar)ı
TO: iznin kimlere verileceğini belirtir. WITH GRANT OPTION: Sadece nes-
guvenlik_hesabi: Bir veritabanı giriş neler için geçerli olan bu deyim ile izin
hesabı, işletim sistemi kullanıcısı ya da verilen bir kullanıcının bu nesne üstünde
domain kullanıcısı olabilir. başka birine daha kullanım izni verebilme
n: Bir önünde geçen şeyin n defa tekrar hakkı sağlayabilmesine yarar.
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-
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
•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;

SELECT için gerekirse sütun tanımları ile bu iş tanımlanır.


da verilebilir. Aksi halde verilen izin tüm
sütunlar için geçerli olur. REFERENCES Yetki Kaldırma
ile tablo üstünde bir alana yabancı anahtar (Revoke Komutu)
olarak referans içeren bir başka tablo vs.
oluşturabilme izni verir. GRANT komutu ile verilen hakların bir
çoğu Enterprise Manager kullanılarak
•Nesneler için (SP, EP, UDF) ek olarak görsel bir ortamda geri alınabilir ancak
tek izin vardır; EXECUTE. EXECUTE Query Analyzer ile kod yazarak bu hak-
ile bir nesneye çalıştırılma izni verilebi- ları geri almak için REVOKE komutu
lir. Ayrıca REFERENCES ile referans kullanılır.
verebilme izni de sağlanabilir. Nesneler Genel kullanımı şu şekildedir:
için REFERENCES, View oluştururken
REVOKE [GRANT OPTIONS FOR]
kullanılan WITH SCHEMABINDING {ALL [PRIVILEGES] |izin[,....n]}
deyimi ile bu nesnenin ürettiği sonuçları {
[(kolon[,...n])] ON {tablo|view}
içerebilmesine hak sağlar. [(sutun[,...n])]
|ON {sp|ep|udf}
}
tablo: Veritabanında yer alan tablo adı {TO|FROM}
guvenlik_hesabi[,...n]
view: Veritabanında tanımlı view adı [CASCADE]
sutun: adı verilen tablo ya da view’de [AS {kullanici_grubu|rol}]

34 BYTE Veritabanı Programlama 2


REVOKE komutunu çalıştırabilmek DİKKAT:
için sys_admin sabit sunucu rolüne veya Bir saklı prosedür için yetki verme
db_owner, db_securityAdmin sabit veri- yetkisi dbo’ya aittir.(Yani bu nes-
tabanı rollerine sahip kullanıcı olmak ve neyi oluşturan kişiye) Bu nedenle
elbette nesne için dbo olmak gerekir. REVOKE komutu çalıştırıldığında
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. 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-
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.
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-
izin: lendirilen kişilerin yetkilerini de kaldırır.
•Tablolar için SELECT, INSERT,
DELETE, REFERENCES veya Örnek 5:
UPDATE gibi izinlerdir. UPDATE ve ogrenci kullanıcısından saklı prosedür ve
SELECT için gerekirse sütun tanımları tablo oluşturma yetkilerini kaldıralım:
da verilebilir. Aksi halde verilen izin tüm
REVOKE CREATE PROC, CREATE TABLE
sütunlar için geçerli olur. REFERENCES
FROM ogrenci
ile tablo üstünde bir alana yabancı anahtar
olarak referans içeren bir başka tablo vs. Örnek 6:
oluşturabilme izni verir. Bir önceki bölümde üstünde yetki tanım-

Veritabanı Programlama 2 BYTE 35


2. Bölüm
T-SQL ve VTYS temelli
programlama
A
NSI SQL, veritabanı ile ilgili bu dili kullanacağız.
veri işleme ve düzenleme işlev-
leri için geliştirilmiş bir standart 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
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
temel amaç, VTYS dışında döngü veya YAZILIR

mantıksal karşılaştırma gerektiren konu- go

larda ayrıca bir derleyiciye, programlama


dili öğrenmeye, sistem oturtmaya gerek Örnek 7:
kalmadan bu türden işlemleri yerine Bu projede kullandığımız veritabanını
getirebilecek olanakları sağlamaktır. Bir oluşturalım:
sonraki konuda yer alan stored procedu-
CREATE database dbKutuphane on default
res, triggers gibi programcıkları yazarken go
use dbKutuphane
go
CREATE TABLE kitaplar(
kitapNo INTEGER NOT NULL,
DİKKAT: kitapAdi VARCHAR(63) NOT NULL,
T-SQL Microsoft SQL Server ve ISBNNo VARCHAR(15),
sayfaSayisi INTEGER,
Sybase için geçerli bir dildir. Oracle kitapOzeti VARCHAR(255))

kullananların, PL/SQL öğrenmeleri go

gerekir. Ancak bu iki dil birbiri ile


yaklaşık aynı özellikleri haizdir. Değişken Tanımlama ve Kullanma:
T-SQL kullanmamızın en büyük neden-

Veritabanı Programlama 2 BYTE 37


tanımlayabiliriz:
DİKKAT:
SQL’deki ve bir çok diğer program- Örnek 9:
lama dillerinin aksine, T-SQL’deki
declare @kitapNo INT,@kitapAdi
değişkenler @ ile başlamak zorun- VARCHAR(63)
dadır. go

Değişkenlere değer atama,


lerinden birinin değişken tanımlama
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-
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.
Ö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ı:
Bir veritabanına aynı anda bir çok kişi
İPUCU: oturum açabilir. Bir tek oturumda geçerli
Değişken isimlerinin nelerden oluş- değişkenlere yerel değişken denir. Bazen
ması gerektiği hakkında genel bilgi bütün oturumlarda geçerli değişkenlere
için serinin ilk kitabında [Verita- ihtiyaç duyulur. Bu tür durumlarda,
banı Programlama-I, s .15, Temmuz ortam değerlini ayarlamak üzere veya
2003] bulabilirsiniz. Seride yer çeşitli durumları tanımlamak üzere fonk-
alması nedeniyle kurallara burada siyonlar kullanılır. Bu fonksiyonların bir
yeniden bu konuya yer verilmedi. listesini kitabın sonundaki ek kısmında
bulabilirsiniz.

38 BYTE Veritabanı Programlama 2


Örnek 11:
Üstünde çalışmakta olduğunuz SQLSer- DİKKAT:
ver’e açıldığından beri toplam kaç kere SYBASE’de yapılandırma fonksi-
kullanıcılar veya programlar tarafından yonlarının yerine ortam değerleri,
bağlanılmıştır? global değişkenler adı ile anılırlar.
Kullanım konusunda bariz bir fark
SELECT @@connections;
-- olmamasına rağmen her türlü teknik
>>27 dokümanda isimler bu şekilde kulla-
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:

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ış
Örnek 12: kontrolleri şunlardır:
Kitap numarasını SQL sorgusu ile bula-
lım ve bu sonucu yazdıralım:

declare @sonuc int


SELECT @sonuc= COUNT(*) İPUCU:
FROM Kitap T-SQL’de bir satırın dikkate alınma-
print @sonuc
go ması isteniyorsa, ‘--’ ile bu belirti-
--
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
ANSI-SQL’in akış kontrollerine izin SQL Query Analyzer de ‘//’ işaretini
vermemesidir. T-SQL bir programlama dikkate almamaktadır. Aslında ‘--’
dili kadar geniş olmasa da belli başlı akış SQL92’de tanımlanan bir açıklama
kontrollerini sağlar. belirtici işarettir.
T-SQL’de akış kontrolleri BEGIN ile

Veritabanı Programlama 2 BYTE 39


1.IF ... ELSE karar yapısı BEGIN ile END deyimleri arasındaki
if(şart1) deki şart1 doğru ise if(şart1)’den kodlar çalıştırılır, if bloğunun en sonuna
sonra gelen BEGIN ile END arasındaki gider ve takip eden kodları çalıştırır.
kodlar çalıştırılır. Daha sonra if bloğu- Şart3 yanlış ise bu aradaki kodları da
nun en altındaki kodlardan devam eder. çalıştırmadan geçer.
Şart1 doğru değil ise, elseif(şart2)deki genel yapısı şu şekildedir:
ş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 ....
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 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
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
T-SQL’in bir parçası komutundan sonra açık- erişmek için kullandığı-
değildir. Query Analyzer, lama gelebilir. mız Cursor’lerde geçerli
osql ve isql tooları tara- Kullanıcının komut değildir. Yine SP tanım-
fından algılanabilen bir yığınları hususunda layacaksak, bu komutun
komuttur. kurallar riayet etmelidir. yığının ilk satırında yer
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-

40 BYTE Veritabanı Programlama 2


else
begin •kitabın sayfa sayısı 500’den fazla ise
.... burası çalışır.
end

print ‘Bu kitaplıkta çok kalın bir


Örnek 14: kitap varmış.’
Kitaplıktaki en kalın kitap hakkında fikir END
else if(@sayfaSayisi>100)
beyan eden T-SQL kodu:
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
FROM Kitap
print ‘kitaplıktaki en kalın kitap çok
if (@sayfaSayisi>500)
BEGIN da kalın değil.’

tabanını kullanmaya -- Hata verecek çünkü


başlaması için ilk satır olmayan bir bir komut bu bileşenler
-- veritabanına bir yerde saklı prosedür
kod yığını gönderelim. çağrılıyor. üstünden gönderilmeye
-- Bir satırlık bir -- SP ya yığının ilk
yığın. komutu olmalı veya çalışılırsa bir hata mey-
USE dbKutuphane EXEC komutu ile bir-
GO -- Bir T-SQL komut likte kullanılmalıdır.
dana gelir. GO komutunu
yığını bitti ve yenisi sp_who kullanabilmek için bir
başladı. Bu satır
GO izin gerekmez. Sistem-
-- bir üst satırda,
GO komutu ile birlikte
açıklama satırı kul- ODBC, OLE-DB ve deki herhangi bir kulla-
lanıldı. diğer bileşenler üstünden nıcı tarafından bu komut
DECLARE @degisken
VARCHAR(50) çalışan uygulamalar, GO çalıştırılabilir. Çünkü tek
SELECT @degisken =
‘Merhaba T-SQL.’ komutunu SQLServer’e başına veritabanı için
GO -- @degisken adlı
değişken artık geçerli
göndermezler. Böyle hiçbir şey demektir.
değil çünkü T-SQL
komut yığını biti-
rildi..
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;

Veritabanı Programlama 2 BYTE 41


print ‘bu kitaplıkta kalın kitap yok’
END
--
İPUCU: >> bu kitaplıkta kalın kitap yok
BEGIN ve END, C/C++/C#/Java gibi
programlama dillerindeki ‘{‘ ve ‘}’
gibi kullanılır. Aynı işlev için Delp- Bu durumda bir önceki örneğimizi şu
hi’de BEGIN ve END kullanılır. şekilde de kodlayabiliriz:

if(SELECT MAX(SayfaSayisi) FROM


END Kitap)>=500
else print ‘bu kitaplıkta kalın kitaplar
BEGIN var’
else
print ‘bu kitaplıkta kalın kitap yok’

•kitabın sayfa sayısı 100’den küçük ise


bu kısım çalışır. Herhangi bir dallanmayı iki satıra
print ‘bu kütüphanede broşürden tamamlayın. Ne görüyorsunuz? (Query
başka bir şey yok mu?’ Analyzer hata verecektir.)
IF yapısının en yaygın kullanım-
END
go larından biri de IF EXISTS yapısıdır.
-- Genellikle bir veri ya da nesnenin daha
>> kitaplıktaki en kalın kitap çok da
kalın değil.
önceden var olup olmadığı bu yapı ile
test edilir.
Bir sorguya bağlı if yapıları kullanı-
labilir: Örnek 16:
Hiçbir kitap kaydı yoksa kitap tablosunu
Örnek 15: silmek için:

if(SELECT MAX(SayfaSayisi) FROM IF NOT EXISTS(SELECT * FROM Kitap)


Kitap)>=500 DROP TABLE kitap
BEGIN --
print ‘bu kitaplıkta kalın kitaplar >>(hiç satır silinmez)
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: kısa kod ile etkin programlar oluşturma-
Prosedürel dillerde olduğu gibi, mıza yarar. Örneğin dışarıdaki kitaplar
tek satırlık if için blok kullanımına için ‘dışarıda’ yazabilecek bir kod bu
gerek yoktur. komut sayesinde basitçe yazılabilir.
Genel yapısı şu şekildedir:

42 BYTE Veritabanı Programlama 2


Örnek 18:
...

CASE declare @degisken VARCHAR(29)


WHEN şart THEN değer SELECT ISNULL(@degisken,’boşluk ise
[ ELSE değer] bu değer seçilecek’)
END --
>> boşluk ise bu değer seçilecek

Ö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
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
END

Şart sağlanıncaya kadar, BEGIN ile


END arasına yazılan kodlar çalıştırıla-
caktır.

Örnek 19:
Integer bir değişken tanımlayalım ve
değeri 15 oluncaya kadar bir artıralım.
SELECT kitapNo,geldiMi, ‘kitapDurumu’=
Case 15 olduğunda da yazdıralım:
WHEN geldiMi = 0 THEN ‘Dışarıda’

WHEN geldiMi = 1 THEN ‘İçeride’


End İPUCU:
FROM odunc Query Analyzer’de bir komut ya
da kelime hakkında yardım almak
ISNULL fonksiyonu: isterseniz, (normal bir kurulum
ISNULL(kontrol_edilecek_deger, null_ için) o kelimeyi seçtikten sonra,
ise_cikacak_deger) şeklinde kullanılır. klavyenizden Shift + F1 tuşla-
rına basmanız yeterli olacaktır.
kontrol_edilecek_deger: Bir sütun Böylelikle, MSSQL Server’iniz ile
adı ya da değişken adı olabilir. birlikte kurulan Books Online’den
null_ise_cikacak_deger: Bir sütun adı, aradığınız kelime ile ilgili konular
değişken adı veya sabit bir değer olabilir. seçilecektir.

Veritabanı Programlama 2 BYTE 43


DECLARE @sayac INT >>Henüz bir kısır döngü hatası olmadı
SELECT @sayac = 1 >>Henüz bir kısır döngü hatası olmadı
>>Bir alt satır olmasa kısır döngü
WHILE (@sayac < 15) hatası olacaktı
BEGIN >>sayac :
SELECT @sayac = @sayac + 1 >>16
END
CONTINUE komutu:
print ‘sayac :’ Break komutu gibi, WHILE döngüsünde
print @sayac
-- bir uç şartı kontrol etmek için kullanı-
>> 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
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
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

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ı’
break (Ev Ödevi)Bir önceki örneği, continue
END
else yerine break koyarak tekrar ediniz. Ne
BEGIN sonuç ile karşılaştınız?
Print ‘Henüz bir kısır döngü hatası
olmadı’ Cevap: 1,2,3,4,5,6,7,8,9,10
END
END
print ‘sayac :’
print @sayac Geçici Tablolar
--
>>Henüz bir kısır döngü hatası olmadı
>>Henüz bir kısır döngü hatası olmadı Bazen geçici bir süre için ek tablolara
>>Henüz bir kısır döngü hatası olmadı ihtiyaç duyabiliriz. Bu tür durumlarda,
>>Henüz bir kısır döngü hatası olmadı
>>Henüz bir kısır döngü hatası olmadı T-SQL ile geçici tablolar oluşturup onları

44 BYTE Veritabanı Programlama 2


DİKKAT: Geçici bir kitaplar tablosu oluşturalım:
ÖLÜMCÜL HATA!!!
CREATE TABLE #kitap(
WHILE döngüsünde, döngünün KitapNo INT,
devam edip etmeyeceğini tayin KitapAdi VARCHAR(55),
ISBNNo CHAR(16)
eden şart kısmına, mutlaka sağla- )

nacak bir koşul yazdığınızdan emin Daha sonra tabloya, normal bir tabloy-
olun. Aksi halde, sonsuza kadar muş gibi kayıt ekleyebiliriz:
çalışacak bir kod yazabilirsiniz
INSERT INTO #kitap
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

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:
kullanabiliriz. Geçici tablolar, kullanıcı
DROP TABLE #kitap
çıkış yaptığında veya SQLServer kapatıl- go
dığında otomatik olarak silinirler.
Geçici tablolar oluşturmanın iki yolu 2.Yöntem:
vardır: Geçici tablo oluşturmanın bir diğer yolu,
1.Yöntem: Oturum boyunca geçerli geçici tempdb adlı veritabanı dosyasına bir tablo
tablolar oluşturmak için kullanılır. açmaktır. Bu veritabanındaki tablolar,
sadece SQLServer kapatıldığında silinir.
CREATE TABLE #tablo_adi(
Alan1 tur1[(boyut1)] [[NOT] NULL], Genel yapısı şöyledir:
Alan2 tur2[(boyut2)] [[NOT] NULL],
.... CREATE TABLE tempdb..tablo_adi(
Alann turn[(boyutn)] [[NOT] NULL] Alan1 tur1[(boyut1)] [[NOT] NULL],
) Alan2 tur2[(boyut2)] [[NOT] NULL],
....
Bu şekilde oluşturulan tablolar Alann turn[(boyutn)] [[NOT] NULL]

oturum kapandığında veya SQL Server )

durdurulduğunda silinir. Bu yöntemle oluşturulan geçici tab-


lolar, SQL Server durdurulduğu anda
Örnek 23: kaybolur. Çünkü tempdb adlı verita-

Veritabanı Programlama 2 BYTE 45


banını SQL server açıldığı anda boşla-
tacaktır. Bazen, kullanıcı çıkış yaptığı
halde geçici tablonun saklanması ihti-
yacı 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. Resim 15

Ö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
go zorlayıcıları kullanılır.

(Resim 15) Örnek 26:


Bir il tablosu oluşturacağız. Tüm ille-
Örnek 25: rin trafik kodlarının (ülkemizde) 1-81
(ev ödevi) arasında olduğunu biliyoruz ve telefon
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
CHECK (ilTelKod BETWEEN 111 AND 999),
Tablodaki kayıtları seçmeyi deneyin.
)
Ne gördünüz?
Aynı işlemi ikinci şekilde geçici tablo şeklinde oluşturulan il tablosundaki
açarak onun üstünde test edin. zorlayıcılar il trafik kodu olarak 1-81 ara-
lığının dışında, il telefon kodu olarak da
Kontrol Zorlayıcıları 100 ile 999 arasındaki sayıların dışında
(Check Constraints): bir değer girilmesini önleyecektir.
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


3. Bölüm
Saklı Prosedürler
(Stored Procedures)
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.
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
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-
programlamayı kolaylaştırmayı amaçlar. duğu anda şu aşamalara tabi tutulur:
Saklı prosedürler, bir çok gelişmiş
programlama dilindeki fonksiyon yapı- 1. SP’nin bileşenleri parçalara ayrıştırılır
larına karşılık gelir. Birden fazla işlemi, 2. Veritabanı içerisinde table,view gibi
paketlenmiş bir halde bir tek komut ile başka nesnelere atıfta bulunan refe-
çalıştırmamız gerektiğinde stored proce- ranslar varsa, geçerli olup olmadıkları
dures kullanılır. İşlemden kasıt T-SQL kontrol edilir. (Geçerli:1-nesne varmı,
ile yapılabilen her şeydir. 2-izin var mı)
Stored procedure, 1980’li yılların 3. Kontrollerden geçen SP’nin adı sysob-
sonunda Sybase SQLServer ile birlikte jects tablosuna, kodları ise syscomments
kullanıma girdi. En büyük özelliği tablosuna saklanır.
sorguların önceden hazırlanması 4. Bu işlemlerle birlikte derleme işlemi
(derlenmesi) ve VTYS ile aynı uzayda yapılır. Normalizasyon işlemleri olarak
çalışmasından dolayı daha hızlı sonuç da anılan bu işlemler sonucunda, ağaç
vermesidir. şeması elde edilir. Bu şema da sysproce-
Bir SP oluşturulduktan sonra, verita- dures tablosunda saklanır.
banı sunucusunda saklanır. Her ihtiyaç 5. SP herhangi bir anda çağrıldığında,

48 BYTE Veritabanı Programlama 2


ilk kez çalışıyorsa bu işlemler gerçek- yapan bir stored procedure’ü kullanma
leştirilir. İlk sefa çağrılmıyorsa, kontrol, izni olabilir.
sorgulama ağacı oluşturma işlemleri
yapılmaz ve oldukça hızlı bir şekilde SP oluşturma:
SP’nin derlenmiş hali çalışır. Bundan
dolayı sp’ler derlenen nesnelerden biri
CREATE PROC [ EDURE ] procedure_name
olarak anılır. [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [
SP’ler şu faydaları sağlar: 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ı
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
olan prosedürler sorgulama planları WHERE geldiMi=0 AND VermeTarihi + Ver-
meSuresi < @buGun
procedure tamponcache içinde saklan- GO
--
dığından daha da hızlı çalışırlar. >>The command(s) completed
3. Stored Procedure’ler SQL Server start successfully.
ettikten sonra otomatik olarak çalıştırıl-
mak üzere ayarlanabilirler. Daha sonra bu SP şu komut ile çağ-
4. Stored Procedure’ler harici olarak rılır:
kullanılırlar. Trigger’lardan farklı olarak
prosedürler uygulama tarafından ya da EXEC sp_cezaliUye

script tarafından bir şekilde çağrılmak (Resim 16)


zorundadırlar. Otomatik devreye gire-
mezler.
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

Veritabanı Programlama 2 BYTE 49


DECLARE @buGun DATETIME
SET @buGun = GetDate()
İPUCU: SELECT uyeAdi FROM odunc
Bir SP’nin bittiği yerde go deyimini WHERE geldiMi=0 AND VermeTarihi +
VermeSuresi < @buGun
kullanmak, sp’nizin bittiği yeri tam --
>> The command(s) completed
olarak belirtmenizi sağlayacağından successfully.
istemediğiniz kodların sp ile bir-
likte derlenmesine ve istenmeyen SP’nin yeni halini kaydettirebiliriz.
hatalar meydana getirmesine engel
olur. Bir SP’yi Silmek:
Bir sp’yi artık kullanmayacağımıza
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
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
SELECT uye.Adi,uye.soyadi successfully.
FROM odunc INNER JOIN uye ON uye.UyeNo
= odunc.UyeNo
WHERE geldiMi=0 AND VermeTarihi + SP’ye Parametre Yollama:
VermeSuresi < @buGun
--go burada yer almalı Bazen SP’ler dışarıdan parametre alabi-
EXEC sp_cezaliUye lirler:

SP üstünde değişiklik yapmak: Örnek 30:


Herhangi bir tarih verildiğinde, bu tarihte
sp_helptext sp_adi
Sp_helptext sp_cezaliUye 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 Resim 17

50 BYTE Veritabanı Programlama 2


DECLARE @buGun DATETIME
İPUCU: SET @buGun = GetDate()
Bir çok işlemi kod yazmaksızın yap-
IF (@referansTarih IS NULL) OR
mayı sağlayan Enterprice Manager’i (@referansTarih>@buGun)
SET @referansTarih = @buGun
kullanarak sp’leri de kolayca değiş- SELECT uye.Adi,uye.soyadi
tirebilirisiniz. Bunun için Enterprice FROM odunc INNER JOIN uye ON uye.UyeNo
= odunc.UyeNo
manager ile bir sp’yi seçip çift tık- WHERE geldiMi=0 AND VermeTarihi +
VermeSuresi < @referansTarih
lamak yeterlidir. Go
şeklinde yazabiliriz. Daha sonra
EXEC sp_cezaliUye_2
@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

parametre alamasın. Böyle bir durum diyerek sp’yi çağırabiliriz.

olduğunda, bu günün tarihini versin. Örnek 32:


Kitaplar tablosu üstünde aşağıdaki para-
CREATE PROCEDURE sp_cezaliUye_1
@referansTarih DATETIME metrelere göre arama yapabilecek bir SP
AS yazalım. Parametrelerden gelenler için
DECLARE @buGun DATETIME
SET @buGun = GetDate() filtreleme yapılsın.
IF @referansTarih > @buGun Dışarıdan alınabilecek Parametreler:
ISBNNo, KitapAdi, Ozeti (Resim 18)
SET @referansTarih = @buGun

SELECT uye.Adi,uye.soyadi ALTER PROCEDURE sp_kitapBul


FROM odunc INNER JOIN uye ON uye.UyeNo @ISBNNo CHAR(16) =NULL,
= odunc.UyeNo @KitapAdi VARCHAR(55)=NULL,
WHERE geldiMi=0 AND VermeTarihi + @KitapOzeti VARCHAR(55)=NULL
AS
VermeSuresi < @referansTarih
DECLARE @sSQL VARCHAR(500)
Set @sSQL= ‘SELECT * FROM Kitap WHERE
Bazen dışarıdan gelen parametre- 1=1 ‘
IF @ISBNNo IS NOT NULL
lerin isteğe bağlı olması istenebilir. Bu SET @sSQL = @sSQL + ‘ AND ISBNNo =
‘’’ + @ISBNNo + ‘’’’
durumda DEFAULT değer atama IF @KitapAdi IS NOT NULL
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
Örnek 31: Farklı parametre değerleri ile SP’yi
çağırabiliriz:
CREATE PROCEDURE sp_cezaliUye_2 EXEC Sp_kitapBul @ISBNNo=’12345’
@referansTarih DATETIME = NULL EXEC Sp_kitapBul @ISBNNo=’12345’,
-- dışarıdan referans tarihi gelmedi @kitapAdi=’Yol’
ise, NULL olarak kabul et. ...
AS

Veritabanı Programlama 2 BYTE 51


Resim 18
@sayi3 + @sayi4 + @sayi5) / 5
Bir sp, başka bir sp’yi çağırabilir.
GO

Sp’den Değer Döndürme:


OUTPUT opsiyonu başka bir prosedüre Bu prosedürün döndür-
değer döndürmeye yarar. Yani bir pro- düğü sonucu nasıl alabili-
sedür kendisini çağıran başka bir pro-
sedüre kendi ürettiği bir çıktı değerini
riz?
yanıt olarak verebilir. Bu prosedürdeki ortalama değerini ala-
bilmek için öncelikle bir değişken tanım-
Örnek 33: layıp sonra prosedürü çalıştırabiliriz.
5 adet tamsayı girildiğinde ortalamala-
rını hesaplayıp, OUTPUT parametresi Örnek 34:
ile döndürecek bir sp yazalım: Output olarak tanımlı parametre örnek-
33’te en son parametredir. Daha önce
CREATE PROC ortalayici
@sayi1 smallint, tanımladığımız değişkeni buraya verir-
@sayi2 smallint, sek bu değişkende SP’nin ürettiği değer
@sayi3 smallint,
@sayi4 smallint, döndürülecektir. Değeri görmek için
@sayi5 smallint,
@ortalama smallint OUTPUT daha sonra SELECT komutunu çalıştı-
rıyoruz. (Resim 19)
AS

SELECT @ortalama = (@sayi1 + @sayi2 + DECLARE @sonuc smallint


EXEC ortalayici 1,2,11,20,21,@sonuc
OUTPUT
SELECT ‘ORTALAMA:’,@sonuc
DİKKAT: go
SP’de bir parametre için default
değer tanımı yaparken, bu değerin Prosedürden değer döndürmek için
sabit bir değer veya NULL olması bir başka seçenek olarak RETURN ifa-
gerektiğine dikkat etmelidir. desi kullanılabilir. Bu şekilde OUTPUT
ifadelerini hem prosedür içinde hem

52 BYTE Veritabanı Programlama 2


rında kullanıcıyı uyarmak için kullanı-
DİKKAT: lırlar veya SQL Server’in ileri sürümle-
Bazı durumlarda, SP içerisinde SQL rinde kullanılmak üzere ayrılmışlardır.
ifadesini bir değişkene atamak Kullanıcı, RETURN ile bunlar haricin-
suretiyle durumlara göre dinamik deki (-1 ila –99 haricindeki) değerleri
olarak meydana getirip, daha sonra döndürebilir.
da onu çalıştırabiliriz. Bu durumda Örnek 35:
da EXEC komutu kullanılır. EXEC
CREATE PROC toplayici
komutunun başka nerelerde kul-
lanıldığını öğrenmek için yardım @toplayan smallint,
@toplanan smallint,
menüsünü kullanabilirsiniz. @toplam smallint

AS

SELECT @toplam = @toplayan + @toplanan


de prosedürün çağrıldığı yerde tanım- RETURN @toplam
go
lamak zorunda kalınmadan doğrudan Prosedürü oluşturduktan sonra
değer döndürülebilir. Normal olarak aşağıdaki şekilde dönen sonucu
yakalayabiliriz:
SQL Server 0 ile -99 arasında değerleri
DECLARE @toplamlar smallint
bu şekilde döndürebilir. Bu değerler, EXEC @toplamlar = toplayici 1,11,0
sistem bazlı durumları belirlemek üzere SELECT ‘Sonuç : ‘, @toplamlar

ayrılmış kodlardır. Örneğin sıfır değeri (Resim 20)


prosedürün çalışmasında bir hata oluş-
madığını belirtir. Bu haliyle de elbette Örnek 36:
kullanıcı tarafından da kullanılabilir. Bir kitap ödünç verilmek istendiğinde,
Diğerleri ise muhtelif hata durumla- bu kitabı öncelikle içeride mi diye kont-
rol 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
Resim 19 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
Resim 20
kontrol eden SP’yi oluşturalım: kitap

Veritabanı Programlama 2 BYTE 53


print ‘içerde.....’
INSERT INTO odunc(kitapNo,UyeNo,
içerde ise 1, değil ise 0 döndürüyor. VermeTarihi,vermeSuresi,geldiMi)
(Resim 21) VALUES(@kitapNo,@uyeNo,@vermeTarihi,@-
CREATE PROC sp_kitapIcerdeMi vermeSuresi,0)
@kitapNo SMALLINT END
AS ELSE
declare @sonuc INTEGER BEGIN

IF (SELECT COUNT(*) print ‘kitap dışarda ödünç


FROM odunc verilemedi.....’
WHERE kitapNO=@kitapNo AND geldiMi=0 END
) > 0 Go
SET @sonuc=0
else Test etmek için:
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’,
@uyeNo INT,
@vermeSuresi INT = 15

AS
declare @sonuc SMALLINT
EXEC @sonuc=sp_kitapIcerdeMi @kitap
No=@kitapNo
IF (@sonuc=1)
BEGIN 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 Örnek 37:
veritabanına erişmek için MDACs (ADO, OLE- İşte cezali uyelerimizi Web’de teşhir
DB,ODBC,ADO.NET vs.) için kullanılır. edecek bir ASP-VBScript kodu:
EXEC sp_adi [@parametre=değer,...n] Örneği daha iyi anlamak için daha önce
Böylelikle, T-SQL’in avantajlarını VTYS örnekte oluşturduğumuz sp_cezaliUye SP’sinin
uzayının dışında bir uygulamadan da kulla- tanımına bakınız.
<html>
nabiliriz. Burada anlatılan kodları anlayabil- <head>
mek için VB Script-ASP veya ASP.NET-VB.NET <title>ABC kütüphanesi</title>
<meta http-equiv=”Content-Type”
bilmeniz gerekecektir. Bu konular, takip content=”text/html; charset=
windows-1254”>

54 BYTE Veritabanı Programlama 2


</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;passwor-
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.
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


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
Resim 22 üstünde ilerlenir.
4. Resultset ile ilgili işlemler sona
sp_monitor erdiğinde cursor CLOSE ile kapatılır.
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.
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-
deki cursorler ile aynı işi yapar; metin 1.Cursor tanımlanır:
editörlerinde o an için cursor nerede
DECLARE cursor_adi CURSOR FOR
ise, oradaki verileri baz alan işlemler
SELECT İFADESİ
yapabilirsiniz. Veritabanı sistemlerinde
ise, cursor’ün bulunduğu yerdeki verileri Şeklinde tanımlanır.
yazdırabiliriz.
DECLARE cr_kitapListesi CURSOR FOR
SQL sorgularının sonucunda elde SELECT kitapNo, kitapAdi
edilen kayıtların tamamına resultset FROM Kitap
GO
denir. Bazen bir resultset üstünde gezin-
memiz gerekebilir. Bu tür durumlarda,
Cursor’leri kullanırız. Curserler özetle 2.Cursor açılır:
bir select ifadesinin döndürdüğü result-
OPEN cursor_adi
set’e satır satır erişmeye olanak verir. OPEN cr_kitapListesi
Cursor’leri kullanmak biraz karma- GO

şı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

56 BYTE Veritabanı Programlama 2


FETCH NEXT FROM cursor_adi [INTO Başlıca Sistem Saklı
FROM Kitap
icine_doldurulacak_degisken1 [, ....] go
]DECLARE @kitapNo INTEGER,@kitapAdi
VARCHAR(55)
Prosedürleri
DECLARE @kitapNo INTEGER,@kitapAdi
VARCHAR(55)
Go
FETCH cr_KitapListesi INTO @kitapNo,
@kitapAdi
DDL’e yönelik Sistem sp’leri:
FETCH cr_KitaplarListesi INTO
@kitapNo, @kitapAdi
-- ilk satırın üstüne geldik ve ilk WHILE (@@FETCH_STATUS = 0)
kayıtta yer alan iki değeri yazdırdık. sp_ addtype
BEGIN
print @kitapNo PRINT @kitapNo
print @kitapAdi
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
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-
@@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-
ile gerçekleştirildi. ken işlemler bitmedi.
-1: Bir önceki FETCH komutunda sp_dropkey
bir hata ile karşılaşıldı. 4.Cursor’ı kapatmamız gerekiyor:
-2: Resultsetteki tüm kayıtlar bittiği
sp_rename
CLOSE cursor_adi
için en sona gelindi, daha fazla kayıt yer sp_dbremove
CLOSE cr_kitapListesi
almıyor. (end of resultset)
@@rowcount, bir önceki FETCH sp_renamedb
CLOSE komutu ile sadece bir cur-
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.
Ş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

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’
Resim 23 ELSE
Print ‘içeride’
FETCH NEXT FROM cr_kitapDurumu INTO
@kitapAdi, @Durumu
END
GO
Close cr_kitapDurumu
Deallocate cr_kitapDurumu

(Resim 24)

Ö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:

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:
bırakıp diğerlerini silecek bir Cursor OPEN crKitaplar

oluşturmak gerekir. Varsayalım ki bizim FETCH NEXT FROM crKitaplar INTO


@KitapNo, @tekrarSayisi
de kitap tablomuz üstünde hiçbir indeks WHILE @@FETCH_STATUS=0
alan yoktu ve iki- üç kere aynı bilgiler BEGIN
BEGIN
tekrarladı. (Hatta bazı kitaplar 2, diğer- SET ROWCOUNT @tekrarSayisi
--tekrar sayısının bir eksiği kadar
leri 3 diğerleri n kere ...)Bunları silecek kayıt silinecek
bir Cursor oluşturalım: DELETE FROM Kitap WHERE kitapNo =
@kitapNo
--sonra tekrardan tüm kayıtlar
DECLARE cr_kitapDurumu CURSOR FOR --dikkate alınacak şekilde ROWCOUNT=0
SELECT kitap.kitapAdi,odunc.GeldiMi atanıyor
FROM Kitap SET ROWCOUNT 0
LEFT JOIN odunc ON odunc.KitapNo=Kit- END

58 BYTE Veritabanı Programlama 2


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ık-
tan 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) 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-
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
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.
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
ö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:
denir. Geçerli kabul edilmesi bir dize
işlemlerin tamamının yolunda gitmesine Hesap tablosu
bağlı durumlarda transaction kullanılır. Alanlar:
Transaction bloğu ya hep ya hiç mantığı
HesapNo CHAR(20) NOT NULL PRIMARY KEY
ile çalışır. Ya tüm işlemler düzgün olarak Adi VARCHAR(55)

Veritabanı Programlama 2 BYTE 61


Soyadi VARCHAR(55)
Sube INTEGER COMMIT
Bakiye FLOAT
Sabitleme noktaları:
Genel Yapısı şu şekildedir: Bazen, bir noktaya kadar gelindikten
1.Transaction başlatılır: sonra, işlemlerin buraya kadar olanını
geçerli kabul etmek isteriz ama, bundan
BEGIN TRAN[SACTION] [transaction_adi] sonraki işlemler için de transaction (geri
İ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.
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_
Örnek 44: notkasi_adi

DECLARE @havaleMiktar FLOAT


DECLARE @aliciHesap VARCHAR(20), @gon- Örnek 45:
derenHesap VARCHAR(20)
SET @aliciHesap=’1’ SELECT * FROM hesap
SET @gonderenHesap=’2’ --İlk baştaki hesap durumlarına
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’;
--Kaydetme noktasından sonra bir nolu
hesap silindi
2.İşlem başarılı olursa, COMMIT --yeni durum:
ile transaction bitirilir. Başarısız oldu- SELECT * FROM hesap
ROLLBACK TRAN svp_kaydet;
ğunun anlaşılması haline ROLLBACK --kaydetme noktasına dönüldü(Silinene
hesap geri geldi)
komutu ile transaction başarısız olarak SELECT * FROM Hesap;
bitirilebilir.(Yani en baştaki duruma geri ROLLBACK TRAN ;
--İşte son durum(havale geri alındı,
dönülür) her şey ilk haline geldi.)
SELECT * FROM Hesap;

Örnek 46:

62 BYTE Veritabanı Programlama 2


Kitap tablosu üstünde kilitlemeden seçme Genel kullanımı:
işlemi yapmak için:
CREATE TRIGGER trigger_adi
ON tablo_adi
SELECT kitap.* FOR INSERT [,UPDATE,DELETE]
FROM kitap WITH(NOLOCK) AS
WHERE kitapNo>5 SQL ifadesi

Şeklindedir.
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:
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
ç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-
veri bütünlüğünün korunmasına yardımcı SACTION).
olurlar. Daha önceki veritabanı sistemle- Bir Trigger oluştururken şu durumlara
rinde triggerlar tablolar arası birbirlerine dikkat etmek gerekir:
referans yapan verilerin bütünlüğünü sağ- 1. View ya da geçici tablolar üzerinde
lamak maksadıyla kullanılırlardı (yabancı oluşturulamazlar. Fakat bunlara referans
anahtar zorlayıcısını hatırlayınız). Ancak
SQL Server 6.5’ dan itibaren bu işlem UYARI:
zaten Referantial Integrity tanımlamala- Recursive olarak çalışmazlar. Yani
rıyla sağlandığı için bu maksatla kullanıl- bir tablonun herhangi bir sütununda
maları gereksizdir. yapılan değişiklik üzerine bir trigger
Triggerlar genellikle değişik tablolar çalışıp aynı tablonun başka bir sütu-
üzerinde bulunan ve birbirleri arasında nunda değişikliğe neden oluyorsa
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.

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 Gibi bir cümlecik çalıştırdığımızda,


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. 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-
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.
daha faydalıdır. İhtiyacımız olduğu zaman yeni eklenen
4. İstenirse syscomments tablosunda şifre- değerlere bu tablodan ulaşarak, bu bilgileri
lenmiş tekilde saklanabilirler. tutmak maksadıyla değişken tanımlamak
5. CREATE, DROP, ALTER TABLE, zorunda kalmaktan kurtuluruz. Tablodan
ALTER DATABASE, SELECT INTO bir kayıt silindiğinde silinen kayıt deleted
gibi ifadeler trigger içinde kullanılmazlar. tablosunda saklanır. Update işlemi ise
delete ve hemen ardından yapılmış bir
Örnek 47: insert işlemi olarak ele alınır. Bir kayıt
Ödünç tablosundaki kayıtlar üstünde update edildiğinde orijinal kayıt deleted
değişiklik yapıldığında kaç kaydı etkiledi- tablosuna işlenir, değişen kayıt da inserted
ğini yazan bir trigger oluşturalım: tablosunda (ve ana tabloda) saklanır.
Trigger’lere dışarıdan parametre yolla-
CREATE TRIGGER tr_AffectedRows
ON odunc yamayız. Ancak, INSERTED ve DELE-
TED tabloları sayesinde kısıtlı da olsa,
FOR INSERT, UPDATE,DELETE
AS son işlemden etkilenmekte olan kayıtları
raiserror(‘%d kayıt üzerinde değişiklik
yapılmıştır’, 0, 1, @@rowcount) tespit edebiliriz.
RETURN

64 BYTE Veritabanı Programlama 2


IF(SELECT COUNT(odunc.kitapNo) FROM
odunc,inserted WHERE odunc.geldiMi=0
Örnek 48: AND inserted.kitapNo=odunc.KitapNo)>20
Kitaplardan bir kısmı, ödünç verildiği BEGIN
Print ‘Bu kitabı 20’’den fazla defa
ve gelmediği halde bir başkasına daha ödünç vermişsiniz. Kütüphaneden
çıkaramazsınız.’
ödünç verilmiş görünebiliyor. Böyle bir ROLLBACK TRANSACTION
hata yapılmasını kökten çözmek için bir END

Trigger oluşturalım:
Ö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-
IF(SELECT COUNT(odunc.kitapNo) FROM
odunc,inserted WHERE odunc.geldiMi=0 SQL komutunu yazalım:
AND inserted.kitapNo=odunc.KitapNo)>1

BEGIN sp_helptrigger odunc


Print ‘dışarıdaki kitabı bir başkasına
veremezsiniz..’
ROLLBACK TRANSACTION
END

Bu örnekte verilen durumun içerisin-


den foreign key zorlayıcısı ile çıkılamaya-
cağına dikkat edin. Sonuçta Trigger ve Stored Procedu-
Şimdi odunc üstünde şöyle bir cümle- re’leri karşılaştırırsak, her ikisi de önceden
cik çalıştıralım (1 nolu kitap ödünç veril- derlenmiş SQL ifadeleri olduğundan
miş ve gelmemiş ise): hemen hemen aynı hızda ve aynı külfet
miktarına sahiptirler. SQL Server’ iın
INSERT INTO odunc(kitapNo,uyeNo,
vermeTarihi,VermeSuresi,GeldiMi) VALUE işlem sırası, önce View ve Stored Proce-
S(1,1,’01.01.2003’,15,0) dure’ leriı sonra Trigger’ları çalıştıracak
--
>> dışarıdaki kitabı bir başkasına şekildedir. Daha iyi performans elde
veremezsiniz..
etmek için mümkün olduğu kadar trigger
mesajı gelecektir. seviyesine inilmemeye gayret edilmelidir.
Trigger’ler, uygulamaya özgü kuralları Eğer problemi,Zorlayıcılar seviyesainde
veritabanı sisteminin bir parçası olarak yakalayabiliyorsak bu seviyede, stored
tayin etmek istenildiğinde de kullanılır: procedure içinde yakalayabiliyorsak sp
seviyesinde o da olmuyorsa, trigger seviye-
Örnek 49: sinde yakalamak gerekir. Sp ile yakalanan
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

Veritabanı Programlama 2 BYTE 65

You might also like