09 December 2016

Trigger

Veritabanı tablolarında bazı olaylar meydana geldiğinde çalışan küçük kod parçalarına trigger denir. Bu olaylardan daha önce DML  konusunda bahsetmiştik. Listeleyecek olursak bu olaylar aşağıdakilerdir:

  • INSERT
  • UPDATE
  • DELETE

Trigger oluşturmak:

CREATE TRIGGER trigger_adi
 ON tablo_adi
 AFTER veya INSTEAD OF (INSERT veya UPDATE veya DELETE)
 AS
 Sql ifadeler

Trigger enable/disable yapmak:

disable trigger trigger_adı On tablo_adı
enable trigger trigger_adı On tablo_adı

Trigger silmek:

drop trigger trigger_adı

Trigger Ne Zaman Kullanılır?

  • Değişiklikleri takip etmek,
  • Birincil anahtar üretmek,
  • Karmaşık iş kurallarını gerçekleştirmek,
  • E-posta atmak gibi olayları otomatik olarak yapmak,
  • Standart hata mesajlarının dışında bir hata mesajı elde etmek,
  • Veritabanı erişimlerini takip edebilmek,
  • Nesnede meydana gelebilecek değişiklikleri takip ve engellemektir.

Trigger Ateşleyen Olaylar

Trigger çalıştığı zaman Inserted ve Deleted adı verilen sahte tabloları kullanır. Bu tablolar triggerin ateşlendiği tabloyla eşdeğer alanlara sahiptir. Bunlar da mantıksal olarak RAM’de bulunur. Asıl tabloya bir kayıt eklendiğinde ve trigger ateşlendiğinde bu kayıt Inserted tablosuna da eklenir. Tablodan bir kayıt silindiğinde silinen kayıt Deleted sahte tablosuna da eklenir. Update işlemi ise önce silme (Delete) ve ardından bir kayıt ekleme (Insert) olarak ele alınır. Bir kayıt güncellendiğinde asıl kayıt Deleted sahte tablosuna, değişen kayıt da Inserted sahte tablosuna yazılır.

Trigger Türleri

After Triggerler: After triggerler, kendiyle ilişkili işlem gerçekleştikten hemen sonra ateşlenir. Sadece tablolar için tanımlanabilir.
Instead Of Triggerler: Belirlenen işlem gerçekleşirken devreye girer ve kendi içinde tanımlanan komutları icra etmeye başlar. Yani, belirlenen işlemin yerine geçer. After tetikleyicileri sadece tablolar için tanımlanabilirken Instead Of tetikleyicileri hem tablolar için hem de view’ler için tanımlanabilirler.

Örnek:

create trigger InsertTrigger
 on products
 after insert
 as
 print ('insert trigger tetiklendi...')

–test code

insert into products (productname,unitprice,UnitsInStock) values ('Araba',30000,1)

INSERT Trigger

Bir tablo üzerinde yeni kayıtlar girildikten sonra devreye giren triggerdir. Insert trigger devreye girdikten sonra Inserted tablosunda yeni eklenen kayıtların bir kopyası tutulur. Inserted tablosu, asıl tablonun yapısal bir kopyası olup trigger sonlanana kadar saklanır.

Örnek:

create trigger TriggerforInsertAction
 on Products
 after insert
 as
 select * from Inserted

–test code

insert into products (productname,unitprice,UnitsInStock) values ('Araba',30000,1)

DELETE Trigger

Tablodan bir kayıt silindiğinde otomatik olarak yapılması istenen işlemler için DELETE triggeri kullanılır. DELETE triggeri çalıştıktan sonra silinen kayıt Deleted sahte tablosuna kaydedilir. Deleted tablosunun Inserted tablosundan farkı, asıl tablodan silinen kayıt artık Deleted tablosunda yer almaktadır.

Örnek:

create trigger TriggerforDeleteAction
 on Products
 after delete
 as
 select * from deleted

–test code

delete from products where productID=105

UPDATE Trigger

Tablo üzerindeki kayıt ya da kayıtlarda güncelleme olduğunda devreye girecek olan triggerdir. INSERT ve DELETE triggerden biraz farklıdır. Farkı ise UPDATE trigger devreye girdiğinde Inserted sahte tablosu asıl tablodaki kayıtlardan, düzenlenmiş kayıtların kopyasını, Deleted sahte tablosu ise kayıtların düzenleme işleminden önceki hallerini tutar.

Örnek:

create trigger TriggerforUpdateAction
 on products
 after update
 as
 select * from deleted
 select * from inserted

–test code

update products set unitPrice=10000 where productId=104

Örnek After Trigger:

–sipariş verilen ürünün stok bilgisini güncelleyen trigger

create trigger StokTakip
 on [Order Details]
 after insert,update,delete
 as
 declare @productId int,
 @quantity int
 if exists (select * from deleted)
 begin
 select @productId=ProductId,@quantity=Quantity from deleted
 update products set UnitsInStock+=@quantity where ProductID=@productId
 end
if exists (select * from inserted)
begin
 select @productId=ProductId,@quantity=Quantity from inserted
 update products set UnitsInStock-=@quantity where ProductID=@productId
 end

Örnek Instead Of Trigger:

create trigger AfterInsert
 on Products
 instead of insert
 as
 print('Instead of trigger tetiklendi..')
---test code
insert into products (ProductName, UnitPrice, UnitsInStock) values ('Monitor', 250, 12)
select * from Products

Örnek Viewlerde Çoklu Tablolarda CRUD işlemi yapmak:

create view UrnKat
 as
 select ProductName,CategoryName from Products as p
 inner join Categories as c
 on p.CategoryId=c.CategoryId
create trigger InserttoViews
 on UrnKat
 instead of insert
 as
 declare @kategoriadi nvarchar(50),
 @urunadi nvarchar(50),
 @kategoriID int
select @kategoriadi = categoryname, @urunadi =productname from inserted
 select @kategoriID=categoryID from categories where categoryname=@kategoriadi
 if @kategoriId is not null
 begin
 insert into Products (productname, categoryId) values (@urunadi, @kategoriID)
 end

—test

insert into UrnKat values ('Mouse','Beverages')

Comments

  1. ayşegül says:

    çok faydalı bir paylaşım olmuş teşekkürler…

  2. mevlüt says:

    çok teşekkürler faydalı oldu.

  3. İyi gunler.Benim bir tablom var ordan sadece fiyatı alıp musteride guncellemesini istiyorum.Nasıl yapabilirim?

  4. AFTER veya INSTEAD OF bu ifadelerin yerine bazı KAYNAKLARDA FOR KULLANILDIĞINI GÖRDÜM DOĞRU MUDUR ACABA?

    • AFTER ve FOR birebir aynı anlamdadır. FOR anahatar sözcüğü, eski SQL sürümlerindeki alışkanlığı devam ettirmek amacı ile kullanılabilir kılınmıştır..

      • for triggerı insert ederken şimdi çalıştır demek için kullanılır, after da insert ettikten sonra triggerı çalıştır demek

  5. Teşekkürler kardeşim