© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi HAFTA 10 © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi İÇERİK Hatırlatma: Kullanıcı Tanımlı Fonksiyonlar Bu hafta örnekler ile kullanıcı tanımlı fonksiyonlar konusunu ve tetikleyici (trigger) konusunu inceleyeceğiz. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Öğrenci Numarası (otomatik artan olabilir), Adı Soyadı, Ders Adı, Vize, Final, Ortalama , Durum değerlerini içeren bir tablo oluşturunuz. İçerisine örnek değerler giriniz (en az 10 adet) Ortalama degeri Vizenin %40’ı ile finalin %60’ı alınarak hesaplanmaktadır. Durum alanı ise Ortalama ve Final değerleri kontrol edilerek hesaplanmaktadır. Ortalama>=50 ve Final>=50 ise GEÇTİNİZ yazılsın Final alanında -1 değeri varsa SINAVA GİRİLMEDİ yazılsın Bunların dışındaki durumda ise KALDINIZ yazılsın. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
Geçen Haftaki Sunumdaki Hatalı Kısım UPDATE ogrenciler SET durum = CASE WHEN ort<50 OR final<50 THEN 'Kaldı' WHEN final=-1 THEN 'Sınava Girmedi' ELSE 'Geçti' END GO SELECT * FROM Ogrenciler © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi ALTER Table Personeller Add Maas money, NetMaas Money, Durum varchar(20) © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Örnek DECLARE deneme3 CURSOR FOR SELECT PersonelID,Unvan from Personeller DECLARE @maasi int, @unvani varchar(20) DECLARE @id int set @maasi=5000 OPEN deneme3 FETCH NEXT FROM DENEME3 INTO @id, @unvani WHILE (@@FETCH_STATUS=0) BEGIN if @unvani='Sales Representative' update Personeller set Maas=@maasi where PersonelID=@id else if @unvani= 'Sales Manager' update Personeller set Maas=@maasi+2000 where PersonelID=@id else update Personeller set Maas=@maasi+2500 where PersonelID=@id FETCH NEXT FROM DENEME3 INTO @id,@unvani END close deneme3 DEALLOCATE deneme3 SELECT PersonelID,Adi,SoyAdi,Unvan, Maas from Personeller © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Saklı yordam içinde kullanıcı tanımlı fonksiyon kullanılabilir mi? © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
Fonksiyon Örneği CREATE FUNCTION NetMaasHesapla ( @BurutMaas numeric(10,2) ) RETURNS numeric(10,2) AS BEGIN DECLARE @NetMaas numeric(10,2) IF (@BurutMaas > 5000) SET @NetMaas = @BurutMaas*0.80 ELSE SET @NetMaas = @BurutMaas*0.85 RETURN @NetMaas END
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi CREATE PROCEDURE NetHesap1 as begin update Personeller set NetMaas=dbo.NetHesapla(Maas) Select PersonelID, Adi, Unvan, Maas,NetMaas from Personeller end exec NetHesap1 © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi BREAK While döngüsü belirli bir koşul sağlandığı sürece bir ifadeyi veya bloğu tekrar eder. Aşağıdaki döngü Personel tablosundaki ortalama maaş 7000'den küçük olduğu sürece tüm personelin maaşını %10 arttırır. Ayrıca en yüksek maaş 10.000'den büyük olursa da Break ile döngüden çıkılır. WHILE (SELECT AVG(Maas) FROM Personeller) < 7000 BEGIN UPDATE Personeller SET Maas = Maas * 1.1 IF (SELECT MAX(Maas) FROM Personeller) > 10000 BREAK ELSE CONTINUE END SELECT MAX(Maas) AS "En Yüksek Maaş" FROM Personeller © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
TRIGGER SQL de bir tabloda herhangi bir işlem yapıldığı anda otomatik olarak aynı tabloda veya başka bir tabloda başka işlemlerinde yapılmasını istediğimiz zamanlarda, Trigger'lar yapılmasını istediğimiz bu işlemi bizim adımıza otomatik olarak gerçekleştirirler. create trigger Isim on TabloAdi for Insert, Update, Delete (Tek tek veya hepsi birden yazılabilir) as islemler
Trigger (Tetikleyici) Bir tabloda değişiklik olduğunda otomatik olarak başlatılan prosedürlere DML Trigger, veritabanı tanımlarında değişiklik olduğunda tetiklenenlere ise DDL Trigger denir. DML Trigger insert, delete veya update ifadelerin belirtilen tabloda oluşması gibi bir olaydan ve bir hareketten (ilgili prosedür) oluşur. Örneğin; personel tablosundan bir kaydın silinmesi olayı gerçekleştiğinde, eski_personel tablosuna personelin numarasını ve işten ayrılma tarihini belirtmek için o anki tarihi kaydeden bir prosedür yazılması ile bir DML Trigger oluşturulabilir.
CREATE TRIGGER Guncelle on [SatisDetaylari] for insert AS DECLARE @UrunNo int,@adet int SELECT @UrunNo=UrunID from Inserted SELECT @adet=Miktar from inserted UPDATE Urunler set HedefStokDuzeyi=HedefStokDuzeyi-@adet WHERE UrunID=@UrunNo
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi INSERT INTO SatisDetaylari (SatisID, UrunID, BirimFiyati, Miktar) VALUES (10324, 14,334,10) © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
Trigger (Tetikleyici) Kullanımı Trigger'ın tetiklenmesini engellemek için Disable trigger <triggerAdı> on <tabloAdı> Sadece DML Trigger içinden kullanılabilen ve geçici olarak hafızada saklanan inserted ve deleted adında iki tablo vardır. INSERT işleminde yeni eklenen kayıt inserted tablosunda saklanır. DELETE işleminde silinen kayıt deleted tablosunda saklanır. UPDATE işleminde ise güncelleme öncesi eski değer deleted tablosunda, değişen yeni değer inserted tablosunda saklanır.
INSTEAD OF TRIGGER 'lar tetikleyici sorgunun YERİNE çalışırlar INSTEAD OF TRIGGER 'lar tetikleyici sorgunun YERİNE çalışırlar. Ayırdedici tek özellikleri ise BEGIN END satırları arasına yazılıyor olmasıdır..
-- ihtiyaç: Urunler tablosundan ürün silinmeye çalışıldığında bu ürünün Sonlandi kolonunu 1 yapsın (Yani Silmesin, Update etsin): CREATE TRIGGER tr_SatisiDurdur ON Urunler INSTEAD OF delete -- Delete 'in çalışmasına izin vermeden trigger çalışsın AS BEGIN DECLARE @Urunno int SELECT @Urunno=UrunID FROM deleted UPDATE Urunler SET Sonlandi=1 WHERE UrunID=@Urunno END
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Personeller tablosunda kayıt güncellendiğinde işlem tarihi alanına o anki tarih bilgisi eklensin alter table Personeller add IslemTarihi Datetime © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi ALTER TRIGGER [dbo].[TrigDegisimTarihi] ON [dbo].[Personeller] AFTER UPDATE AS declare @Personel int SELECT @Personel = PersonelID FROM inserted UPDATE Personeller SET IslemTarihi = GETDATE() WHERE Personeller.PersonelID = @Personel --Değişken tanımlamadan da yapılabilir: FROM inserted WHERE Personeller.PersonelID = inserted.PersonelID © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi UPDATE Personeller SET Maas=Maas*1.2 WHERE PersonelID=13 SELECT PersonelID, Adi, SoyAdi,Maas, IslemTarihi FROM Personeller WHERE PersonelID>=12 © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi INSERT INTO [Personeller] ([SoyAdi] ,[Adi] ,[Unvan] ,[Maas]) VALUES ('Demir','Ahmet','Genel Müdür Yrd.',7500) GO © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi
© Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi Personeller tablosuna SicilNo alanı eklenecek ve bu alana 1000’den başlayarak birer birer artarak her kayıt için ekleme yapacak T-sql kodunu yazınız. © Marmara Üniversitesi Uzaktan Eğitim Uygulama ve Araştırma Merkezi