Professional Documents
Culture Documents
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
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
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
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
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:
Ö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
Ö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’
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ı
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
AS
AS
declare @sonuc SMALLINT
EXEC @sonuc=sp_kitapIcerdeMi @kitap
No=@kitapNo
IF (@sonuc=1)
BEGIN Resim 21
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”>
Örnek-38:
İşte aynı işlemi yapacak ASP.NET-VB.NET kodları:
şı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
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
open cr_kitapDurumu
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
(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.
Örnek 46:
Ş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.
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