22
KULLANICI TANIMLI FONKSİYON

Kullanici tanimli fonksi̇yons

Embed Size (px)

Citation preview

Page 1: Kullanici tanimli fonksi̇yons

KULLANICI TANIMLI

FONKSİYON

Page 2: Kullanici tanimli fonksi̇yons

KULLANICI TANIMLI FONKSİYON ÇEŞİTLERİ

• Yerleşik fonksiyonlar dışında bizim de tanımlayacağımız fonksiyonlar vardır. Bu tür fonksiyonlara Kullanıcı tanımlı fonksiyonlar (User DefinedFunction) adı verilir.

• Bir kullanıcı tanımlı fonksiyon "0" veya birden fazla değer alabilir ve tek bir değer veya bir tablo döndürebilir.

• Aldığı değerler timestamp, cursor ve table dışında, herhangi bir veri tipi olabilir.

• Sabit fonksiyonlar gibi, tek bir değer döndürebilir(Scalar Function).• Stored Procedure gibi bir veya daha fazla Transact-SQL ifadesi

kullanarak tablo döndürebilir(Multi-Statement Table-Valued Function).• Tek bir Select ifadesi ile bir tablo değeri döndürebilir. View yapısına

benzer, ancak çok daha kullanışlıdır. (In-Line Table-Valued Function)

Page 3: Kullanici tanimli fonksi̇yons

Aynen Stored Procedure veya view gibi fonksiyon oluşturabiliriz.

CREATE FUNCTİON ifadesi kullanılır.

Kullanım Sekli:

Bir fonksiyonda değişiklik yapmak için; ALTER FUNCTİON ve mevcut olan bir fonksiyonu silmek için; DROP FUNCTİON ifadeleri kullanılır.

Page 4: Kullanici tanimli fonksi̇yons

SCALAR FUNCTION:

• Bu tür fonksiyonlar tek bir değer döndürebilirler. Fonksiyon içinde birden fazla Transact-SQL komutu BEGIN..END blokları arasında kullanılabilir. Text, ntext, image, cursor veya timestamp veri tipleri dışında herhangi bir veri tipinde de değer döndürebilir. Yerleşik fonksiyonlara benzer ve oluşturulduktan sonra farklı yerlerde yeniden kullanılabilir.

Page 5: Kullanici tanimli fonksi̇yons

MULTI-STATEMENT TABLE- VALUED FUNCTION:

• View ve Stored Procedure birleşimidir. Bir tablo döndürebiliriz.

Temel özellikleri;

• Fonksiyonun ana kısmı BEGIN..END blokları arasındadır.

• Tablo olarak dönebilir (table veri tipi).

• Tablo formatı belirlenebilir.

Page 6: Kullanici tanimli fonksi̇yons

IN-LINE TABLE- VALUED FUNCTION:

• Table veri tipi döndürülebilen bu fonksiyonlarda, özel format tanımlanamaz. Daha çok View yapısına benzer.

Page 7: Kullanici tanimli fonksi̇yons

UYGULAMA:

1) Aşağıdaki fonksiyonu kullanarak; belirtilen adrese göre, kayıtları listeleyebiliriz.

Page 8: Kullanici tanimli fonksi̇yons

2) Çalıştırmak için;

Page 9: Kullanici tanimli fonksi̇yons

3) Görüntü, aşağıdaki gibi olacaktır.

Page 10: Kullanici tanimli fonksi̇yons

TRİGGER

Page 11: Kullanici tanimli fonksi̇yons

TRİGGER NEDİR?

• Bir tablo içindeki verileri yapılandırmak için kullanılan bir tür storedprocedure'dür. Genellikle ilişkisel bütünlüğü sürdürmek veya tablolar arasındaki bütünlüğü korumak için kullanılır. Karmaşık kurallar ile veri bütünlüğünün devam etmesi için tercih edilir.

Temel kural ve özelliklerini listeleyecek olursak;• Bir tablo için oluşturulur.• Stored Procedure'ün bir çeşitidir.• Otomatik olarak çalışır.• Stored Procedure'e benzemeyen özelliği; direkt olarak çalışmamasıdır.• Transaction'un bir parçasıdır.• ROLLBACK TRANSACTION ifadesi bir zorlukla karşı karşıya kalmışsa,

işlem geri döner. Eğer Trigger içerisinde ROLLBACK TRANSACTION ifadesi varsa ifade çalıştırılır. Böyle bir durumda, IF komut dizilimi içerisinde RETURN cümleciği kullanılır. Bu diğer işlemleri önler.

Page 12: Kullanici tanimli fonksi̇yons

• Trigger, kullanıcı tanımlı bir fonksiyon tarafından tetiklenen ROLLBACK TRANSACTION ifadesi içerebilir. Trigger; bu toplu işlem ile ROLLBACK TRANSACTION ifadesini çalıştırır ve toplu işlem de hata olursa, alt bir ifade içerisinde çalıştıramaz.

• Trigger içinde minimum düzeyde ROLLBACK TRANSACTION ifadesi kullanınız. Çünkü bu işlem yapılırken, ek yük oluşturulur. Bu durum da sistem performansınızın düşmesini sağlar.

• Trigger'ı çalıştıracak olan kullanıcının; ilgili tablolarda izninin olması gerekir.

Page 13: Kullanici tanimli fonksi̇yons

• Trigger'ları sıralamak için, sp_settriggerorderkullanılır. Bu sp ile yalnızca ilk ve son triggerbelirlenir. Tek bir tablo üzerindeki her bir ekleme, güncelleme veya silme işlemini; mevcut db içerisindeki db_owner ve db_ddladmin grubunun üyeleri yapabilir. Tabiki sysadmin grubu da her şeyi yaptığı için bu işlemi de yapabilir.

sp_settriggerorder@triggername='guncelle', @order='first', @stmttype=,UPDATE

Page 14: Kullanici tanimli fonksi̇yons

• Birçok Trigger, uygulanan ifadeden sonra çalışır. Sadece INSTEAD OF ifadesi, Constraint'ler gibi ifadelerden önce çalışır. Örneğin: CHECK Constraint'i ile INSERT ifadesi bir tabloya uygulanacak ise, ilk önce kontrol yapılır ve sorun yoksa uygulanır. Trigger'da ise ilk önce INSERT ardından otomatik olarak Trigger çalışır.

• Bir tablo içinde çeşitli amaçlar için, birden fazla Trigger bulunabilir.

•Yeni bir Trigger oluşturulduğunda bilgileri; sysobjects ve syscommentstablolarında tutulurlar. Eğer aynı isimli bir Trigger oluşturulursa yeni oluşturulan Trigger, eskisinin üzerine yazılır.•CHECK Constraint'ine göre daha işlevseldir, sorgulama sonucu döndürmez.•Özel mesajlar tanımlanabilir ve olaylardan önce veya sonra kıyaslama yapabilir.•Cascade Update ve Delete özellikleri kullanılabilir.•Çoklu satır Trigger oluşturulabilir.

Page 15: Kullanici tanimli fonksi̇yons

CREATE TRIGGER :Trigger oluşturmak için CREATE TRIGGER ifadesi kullanılır.

Kullanım sekli:CRETAE TRİGGER trigger_adı

ON tablo_adı

[WITH ENCRYPTION]

{FOR|AFTER|INSTEAD OF} {INSERT|UPDATE|DELETE}

AS

[IF UPDATE (sütun_adı)]

[{AND|OR}UPDATE(sütun_adı)]

Page 16: Kullanici tanimli fonksi̇yons

SQL ifadeleri;• Trigger bilgileri; sysobjects ve syscomments sistem tablolarında

tutulur. Kullanıcı tanımlı Trigger desteği sistem tablolarında olmadığı için sistem tabloları üzerinde Trigger oluşturulamaz.Triggeroluşturmak için db_owner ve sysadmin grubunun üyesi olmak gerekir.

• Triaaer tanımlamalarında aşağıdaki ifadeler kullanılamaz;ALTER DATABASECREATE DATABASEDROP DATABASELOAD DATABASELOAD LOGRECONFIGURERESTORE DATABASERESTORE LOG

• sp_depends tablo_adı, sp_helptext trigger_adı, sphelptriggertablo_adı gibi sistem stored procedure'leri ile bilgi edinilebilir.

Page 17: Kullanici tanimli fonksi̇yons

ALTER VE DROP TRİGGER;

• Oluşturulan Trigger üzerinde değişiklik yapmak için ALTER TRİGGER, var olan bir Trigger'ı silmek için ise DROP TRİGGER ifadeleri kullanılır.

• Bir Trigger bir tabloya atandıktan sonra istenirse, geçici olarak devre dışı bırakılabilir ve sonradan yeniden aktif hale getirilebilir. Bunun için ALTER TABLE ifadesi, aşağıdaki şekilde kullanılır.

• ALTER TABLE tablo_adı{ENABLE|DISABLE} TRİGGER(ALL|trigger_adı[,n])

Page 18: Kullanici tanimli fonksi̇yons

TRIGGER NASIL ÇALIŞIR?

• Bir Trigger'ı iyi bir şekilde tasarlamak için nasıl çalıştığını anlamak gerekir. Bu kısımda INSERT, UPDATE, DELETE ve INSTEAD OF Triggeryapılarının nasıl çalıştığını inceleyeceğiz.

Page 19: Kullanici tanimli fonksi̇yons

• Bir tablo içine veri eklemek için kullanılan INSERT ifadesi ile Trigger oluşturulabilir.

• Bir INSERT Trigger tetiklendiği zaman, Trigger'lıtabloya eklenen yeni satır aynı zamanda insertedtablosuna eklenir, inserted tablo mantıksal bir tablodur ve yeni eklenen satırın bir kopyasını tutar. INSERT ifadesi ile ilgili log'lar; insertedtablosunun içinde tutulur ve bu INSERT ifadesine referans edilir. Trigger, inserted tablosunu inceleyerek ne yapacağına karar verir.

• Tüm veri yapılandırma aktiviteleri(INSERT, DELETE, UPDATE) bir olay günlüğü (log) yapısına sahiptir. Ancak bu bilgiler transaction log içinden değil, inserted tablosundan okunur.

Page 20: Kullanici tanimli fonksi̇yons

DELETE TRIGGER

• Bu çeşit Trigger'lar, bir tabloda silme işlemi meydana gelince çalışırlar ve silinen kayıtlar deleted mantıksal tablosu içinde tutulur. Bir tablodan bir kayıt silindiğinde bu kayıt; ana tablodan tamamen silinir, ancak deletedtablosunda yer aldığından iki tablo arasında bir ortak yön yoktur. Deleted tablo her zaman Cacheiçinde tutulur. TRUNCATE TABLE ifadesi içeren bir tablo silme işleminde log oluşmadığından dolayı Delete Trigger çalıştırılamaz.

Page 21: Kullanici tanimli fonksi̇yons

UPDATE TRIGGER:

• Bu yapıda iki olay meydana gelir. Bu olayların ilki DELETE adımıdır ve Before Image olarak, diğeri ise INSERT adımıdır ve After Image olarak adlandırılır. Yani UPDATE ifadesi çalıştığında, tablo içinde bulunan orijinal kayıtlar(before image) deleted tablosuna taşınırken, güncellenen kayıtlar inserted tablosuna taşınır. Eğer güncellenmesini istemediğiniz bir sütun varsa, bu sütunu kontrol etmek için; IF UPDATE ifadesi ile beraber güncellenmesini istemediğimiz sütun adını yazmamız gerekir.

Page 22: Kullanici tanimli fonksi̇yons

INSTEAD OF TRİGGER:

• Bu tür Trigger'lar; Constraintler gibi çalışır ve hem tablo üzerine hem de view üzerine uygulanabilir. Bu Trigger, orijinal Trigger eylemleri yerine çalıştırılır. İNSTEAD OF Trigger'ları güncelleme çeşitliliğini arttırır.

• Her tablo veya vievv'larda her bir INSERT, DELETE, UPDATE olan eylemler için bir adet İNSTEAD OF Trigger'ı oluşturulabilir. View'larda İNSTEAD OF Trigger'ı; WITH CHECK OPTION parametresi ile oluşturulamaz.