VERİ TABANI YÖNETİM SİSTEMİ 2

Benzer belgeler
VERİ TABANI YÖNETİM SİSTEMİ 2

//bu ifadelerin ikisi de gerçekleşiyorsa havale işlemi gerçekleşmiştir fakat 1 tanesini çalışmazsa havale olmamıştır.

EXISTS VE NOT EXISTS fonksiyonları

PostgreSQL ve PL/pgSQL

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

PostgreSQL ve PL/pgSQL

SQL TRIGGERS (Tetikleyiciler)

ORACLE DA KÜRSÖRLER. Gerekli sistem değişkenleri

Cursor. Bir veri tipi olarak da ele alınabilen Transact-SQL Sunucu Cursor şu aşamalardan geçirilerek kullanılır.

-- işareti tek satırlık açıklamalarda kullanılır. Açıklama olarak yazılan satırın önüne konulması yeterlidir.

Bir çeşit prosedür. Ancak bu prosedür kendiliğinden çalışır. Çalışması için tabloya veri eklemek, veri silmek, veri değiştirmek yeterlidir.

«BM364» Veritabanı Uygulamaları

T-SQL NEDİR? Microsoft T-SQL Transact-SQL

STORED PROCEDURE LER (Saklı Yordamlar)

VERİ TABANI YÖNETİM SİSTEMLERİ II. 5. SQL PROGRAMLAMADA CURSOR (İMLEÇ) ve TRIGGERS (TETİKLEMELER)

5 SQL- Yapısal Sorgulama Dili. Veritabanı 1

SQL PROGRAMLAMA. Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir.

TRIGGER. Trigger lar, tablo üzerinde tanımlanabilen ve bu tablo üzerinde bir işlem gerçekleştiğinde tetiklenen programlama ögeleridir.

Üst Düzey Programlama

8 Oracle da tablo yapısı içinde otomatik artan kolon yoktur. (identity kolon

Veri Tabanı SQL Server ve Management Studio kurulum linkleri:

Veri Tabanı Hafta Dersi

SAKLI YORDAM (Stored Procedure) Sibel Somyürek

Veritabanına Uygulanması

Yukarıdakilerden hangileri DML (Data Manipulation Language) ile gerçekleştirilir?

Oracle da kullanılan veri tipleri:

SORGULAR. Öğr.Gör.Volkan Altıntaş

2- Total de 8000 byte yer tutup 4000 karakter olarak kullanabildiğimiz tip aşağıdakilerden hangisidir?

SQL Komutları (2) Uzm. Murat YAZICI

TESİ. indeks. söylenebilir?? bir ilişkidir d) Hiçbiri. veya somutlaştırılmış. düzeyidir? sağlayabilir? sına. d) Hepsi. olabilir? c) Verilerin d) Hepsi

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

SORGULAR VE ÇEŞİTLERİ II

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

Bölüm 4: DDL Veri Tanımlama Dili

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir. Çok satır dönerse hata verir.

KULLANICI TANIMLI FONKSİYONLAR (Devam)

Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language)

Kullanıcı tanımlı fonksiyonlar SQL2000 ile gelen özelliklerden biridir. Fonksiyonlar tek bir değer veya tablo döndürmek için kullanılır.

Veri Tabanı ve Yönetimi

Fonksiyonlar istenilen deger tipinde dönüs yapabilir. INT, VARCHAR deger döndürebileceğiniz gibi bir tablo da döndürebilirsiniz.

VERİ TABANI ve YÖNETİMİ

3. Hafta Tablo İşlemleri BPR255 Veritabanı. Bu Derste Öğrenecekleriniz: 1. Tablo İşlemleri Kısıtlamalar (Constraints)

SQL e Giriş. Uzm. Murat YAZICI

KULLANICI TANIMLI FONKSİYONLAR (Devam)

Data Programming SQL Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

KULLANICI TANIMLI FONKSİYONLAR

3. Hafta Tablo İşlemleri BPR255 Veritabanı Yönetim. Bu Derste Öğrenecekleriniz: 1. Tablo İşlemleri

VERĐTABANI YÖNETĐM SĐSTEMLERĐ

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır.

VERİ TABANI YÖNETİM SİSTEMLERİ II. 3. SQL PROGRAMLAMA BLOKLARI ve AKIŞ DENETİMİ

TEMEL SQL SORGU ÖRNEKLERİ. Yukarıdaki sorguyu yazıp çalıştırdığımızda db_market adında bir veritabanı oluşturulur.

20461C Querying Microsoft SQL Server Modül Seviye Belirleme Testi

BÖLÜM -6: VERİLERİ DEĞİŞTİRMEK

Sayfa 1 / 8. Tabo yapıları

T.C GAZİ ÜNİVERSİTESİ BİLİŞİM ENSTİTÜSÜ YÖNETİM BİLİŞİM SİSTEMLERİ ANA BİLİM DALI MS SQL KOMUTLARI VE MS SQL KOMUTLARI İLE İLGİLİ UYGULAMALAR

«BM364» Veritabanı Uygulamaları

Mysql Veritabanı Komutları

Veritabanı Tasarımı. Kullanıcı Erişimini Kontrol Etme

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

Veritabanı sistemlerinde veri bütünlüğünü sağlayabilmek için CONSTRAINTS olarak adlandırılan bazı zorlayıcı ifadeler kullanılabilir.

Veri Tabanı II Alt Sorgular

VERİ TABANI ve YÖNETİMİ

SQL Stored Procedure

Veri Tabanı Programlamaya Giriş

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

Aşağıdaki tabloyu inceleyin. Sorgulama işlemlerini bu tabloya göre yapacağız.

Maltepe Üniversitesi Bilgisayar Mühendisliği Bölümü Veri Tabanı ve Yönetimi (BİL 301)

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir, aksi durumda hata olur.

Nesneler üzerinde değişiklik yapmak için kullanılır. Veri tabanındaki nesnelerin oluşturulabilmesi için CREATE komutu kullanılır.

SQL Deyimleri. Öğr.Gör.Volkan ALTINTAŞ Volkanaltintas.com

Microsoft SQL Server Sorgulama

SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır.

Veritabanına Giriş. Oğuzhan Ceylan. 19 Eylül 2011

Veritabanı Tasarımı. Sütun Değerlerini Güncelleme ve Satırları Silme

Tablolar Arası İlşikiler ve Alan Özellikleri Siparis.musteri_no musteri.musteri_no Siparis.urun_kodu musteri.urun_kodu

Android Ders Notları

COMMIT: Oluşturulan transaction işlemi başarılı bir şekilde gerçekleştiğinde yapılan değişikliklerin veritabanına kalıcı olarak aktarılmasıdır.

ACCESS PLATFORMUNDA SQL

Aşağıdaki tabloyu inceleyin. Yeni kayıt girme, var olan bir kaydı silme veya güncelleme işlemlerini bu tabloya göre yapacağız.

Ders Tanıtım Sunumu. Database Managegement II. Elbistan Meslek Yüksek Okulu Güz Yarıyılı. Öğr. Gör. Murat KEÇECĠOĞLU

Güz Yarıyılı MT 487 Bilgisayarda Veri Yapıları Final Çalışma Soruları

YAPISAL SORGULAMA DİLİ (SQL)

ASP.NET CLASS KULLANARAK VERİTABANI İŞLEMLERİ

VERİTABANI. SQL (Structured Query Language)

Tavsiye Edilen Önhazırlık Temel SQL Server 2000 bilgisi edinmek.

SUNGURLU MESLEK YÜKSEKOKULU 5. T-SQL

EBE-368 Veri Tabanı Yönetim Sistemleri İlişkisel Model (The Relational Model)

08221 Veri Tabanı II. Elbistan Meslek Yüksek Okulu GÜZ Yarıyılı Eki Öğr. Gör. Murat KEÇECĠOĞLU

DĐNAMĐK ve STATĐK SQL KULLANMANIN PERFORMANSA ETKĐSĐ

Tetikleyiciler (TRIGGER) Tetikleyiciler ne zaman kullanılırlar. Ardı Sıra Tetikleyiciler (After Triggers) Örnek

SQL Kod ile Tablo Oluşturma

BİLİŞİM TEKNOLOJİLERİ

Tavsiye Edilen Önhazırlık Temel veritabanı kavramlar hakkında bilgi sahibi olmak. Hedefler Temel veritabanı güvenlik işlemlerini gerçekleştirebilmek

1.adım : Sql serverda Stored procedure oluşturmamız gerekiyor. Şu adımları izliyoruz.

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler

SQL'e Giriş. SELECT Deyimi. SQL Komutları. Yardımcı Deyimler

VERİ TABANI NEDİR A. TABLO OLUŞTURMA

Cybersoft Bilişim Teknolojileri Sunucu Tarafı Programlaması Kursu Final soruları. Tarih: 27 Kasım 2010 Saat: 13:30 Süre: 3 saat

İLERİ VERİTABANI SİSTEMLERİ SUAT ÜSTKAN

Transkript:

VERİ TABANI YÖNETİM SİSTEMİ 2 Transaction: Birden fazla sql komutunun kullanımıdır. Transaction, özet olarak daha küçük parçalara ayrılamayan işlem demektir. Özellike bir grup işlemin arka arkaya gerçekleşiyor olmasına rağmen, seri işlemler halinde ele alınması gerktiğinde kullanılır. Transaction bloğu içerisindeki işlemlerin tamamı gerçekleşinceye kadar hepsi gerçekleşmemiş varsayılır. Update hesaplar set bakiye=bakiye-1500 where hesap_no=123456 Update hesaplar set bakiye=bakiye+1500 where hesap_no=789123 Commit: Kalıcı kayıt etme işlemi. Ancak kodda bir hata varsa başa döndürüyor kaydetmiyor. Rollbackten tek farkı komut derleme işlemini de yapmasıdır. Roolback: Yapılan işlemi geri almak. (iptal etmek) Eğer ki hesap numarasını yanlış yazmışsak rollback sayesinde işlemler iptal olur. En başa döndürüyor. En baştan itibaren iptal ediyor (doğru işlemi de) Yani -1500 işlemindeki hesap nosu doğru olsa da onu da iptal ediyor. Transaction log: Sql de yaptığımız tüm işlemler sırasıyla burada kaydediliyor. Bu bizim dosyamız. Start transaction: ISBN K_Adi Y_Tarih S_Sayisi 100690 Alritma --- 250 100691 VTYS --- 420 Create table kitaplar (ISBN int, K_Adi varchar(45),y_tarih Date, S_Sayisi int); Start Transaction Update kitaplar Set S_Sayisi=0 Update kitaplar Set K_Adi= deneme Select*from kitaplar Rollback Bu kod sayesinde güncelleme işlemi yapacak ve select sayesinde görüntüleyecek. En son rollbackle bütün yaptığı işlemleri geri alacak. Burada yazdığımız Start Transaction kodu transaction işlemini başlatıyor. Bu sayede Roolback komutunu gerçekleştirebiliyoruz. Transaction Genel Yapısının Akış Diyagramı

Transaction başla SQL ifadeleri Hata varsa Rollback Commit Hata yoksa Savepoint: En başa değil de istediğimiz yere döner. Kayıt yaptığımız yerlere döner. Sistem geri yükleme mantığındaki gibi çalışır. Commit/Rollback to savepoint_ismi Transaction Ve Savepoint in birlikte Çalışma Alritması

Transaction başla Savepoint A SQL ifadeleri Hata varsa Rollback A Hata yoksa Savepoint B SQL ifadeleri Hata varsa Rollback B Hata yoksa Commit Start Transaction Savepoint deneme Update kitaplar Set S_Sayisi=0 where ISBN=123456 Select*from kitaplar Rollback to deneme Select* from kitaplar Update kitaplar set K_Adi= Deneme Select* from kitaplar Rollback Select * from kitaplar Savepoint kayıt noktasıdır. Yukarıdaki kodlarda deneme adında bir kayıt noktası oluşturulmuştur. Bu işlemden sonra oluşturulan kayıt noktasına rollbackle dönüşler yapılmıştır. Bu kodlarda stransaction başlatılmış deneme adında bir kayıt noktası oluşturulmuştur. Sonrasında update işlemiyle sayfa sayısı sıfırlanmıştır. Sonrasında yapılan rollback işlemiyle kayıt noktasına dönülmüştür. Yani sayfa sayısı ilk Normalde kodda bu kadar Select ifadesi yoktur. Buradaki selectlerin anlamı yapılan her işlemden sonra kontrol ettir. Yani işlemi yapıp son hali görüntüler.

haline dönmüştür. Devamındaki update işlemleriyle de aynıları yapılmıştır. Ancak sondaki rollbacke to deneme demediğimiz için en başa dönecektir. Bir dönüş noktası yoktur. Tüm işlemleri geri alır. Kısacası Savepoint sayesinde bir kayıt noktası oluşturulur ve bu kayıt noktasına istediğimiz gibi dönüş yapılır. Transact SQL(T-SQL) Değişken Tanımlama: Sayi int, İsim varchar(20) Declare @degisken_adi, Veritipi() Declare @Sayi int Declare @isim varchar(20) Örnek-1: Declare @sayi1 int, @sayi2 int, @toplam int Set @sayi1=10 Set @sayi2=20 Set @toplam=@sayi1+@sayi2 Bu örnekte üç adet sayısal türde değişken tanımlanmıştır. Daha sonra değişkenlere SET ifadesiyle değer ataması yapılmıştır. Son satırda da görüldüğü gibi değişkenlere atanacak değerler sabit olabileceği gibi diğer değişkenlerden de elde edilebilir. Örnek-2:Declare @enyuksekmaas MONEY Select @enyuksekmaas=max(maas) from personel ***Örnek1 de sanal tablo üzerinden sayılar üretilip işlemler yapılmıştır. Ancak örnek 2 de hazır tablo üzerinden en yüksek maaşı kisi bulmuştur. declare @deneme TABLE( nu int identity(1,1), ad varchar(50)); output alinacak_sutunlar into aktarilacak_sutun output kullanımının içinde inserted ve deleted kavramları var. İnserted ile ekleme işlemlerini deleted ile silme işlemlerini yönetiyoruz. tablo değişkenini tanımlayalım declare @eklenenler table( ad varchar(20), soyad varchar(30), maas int) yeni eklenen kaydı output işlemiyle eklenenler değişkenine ekleyip göstereceğiz. insert into personel output inserted.ad, inserted.soyad, inserted.maas into @eklenenler values(10,"egemen","tekkanat",2300) (11, erdem, tekkanat,3000)

sonunda eklenenleri bu şekilde görüntüleyelim. select*from @eklenenler Personel tablosundan silme işlemi için; declara @silinenler table( ad varchar(20), soyad varchar(30), maas int) insert into personel output deleted.ad, deleted.soyad, deleted.maas into @silinenler values(10,"egemen","tekkanat",2300) select*from @silinenler KOŞUL İFADELERİ if koşul1 koşula bağlı kod else if koşul koşula bağlı kod else kod bloğu Örnek: if (select min(maas) from personel)>1500 print "maaşı 1000 den büyük olan personel yok" else select ad,soyad,maas from personel where maas<1500 if exists(select*from personel where maas>2000) print maaşı 200den büyük personel var sorgu sonucunda bir sonuç çıkıyorsa true çıkmıyorsa false değerini alır!!! ***Use ifadesi sayesinde kullanılacak veritabanı seçimi yapılmaktadır.

Use veritabani_adi use egemen declare @k_sayisi varchar(25) select @k_sayisi=count(*) from kitaplar if(@k_sayisi<=5) begin print kitap sayisi +@k_sayisi print yetersiz kitap sayisi else if (@k_sayisi>5 and @k_sayisi <=10) begin print kitap sayisi +@k_sayisi print Yeni kitaplar gerekli else begin print kitap sayisi +@k_sayisi print yeterli kitap sayisi Case ifadesi case kontrol edilecek değer when aldığı değer then değer1 when aldığı değer2 then değer2... else deger_n use egemen select ad,soyad,notu case when notu>84 then 5 when notu>69 then 4 when notu>54 then 3 when notu>44 then 2 when notu>24 then 1 else 0 use egemen select ad,soyad,cinsiyet =

case cinsiyet when "1" then "erkek" when "2" then "bayan" from personel ***Buradaki eşittir işareti ve caseden sonra gelen cinsiyet ifadesi case neye göre yapacağım sorusunun cevabıdır. use egemen select ad,soyad,rev,maas from personel order by case rev when "teknisyen" then maas desc case when rev "mühis then maas Burada iki farklı sütuna göre sıralama söz konusudur. İlkinde teknisyenlerin maaşlarını azalan sıralamada. Sonrasında mühislerin maaşını artan sıralamada sıralayacakır. Bu sıralamada önce ilk koşul göz önünde bulundurulacak sonra diğeri önemsenecektir. Update işlemi use egemen update personel set maas=( case when maas<1000 then maas +((maas*20)/100) when maas>=1000 and maas <2000 then maas +((maas*15)/100) else maas + ()maas*10)/100) ) begin tekrarlanması gereken işlemler için kullanılır. Fakat tek bir komut satır var ise begin e gerek yok. Tekrarlanmasını yani sürekli dönmesini istediğimiz komutları buna yazıyoruz. declare @sayac int set @sayac= while @sayac<=5 begin print cast(@sayac as varchar(20))+"karesi"+ cast(@sayac*@sayac as varchar(20)) set @sayac=@sayac+1

***Buradaki cast tür değiştirme işlemi yapar. (varchar ataması) declare @sayac smallint set @sayac=1 yenile print "sayac degeri:"+cast(@sayac as varchar(10)) set @sayac=@sayac+1 while @sayac=4 to yenile ***Burada sayaç 4 olana kadar yenile işlemine geri dönecektir. RETURN İFADESİ Declare @deger int Declare @deger2 int Set @deger2=123 if @deger is NULL begin print "deger degiskeni NULL" Return else begin print @deger if @deger2 is not null print @deger2 WAITFOR Delay: Parametre olarak verilen zaman kadar sonra çalıştırır. Bekleme demektir. TIME: Parametre olarak verilen zamanda çalıştırır. Belli bir saattir. Waitfor time 16:20:00 //Bu saate kadar kodlarımı çalıştır. Waitfor delay 01:30:00 //Kodlarımı bu kadar saat sonra çalıştır. select *from sys.messages Bu komut sistem mesajlarını sıralar. Hangi kod ne işe yarıyor onu söyler. Buradaki return ifadesi programı sonlandırmayı sağlıyor. Yani burada null değer içeriyorsa program sonlandırılıyor. Try Catch Yapısı begin try sql ifadeleri try begin catch hata oluştuğunda yapılacak işlemler catch ERROR_NUMBER () Oluşan hatanın kodu ERROR_SEVERİTY () Hatanın önem derecesi ERROR_LİNE () hatanın meydana geldiği satır ERROR_MESSAGE () oluşan hatanın tanımı create database deneme şeklinde kod ile database oluşturabildiğimiz gibi şu şekilde de oluşturabiliriz.

Tablo oluşturmak içinse aşağıdaki kodları kullanabiliriz. create table ogrenci (id int,ad varchar(20),soyad varchar(20)) Ya da şu şekilde yaratabiliriz. Bu tabloya veri eklemek içinse insert into ogrenci(id,ad,soyad) values('1','egemen','tekkanat') insert into deneme.dbo.personel(id,ad) values('1','egemen') kodlarını kullanabiliriz. Yada;

Buradan ekleyebiliriz. Try catch yapısını şu şekilde kullanabiliriz. Örnek: begin try select 1/0 try begin catch select ERROR_NUMBER() as hata_no, ERROR_SEVERITY() as hata_önceliği, ERROR_LINE() as hata_satiri, ERROR_MESSAGE() as hata_mesajı catch bu kodları çalıştırdığımız da şu ekran çıktısını alacağız. Yukarıdaki örnekte sütun isimlerini kimiz belirliyoruz. begin try select * from ersonel try begin catch print 'hata mesajı:'+ Error_message() catch Bu örnekte ise sistem ki atıyor. create table urunler1 (urun_no int not null primary key, ad varchar(20)) create table fiyat1 (urun_no int null, fiyat money null) alter table fiyat with check add constraint FK_fiyat_urunler1 foreign key(urun_no)

references urunler1(urun_no) bu kodları yazıp çalıştırdığımızda tablolarımızı yaratmış oluruz. insert into urunler (urun_no,ad) values('1','bilgisayar'), ('2','Televizyon'), ('3','Tablet') insert into fiyat1(urun_no,fiyat) values('1','2000'),('2','1500'),('3','1800') Bu kodlarımızla da tablomuza verilerimizi ekliyoruz. delete from urunler1 where urun_no='3' bu kodlarla silmeye çalışıyoruz. Ancak foreign keyle diğer tabloyla ilişkisi olduğu için önce onu silmemizi söyleyen bir hata veriyor. Ancak kodları şu şekilde yazdığımızda hatayı açıkça belirtecektir. begin try declare @urunno varchar(20) set @urunno=3 delete from urunler where @urun_no=@urunno try begin catch if error_number()=547 print 'öncelikle'+@urunno+' nolu ürünün fiyat bilgisini siliniz' else print error_number() catch Bu hatayı kaldırmak içinse güncelleme işlemi yapacağız. Bunu da şu şekilde yaparız; begin transaction save transaction basla update urunler set ad='deneme' rollback transaction basla commit update urunler set urun_no='10' rollback commit Burada update işlemi doğruysa aşağıdaki update işlemine geçer. Ama yanlışsa rollback sayesinde basla işlemine geri döner. begin try begin transaction begin try begin transaction save transaction basla update fiyat set ad='bilgisayar'

commit try begin catch rollback transaction basla print 'hata 1. güncellemede'+ error_message() catch update fiyat set fiyat='10554' commit try begin catch rollback print 'hata 2. güncellemede'+error_message() catch İki update işlemini iki try catch ile yaptık. Tek try catch ile yapılamadı. 30.10.2013 Değişkenlerden ve diğer sql ifadelerinden elde edilen değerlere göre değerlenen komutlara dinamik sql ifadeleri diyoruz. Declare bildirmeye yarıyor. Birincisi tek bildirmelerde işe yaramaktadır ancak ikincisi birden fazla sorgu yaratmada işe yarar vce daha kullanışlıdır. 1---declare @tablo varchar(20) set @tablo='dersler' //varolan dersler tablosunu @tablo parametresiyle birleştirildi. execute ('select * from ' + @tablo) //çalışcak kodu yazdık veya select*from dersler 2---declare @tablo varchar(20) declare @sorgu varchar(20) set @tablo='dersler' set @sorgu 'select * from' +@tablo execute(@sorgu) //çalışacak parametreyi yazdık ('select * from ' + @tablo) ve select*from dersler aynı işlemi yapmaktadır. PROSEDÜRLER (YORDAM) Bir tane prosedür oluşturuyoruz. Değerlikten sonra çalışmaya başlıyor. Tek tek yapmaya gerek yoktur. Her defasında prosedürleri yaratmaya gerek yoktur. Bir defa yaratmak yeterlidir.

Buradaki klasörün içinde sistemin ki atadığı bir sürü prosedür vardır. (sp=system Prosedures) sp_addtype sayisal1, int create table btbs(id sayisal1) Bu bir tip atamadır. burada sayisal1'e integer vermiş oluyoruz. Sonrasında int yerine sayisal1 kullanabiliyoruz. Sp_addtype veri tipi atamak için kullanılır. sp_addmessage 50001,16, 'otomatik artan sütun için değer girişi yapılmış' Burada hata mesajlarını verdirtiyoruz. Artık 50001 nolu hata için bu mesajı verecektir. sp_detach_db deneme eklemeyi kaldır demektir. Sql kullandığımız sunucudan bunu kaldırır. Yani artık böyle bir veri tabanı yoktur. Eklemek içinse; sp_attach_db @dbname='deneme' @filename1= 'C:\deneme_data.mdf' @filename2= 'C:\deneme_log.ldf' Varolan bir veri tabanını servera ekler. Database konfigüre ediyor yani ayarlıyor. sp_configure 'user options',5 sp_configure 'remote access',0 uzaktan prosedürlerime erişim için 0 yaparsam engellerim 1 yaparsam izin veririm. sp_addlogin 'egemen',12345 sp_adduser 'egemen1' burada egemen adında bir kullanıcı oluştururuz Kullanıcı oluşturduktan sonra şu adımları izleriz.

Burada kullanıcılarımız gözükmektedir. Üzerine tıklayıp Roller kısmından rollerini belirliyoruz.

User Mapping alanındansa kullanacağımız veri tabanlarını seçeriz. Bizim bir de genişletilmiş prosedürlerimiz var. Farklı diller için kullanılan dll lerdir.

sp_configure 'show advanced options',1 reconfigure sp_configure 'xp_cmdshell',1 reconfigure cmdshell:veritabanıyla birlikte komut ekranının kullanımının açılmasıdır. Burada sql serverın içinde msdos komutlarının kullanılmasına izin veriyoruz. xp_cmdshell 'dir C:' //C deki bütün dosyalarımı alt tarafta listeler. cp_cmdshell 'mkdir C:\deneme2' alt dizin oluşturur. xp_fileexist 'C:\deneme.mdf' deneme adında veritabanının olup olmadığını kontrol eder. xp_create_subdir 'C:\deneme2' deneme2 adında bir klasör oluşturur. C'nin içine Ki prosödürümüzü oluşturmak için bu adımları izleriz. CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> AS BEGIN //Buraya oluşturacağımız prosedür komutlarını yazıyoruz. END GO Karşımıza gelen ekranı uygun şekilde dolduruyoruz. Bu karşımızdaki kod ekranına sağ tuş yapıp şu işlemi yapıyoruz.

Burada oluşturduğumuz tablolarımız çıkıyor. Bunların arasında ilişkileri kurarak otomatik olarak prosedürleri oluşturuyoruz. Yukarıdaki alanları kisi otomatik olarak dolduruyor. remove database egemen database ekledik sp_dbremove egemen database kaldırdık. (öğrenci tablosuna ders ıd diye bir kolon ekledik ) Alter table öğrenci Add ders_id int Select *from öğrenci PROSEDÜR YARATMA EL İLE: Create procedure ogr_ders (@ogr_ad varchar(20), @ogr_soyad varchar(30)) with encryption,recompile (şifreleme yapar sadece şifreyi yazan üzerinde değişiklik yapma hakkı verir diğerlerinde modifine seçeneği çıkmaz)(recompile:her çalıştığında derleme yapmasını sağlar) As Begin SELECT dersler.ders_id, dersler.ders_adi, ogrenci.soyad, öğrenci.ad, drsler.ders_hoca FROM dersler INNER JOİN öğrenci ON dersler.ders_id= öğrenci.ders_id Where (öğrenci.ad=@ ogr_ad) and(öğrenci.soyad=@ogr_soyad)

End Go (dizayna gelip tabloları seçtik ders ıd ler ile 2 tabloyu(dersler,öğrenci) birleştirdik.) PROSEDÜR SİLME Drop procedure dbp.dersler_student1 (prosedür silme) VAROLAN PROSEDÜRE ŞİFRE EKLEME Alter procedure Ders_Student1 With encryption As Begin End Go 06.11.2013 create procedure kitap_ekle (@kütüphane varchar(30)=null,@isbn varchar(30)=null) //3tane parametre tanımladık declare @kutuphane_no int set @kutuphane_no=null select @kutuphane_nokutuphane_no from kutuphane where kutuphane_ismi=@kutuphane //kütüphane ismi ile @kütüphane parametresini birbirine eşitledik if @kutuphane is null or @isbn is null //ikiside bos degılse 0 döndürecek return 0 else if @kutuphane is null or not exists //doluysa isbn yi @isbn parametresine eşitleyecek (select * from kitaplar where isbn=@isbn) begin print 'belirtilen kitap veya kütüphane bulunmadı' return 0 else if exists(select * from kitap_kütüphane where kutuphane_no=@kutuphane_no and isbn=@isbn else insert into kitap_kütüphane values(@kutuphane_no,@isbn,1) Aşağıdaki iki programda aynı işi yapmaktadır. Biri outputlu biri returnlu halidir. output=ortalamayı ekranda göstermek içindir. create procedure ortalama2 (@a int=0,@b int=0, @ort decimal(10,2) output) as set @ort=(@a+qb)/2 declare @sonuc decimal(10,2) exec ortalama3 40,27,@sonuc output print ('Ortalama: '+cast(@sonuc as varchar(50)))

Output kullanarak sonucu çıkış parametresi yaptık. create procedure orta (@a int=0,@b int=0) as return(@a+@b)/2 declare @sonuc decimal(10,2) exec @sonuc=orta 411,24 print('ortalama: ' +cast(@sonuc as varchar(50))) exec derleme işlemi yapar. create procedure kitap_bul (@isbn varchar(30)=null, @kitap_adi varchar(30)=null output, @y_tarihi smalldatetime output, @s_sayisi int output) as if @isbn is not null select @kitap_adi=kitap_adi @y_tarihi=yayın_tarihi @s_sayisi=sayfa_sayisi from kitaplar where isbn=@isbn else print 'isbn degeri bos' //sadece ekranda output olanları gösterecek. Yanında output olanları gösterecek ama olmayanları göstermeyecek. İsbn yi göstermeyecek çünkü outputu yok.

Bu şekilde kimiz yeni bir fonksiyon yaratabiliyoruz. Şimdi biz upper (parametrelere girilen değerşeri büyük harfe çevirme) fonksiyonunu kimiz yazacağız. create function buyukharf(@gelen varchar(max)) returns varchar(max) as begin return upper(@gelen) Şimdi bu fonksiyonu kullanmayı gösterelim. select dbo.buyukharf(adi) from kitap //bizim yazdığımız fonksiyon select upper(adi) from kitaplar //sistemde varolan fonksiyon İkisi de aynı işlemi yapacaktır. create function k_sayisi(@gelen isbn varchar(max)) returns int //fonksiyon sonucunda hangi tipte veri döndüreceğini gösterir. Yani int as begin declare @kitap_sayisi int select @kitap_sayisi=sum(miktar)//kitap sayısını miktarın toplamı olarak aldık. from kitap_kütüphane where isbn=@gelen_isbn return @kitap_sayisi create function k_bul(@k_adi varchar(30)) returns table

as //kitap sütunu gelecek ve select ile gelenler burada listelenecek. return (select kitaplar.k_adi from kitaplar where isbn=kitap_yazar.isbn) as "kitap" from kitap_yazar where yazar_no in //yazarın no sunu girdiğimizde yazarın yazdığı tüm kitapları gösterecek. Yazar no da isbn ye göre gelecektir. ( select yazar_no from kitap_yazar where isbn=(select isbn from kitaplar where kitap_adi@k_adi Bu tablo sonuçlu fonksiyondur. Bu yüzden returns'den sonra table ifadesini kullandık. Bunda select ifadesi olacak ve bunun sonucunu döndürecek. create function emanetci @isbn varchar(30) /*geri dönecek olan tabloyu oluşturuyoruz*/ returns @uye_emanetci table( u_no int, uye_adisoyadi varchar(30), k_adi varchar(30) e_tarih smalldatetime, t_tarih smalldatetime, telefon varchar(40)) as begin /*gelen bilgilere göre emanet bilgilerini tablo değişkenine ekleyecek*/ emanet insert into @uye_emanetci(u_no,k_adi,e_tarih,t_tarih) select uye_no select kitap_adi from kitaplar where kitaplar.isbn=emanet.isbn), emanet_tarihi,teslim_tarihi from where isbn=@isbn update @uye_emanetci set uye_adisoyadi=(select uye_adi + ' '=+uye_soyadi from üyeler where üyeler.uye_no=u_no), telefon=(select telefon from üyeler where üyeler.uye_no)=u_no) return İMLEÇ (CURSOR) NEDİR? Transact SQL'de, SELECT sorguları bizlere sonuç kümeleri, yani tablolar geriye döndürürler. Bu çoğunlukla bizim işimizi görecek niteliktedir. Ancak kimi zaman elde ettiğimiz sonuç kümesi içinden bazı satırları alarak işlem yapmak mecburiyetinde kalabiliriz. Örneğin şu senaryoyu düşünelim:

Düzgün (alfabetik veya sayısal) bir şekilde sıralanmamış bir tablomuz olduğunu varsayalım.bu tablonun 17.satırındaki bir bilgiye ihtiyacımız olduğunda bu bilgiyi nasıl çekebiliriz? SELECT sorguları, bizlere belirlenen mantıksal kriterlere göre bilgiyi daraltma şansı verirler. Ancak bu daraltma işlemi sonucunda oluşan sonuç kümeleri, sorgu için bir bütün(birim) teşkil eder ve bu şekilde değerlirilir. Bize; oluşan sonuç kümelerinde gezintiler yapma ve sonuç kümesindeki her bir satıra ayrı ayrıerişebilme olanağını, imleç (cursor) denilen nesneler verir. İmleçleri kullanmanın iki yöntemi bulunmaktadır: Transact - SQL Veritabanı bağlantı arayüzleri (ADO, OLE DB, ODBC, DB-Library) Bu iki yöntemden herhangi birini tercih ederek imleçleri kullanmak olanaklıyken, bu yöntemlerin birlikte kullanımına izin verilmemektedir. (Makalede, T-SQL imleçleri temel alınmıştır.) İmleçlerin en önemli özelliklerinden biri de; (farklı türlere destek vererek) veri ekleme, güncelleme ve silme işlemlerine sınırlar ve farklı anlayışlar getirmesidir. Bu konu ve imleç türleri, imleçlerle ilgili bir sonraki makalemde işlenecektir. İmleçler, bize çok esnek programcılık olanağı sunmaktadır. Ancak bu olanağı sağlarken çok yüksek boyutlarda sistem kaynağını tüketmekte ve özellikle tempdb veritabanını yoğun olarak kullanmaktadır. Bu nedenle imleçler, yalnızca gerekli durumlarda kullanılmalıdır. İMLEÇLERİN KULLANIMI İmleçlerin yaşam süreci, aşağıdaki aşamalardan oluşmaktadır. Bir sonuç kümesine dayanarak (ve tabii ki türünü de düşünerek) imleci oluşturmak Oluşturulan imleci açarak, imlecin temelinde bulunan T-SQL sorgusunun canlanmasını sağlamak Açılan imleci kullanarak kayıtlar arasında dolaşmak Açılan imleci kullanarak belirli kayıtlarda düzenleme (güncelleme ve silme) işlemleri gerçeklemek İmleci kapatmak İmleci yok ederek, kullandığı kaynakları geri vermek İmleç tanımlaması yapmak için gereken Transact SQL kodu aşağıdaki şekildedir. DECLARE CalisanImleci CURSOR FOR SELECT FirstName, LastName FROM Employees Burada imleç bir değişken gibi tanımlanmakta ve imlecin temel aldığı T-SQL sorgusu FOR sözcüğünden sonra verilmektedir. Oluşturulan imleci kullanabilmek için, imleci açma gerekmektedir. Bunun için OPEN sözcüğü kullanılmaktadır. OPEN CalisanImleci

İmleç açıldıktan sonra, imleçteki kayıtlar arasındaki gezinmek için FETCH sözcüğünü kullanırız. FETCH NEXT FROM CalisanImleci Bu komut ile CalisanImleci adlı imleçte bir sonraki kayıda geçiş yapılır. Ayrıca kayıtlar arasında dolaşmak için FETCH komutunun farklı şekilleri kullanılabilir. FETCH PRIOR : İmlecin bir önceki kayda geçiş yapmasını sağlar. FETCH FIRST : İmlecin ilk kayda geçiş yapmasını sağlar. FETCH LAST : İmlecin son kayda geçiş yapmasını sağlar. FETCH ABSOLUTE n : İmlecin belirtilen sıradaki kayda geçiş yapmasını sağlar. FETCH RELATIVE n : İmlecin bulunan kayıttan belirtilen sıra ötesindeki kayda geçiş yapmasını sağlar. İmleç (Cursor): Satır satır işlem yapmaya yarar. declare imleç_ismi cursor [forward_only, scroll] [static, keyset, dynamic, fast_forward] [read_only, scroll_locks, optimistic] for select ifadesi veri kümesi üzerinde gezinmek için open ifadesi (açmak için) veri kümesinde son satıra gelene kadar satır satır gezmek için ise fetch ifadesi kullanılır. fetch next: bir sonraki satıra geçer fetch prior: bir önceki satıra geçer fetch last: son satıra gider fetch first: ilk satıra gider fetch absolute: n değeri pozitif ise n. satıra gider. n negatif ise sondan n. satıra geçer ve n 0 ise hiç bir işlem yapmaz fetch relative: n pozitif ise en son gidilen satırdan n satır sonrasına gider n negatif ise en son gidilen satırdan n satır öncesine gider. n 0 ise işlem yapmaz. Veri kümesinde gezinmeyi kapatmak için close ifadesi kullanılır. Deallocate: imleci hafızadan silmek için kullanılır. Aşağıdaki örnek Kitaplar tablosundaki kitapların adlarını ve sayfa sayılarını satır satır yazdırır. declare @k_adi varchar(max) //parametre tanımladık declare @sayfa int //parametre tanımladık declare @kitap_imleci cursor //imleç tanımladık for select kitap_adi, s_sayisi from kitaplar //imlecin neyleri saydıracağını yazdık open kitap_imleci fetch next from kitap_imleci into @k_adi, @sayfa //bir sonraki satıra geç while @@FETCH_STATUS = 0 //eğer while başarılıysa. begin print @k_adi +' '+CAST(@sayfa as varchar(10)) //tür değiştirdi yazdırdı fetch next from kitap_imleci into k_adi, @sayfa //bir sonraki satıra geçerek yazdırıyor. close kitap_imleci deallocate kitap_imleci

Ürün_adi Fiyat A 15 B 80 C 40 Şimdi bu tablomuzu yaratalım. Create table urunler1 (urun_adi varchar(50), fiyat money) Bu tablomuza verilerimizi ekleyelim insert into urunler1 (urun_adi, fiyat) values ('A', 15),('B',80),('C',40) Şimdi bu ürünlerimizi güncelleyelim. Eğer 50 den küçükse %30 50 den büyükse %20 arttırıyor. update urunler1 set fiyat=fiyat+(fiyat*0.3) where fiyat < 50 update urunler1 sey fiyat=fiyat+(fiyat*0.2) where fiyat > 50 Select * from urunler1 dediğimiz de yeni ekran görüntüsü şu şekilde olacaktır. Bu işlemleri cursor yardımıyla yapmak istersek. Şu şekilde yapacağız. declare @u_fiyat money declare fiyat_artis cursor for select fiyat from urunler1 open fiyat_artis fetch next from fiyat_artis into @u_fiyat while @@FETCH_STATUS=0 begin if @u_fiyat<50 update urunler1 set fiyat=fiyat+(fiyat*0.3) while current of fiyat_artis else update urunler1 set fiyat=fiyat+(fiyat*0.2) where current of fiyat_artis sağlıyor //update in sadece o satıra etki etmesini fetch next from fiyat_artis into @u_fiyat close fiyat_artis scroll imleç: Hem ileri hem geri hareket eder.

declare @k_adi varchar(max) declare kitap_imleci cursor scroll for select kitap_adi from kitaplar open kitap_imleci fetch last from kitap_imleci into @k_adi while @@FETCH_STATUS=0 begin print k_adi fetch prior from kitap_imleci into @k_adi close kitap_imleci deallocate kitap_imleci Bu örnekte sondan başa doğru ilerleyerek işlemleri yapacaktır. Scroll olmazsa hata verir. Çünkü neye göre geri gideceğini bilemez. Static: Değişiklikler direk olarak veri kümesini etkilemez. Commit yaparak en sonunda kayıt yapılabilir. Dynamic: Veriyi doğrudan kaynağından kullanır. Keyset: Her değiştirilen satır için bir key oluşturur. Sonra o anahtara göre kodun değiştirilip değiştirilmediğini kontrol eder. Forward_only: Sadece fetch nextte izin verir.( Sadece satırı ileri almaya izin verir.) Read_only: Sadece okunur değişiklik yapılamaz. Scroll_locks: O anda satıra gelen update işlemini imleci kilitleyerek garanti altına alıyor. Aynı anda iki kullanıcı işlem yaparken kilitlenen satıra sadece o satırı kilitleyen kullanıcı değişiklik yapabiliyor. Optimistic: scroll_locks un tam tersidir. Eğer scroll_locks yapılmazsa sen o satırda işlem yaparken optimistic olur ve başkası o satırda işlem yapar senin yaptığın işlem kabul edilmez. Fast_forward: Hızlı bir şekilde yapar. Forward_only ve read_only özellikleri kullanılır. İşlemlerin hızlı yapılmasını sağlar. declare kitap_imleci cursor forward_only read_only for select kitap_adi from kitaplar declare kitap_imleci fast_forward for select kitap_adi from kitaplar Yukarıdakilerin ikisi de aynı işlemi yapacaktır. declare kitap_imleci cursor scroll scroll_locks for select kitap_adi from kitaplar Buradaki scroll sayesinde imleci hem ileri hem geri hareket ettirmeyi sağlar. Scroll_locks ise işlemlerdeki değişiklikler için imleci kilitliyor.