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



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

SQL TRIGGERS (Tetikleyiciler)

EXISTS VE NOT EXISTS fonksiyonları

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

PostgreSQL ve PL/pgSQL

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.

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

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

PostgreSQL ve PL/pgSQL

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

VERİ TABANI ve YÖNETİMİ

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

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

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

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

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

STORED PROCEDURE LER (Saklı Yordamlar)

«BM364» Veritabanı Uygulamaları

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

Veri Tabanı ve Yönetimi

Üst Düzey Programlama

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

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

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.

SQL Komutları (2) Uzm. Murat YAZICI

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

Oracle da kullanılan veri tipleri:

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

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

SAKLI YORDAM (Stored Procedure) Sibel Somyürek

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

Veri Tabanı Hafta Dersi

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

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

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

KULLANICI TANIMLI FONKSİYONLAR

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

Veritabanına Uygulanması

Veri Tabanı SQL Server ve Management Studio kurulum linkleri:

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

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

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

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

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.

«BM364» Veritabanı Uygulamaları

KULLANICI TANIMLI FONKSİYONLAR (Devam)

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

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

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

SORGULAR VE ÇEŞİTLERİ II

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

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

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

SQL Stored Procedure

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

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

VERİTABANI Veritabanı Yönetimi

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

Veritabanı Tasarımı. Veritabanı Hareketleri

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

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

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. Çok satır dönerse hata verir.

KULLANICI TANIMLI FONKSİYONLAR (Devam)

TETİKLEYİCİ. Tetikleyici Ne Zaman Kullanılır? Çeşitli amaçlara uygun olarak tetikleyiciler kullanılabilir.

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

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

Veri Tabanı Programlamaya Giriş

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

VERİ TABANI ve YÖNETİMİ

Mysql Veritabanı Komutları

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

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

SQL e Giriş. Uzm. Murat YAZICI

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

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

VERİTABANI. SQL (Structured Query Language)

BİLİŞİM TEKNOLOJİLERİ

YAPISAL SORGULAMA DİLİ (SQL)

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.

Android Ders Notları

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

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

DML işlemleri. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı May Öğr. Gör. Murat KEÇECĠOĞLU

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

Sayfa 1 / 8. Tabo yapıları

SUNGURLU MESLEK YÜKSEKOKULU 5. T-SQL

Veri Tabanı II Alt Sorgular

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

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

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.

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

1. Araçların tüm bilgilerini ve bağlı oldukları kiralama noktasının adres ve telefonunu içeren tam listesi:

Bölüm 10: PHP ile Veritabanı Uygulamaları

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

Microsoft SQL Server Sorgulama

SQL Kod ile Tablo Oluşturma

BÖLÜM- 9: KULLANICI ERİŞİMLERİNİ YÖNETMEK

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) print kitap sayisi +@k_sayisi print yetersiz kitap sayisi else if (@k_sayisi>5 and @k_sayisi <=10) print kitap sayisi +@k_sayisi print Yeni kitaplar gerekli else 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) ) tekrarlanması gereken işlemler için kullanılır. Fakat tek bir komut satır var ise e gerek yok. Tekrarlanmasını yani sürekli dönmesini istediğimiz komutları buna yazıyoruz. declare @sayac int set @sayac= while @sayac<=5 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 print "deger degiskeni NULL" Return else 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ı try sql ifadeleri try 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: try select 1/0 try 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. try select * from ersonel try 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. try declare @urunno varchar(20) set @urunno=3 delete from urunler where @urun_no=@urunno try 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; 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. try transaction try transaction save transaction basla update fiyat set ad='bilgisayar'

commit try catch rollback transaction basla print 'hata 1. güncellemede'+ error_message() catch update fiyat set fiyat='10554' commit try 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) 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 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 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 /*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. 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 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 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. Trigger (Tetikleyiciler) Trigger nedir?

Trigger tetikleyici anlamına gelir programlarımızda belirli bir işlem gerçekleştiğinde programımızı tetiklemeye yarar veya tablolar arası veri bütünlüğünü korumak için kullanılırlar. Aslında triggerlar bir store proceduredür fakat farkı kiliğinden çalışmasıdır. Triggerlarda ya hep ya hiç mantığı vardır yani program zorlukla karşı karşıya kaldıgında bütün işlem geri döner. Örneğin atmden para çekiyorsunuz parayı aldığınızda sizin hesabınızdan para düşülmemişse işlemin yarısında elektrik kesilmişşe vb. Olaylarda yapılan bütün işlemler iptal olur geri döner (transaction konusunda ayrıntılı anlatcağım)bu işlemi rollback transaction ifadesi ile gerçekleştirir trigger tanımlamamız içinde transaction blogu olması gerekir. Rollback transaction ifadesini minimum düzeyde kullanmamız önerilir çünkü büyük veritabanlarında bu işlemlerin yapılması çok büyük yük oluşturur buda performasın düşmesine sebep olur. Triggerlarla silme, güncelleme, ekleme işlemlerini yapabiliriz. Yani bir tabloda birden fazla trigger tanımlayabiliriz. Bir işlem yapılırken başka bir işlemin yapılmasını sağlıyor. Yapılan işlem diğerinin yapılmasını tetikleyebilir. Select, update, insert de tetikleyici olarak kullanılabiliyor. Ddl tetikleyiciler: ddl ifadeleri Create alter ve delete kullanıldığında devreye bu tetikleyiciler girer. İnserted ve deleted kullanılmaz. Rollback ve commit kullanılır. Allserver tüm sunucu üzerindeki işlemler, Database kullandığımız database üzerinde değişikliğe izin verir. All server içinde kullandıklarımız buradadır. Diğerleriyse database içinde yer alır. create trigger tetikleyici_ismi on (allserver / database) [with encryption] {for / after}

{create, delete, drop, deny, grant, revoke} as {sql ifadeleri} kodları bu şekildedir. create trigger silme_engeli on database for drop_table as print 'Tablo silme işlemi yasaklanmıştır!!!' Bu kodları çalıştırdığımızda database içerisindeki triggera bu tetikleyici eklenmektedir. Silme engeli olan bir trigger eklenmiştir. drop table urunler1 Bu kodu çalıştırdığımızda tablo işlemini engellediğimiz için şu uyarı çıkacaktır. create trigger silme_düzeltme_kont on database for drop_table alter_table as declare @mesaj varchar(max) set @mesaj = 'kütüphane veri tabanı üzerinde bulunan tabloda değişiklik yapılmıştır!' + select EVENTDATA().value('/event_instance/TSQLCommand /CommandText) [1],','vvarchar(max)') exec xp_smail 'egementekkanat@trakya.edu.tr',@mesaj Bu kodlar sayesinde kodlarda herhangi bir değişiklik yapıldığında belirtilen adrese mail yollanıyor. EVENTDATA sayesinde ne tür bir değişiklik olduğu detaylı bir şekilde bilgiliriliyor. create trigger db_engeli on all server for create_database as print 'veritabnı oluşturmaya izin verilmiyor' rollback Bu kodlar sayesinde database yaratmaya engel koyulur. Veri tabanı yaratmaya çalıştığımızda şu hata ortaya çıkıyor. create database egemen2 Burada rollbackle ki hata mesajını verir. Bu yüzden kırmızı yazılardaki hatalar görüntülenmektedir.

create trigger tetikleyici_ismi on all server / database {for / after} lon as {sql_ifadeleri} LOGON TETİKLEYİCİLER Login olunca devreye girecektir. create login deneme with password='12345', check_expiration=on grant view server state to deneme //kullanıcının serverın durumunu görmesine izin veriyor. Sistemde üç kere oturum açmasını sağlayacak üçten sonra izin vermeyecektir. create trigger oturum_limit on all server for LOGON as if ORIGINAL_LOGIN()= 'deneme' and //Original Login sayesinde bizim kullanıcımızın sisteme girip girmediğini kontrol ediyoruz. (select count(*) from sys.dm_exec_sessions where is_user_process=1 and original_login_name='deneme')>3 //sisteme üç kere girip girmediğini kontrol ediyor rollback

Aşağıdaki gibi yazdığımız kodların çalışıp çalışmadığını deneme kullanıcısına üç hak verilip verilmediğini deneyebiliriz.

DML TETİKLEYİCİLER Tabloda değişiklik yapınca devreye giren tetikleyicilerdir. After(bu komutlar işlemi yaptıktan sonra devreye girer) ve instead of(komutlar çalıştığı sırada devreye girer.) komutlarında kullanılıyor. create trigger k_kontrol on kitaplar for insert //buradaki for yerine instead of ya da after da yazılabilir. Buradaki insert yerine delete, update yazarak diğer durumları da kontrol edebiliriz. as declare @k_adi varchar(255) select @k_adi=k_adi from inserted if exists (select * from kitaplar where k_adi=@k_adi) print 'aynı isimde kitap var' rollback Aynı isimde kitap girildiğinde aynı isimde kitap var hatası verecektir. Yukarıda var olan tabloya aşağıdaki gibi ekleme yapmaya çalıştığımızda hata verecektir.

Kalite kontrol trigger ının yardım kısmıdır. Sana bu trigger ın ne iş yaptığını anlatır. Burada Kitaplar tablosunda kullanılan triggerları ve bu trigger da kullanılanları gösterir. K_kontrol trigger ının etkilediği tablo ve sütunları gösterir. ÜRÜNLER URUN_KODU URUN_ADI FİYAT MİKTAR

1 A 15 150 2 B 25 200 3 C 46 100 create table urunler(urun_kodu int, urun_adi varchar(25), fiyat MONEY, miktar int) insert into urunler values(1,'a',15,150), (2,'B',25,200), (3,'C',46,100); kodları sayesinde yukarıdaki tablomuzu yarattık ve eklemeleri yaptık. Create table satışlar (urun_kodu int, musteri varchar(50),tarih DATETIME,miktar int) insert into satışlar values(1,'ahmet',15/12/2010,150), (2,'Bülent',25/02/2010,200), (3,'Celal',10/10/2010,100); SATIŞLAR URUN_KODU MUSTERİ TARİH MİKTAR 1 Ahmet 15.12.2010 150 2 Bülent 25.02.2009 200 3 Celal 10.10.2010 100 Create table alımlar (urun_kodu int, cari varchar(50),tarih DATETIME,miktar int) insert into alımlar values(1,'200',15/12/2010,150), (2,'300',25/02/2010,200), (3,'400',10/10/2010,100); ALIMLAR URUN_KODU CARİ TARİH MİKTAR 1 200 15.12.2010 150 2 300 25.02.2009 200 3 400 10.10.2010 100

Yukarıdaki iki tabloyu da oluşturup gerekli eklemeleri yaptık. Bu eklemeleri yaptıktan sonra alım yapılınca tablonun güncellenmesini alınan değer kadar eklenme yapılmasını sağlayacak trigger ı şu şekilde yazarız. create trigger stok_kontrol on alımlar after insert as declare @a_miktar int declare @u_kod int select @a_miktar=miktar, @u_kod=urun_kodu from inserted update urunler set miktar=miktar+@a_miktar where urun_kodu=@u_kod Bu kod sayesinde insert yaptığında update işlemi yaparak satırı güncelleyecektir. Yani aşağıdaki kodu her çalıştırdığımızda 1 numaralı ürüne +5 ekleme yapacaktır. Kodu bir kez daha çalıştırdığımda şu çıktıyı alacağız. Satışlar için yeni bir trigger oluşturuyoruz. create trigger stok_kontrol_satis on satışlar after insert as declare @satis_miktari int declare @stok_miktari int declare @u_kod int select @satis_miktari=miktar, @u_kod=urun_kodu

from inserted select @stok_miktari=miktar from urunler where urun_kodu=@u_kod if(@satis_miktari>@stok_miktari) print 'yetersiz stok miktari' rollback else update urunler set miktar=miktar-@satis_miktari where urun_kodu=@u_kod Bu tablo sayesinde yapılan satışlara göre stok miktarında gerekli azaltmalar yapılmaktadır. Eğer satış miktarı stok miktarından büyükse hatayı yaz aksi durumda varolan miktardan satış miktarını çıkarıp tabloyu güncelle. create trigger ISBN_sil on kitaplar after delete as declare @isbn varchar(255) if @@ROWCOUNT>0 DELETE TETİKLEYİCİLERİ(DELETE TRİGGER)

select @isbn=isbn from deleted delete from emanet where isbn=@isbn delete from kitap_kateri where isbn=@isbn delete from kitap_kutuphane where isbn=@isbn delete from kitap_yazar where isbn=@isbn Bu kodlar sayesinde isbn e göre tek tek tabloları kontrol edecek ve bu tablolardaki seçilen isbn e ait kayıtları tüm tablolardan silecektir. create trigger güncelle on kitaplar after update as declare @eski_isbn varchar(255) declare @yeni_isbn varchar(255) if @@ROWCOUNT>0 select @eski_isbn=isbn from deleted select @yeni_isbn=isbn from inserted update emanet set isbn=@yeni_isbn where isbn=@eski_isbn update kitap_kateri set isbn=@yeni_isbn where isbn=@eski_isbn update kitap_kutuphane set isbn=@yeni_isbn where isbn=@eski_isbn update kitap_yazar set isbn=@yeni_isbn where isbn=@eski_isbn 18.12.2013 Bu kod bloğu sadece eski isbn ile yeni isbn i değiştirerek güncelleme işlemi yapmaktadır. create trigger kitap_kontrol on kitaplar instead of insert as if not exists(select*from inserted inner join kitaplar on inserted.k_adi=kitaplar.k_adi) or not exists(select*from inserted inner join kütüphane on inserted.k_adi=kütüphane.k_adi) print 'girilen kitap adına veya isbn numarasına göre kitap tanımlı değildir.' rollback /*insert işleminden önce kitap_adi ve isbn değerlerinin olup olmadığını kontrol edecek.*/

else declare @girilen_k.adi varchar(255) declare @girilen_kütüphane varchar(255) declare @girilen_miktar int select @girilen_k.adi=k_adi, @girilen_k.adi=kütüphane_no, @girilen_miktar=miktar from inserted /* Eğer girilen isbn ve k_adi tanımlı ise o kitap adını update edecek*/ if exists(select * from kitaplar where k_adi=@girilen_k_adi and kütüphane_no=@girilen_kütüphane) rollback update kitaplar set miktar=miktar+@girilen_miktar where k_adi=@girilen_k_adi and kütüphane_no=@girilen_kütüphane else insert into kitaplar select*from inserted Daha önceden yarattığımız db_engeli adlı triggerı şu şekilde değiştiririz. alter trigger db_engeli on all server for create_database as print 'veritabanı oluşturmak yasaktır!' rollback Bu kod sayesinde yeni database oluşturulamıyor. exec sp_rename db_engeli, veritabani_engeli bu kod sayesinde de trigger ın adını değiştiriyoruz. Peki biz bu engeli kaldırmak istersek ne yapmalıyız? drop trigger veritabani_engeli on all server kodları sayesinde tüm databaselerden yaratma engelini kaldırıyoruz. Yani veritabani_engelindeki engeli. Eğer on ifadesinden sonra belirli bir database adı yazarsak o tablo için bu trigger ı tamamen kaldırmış oluruz. alter table kitaplar disable trigger kitap_kontrol

kitaplar tablosundaki kitap_kontrol triggerını pasif hale getiriyor. Eğer disable yerine enable yazarsak aktif hale getirecektir. Ya da all yerine belli bir database'i yazarak işlem yapabiliriz. Drop ile disable arasındaki fark. Drop ifadesinin geri dönüşü yoktur. Tamamen kaldırır. Ancak disable anlık pasif hale getirir ve enable ile aktif hale getirilebilir.