Trigger Nedir

Klasik manada triggerlar veri degisiminin hemen ardından devreye giren ozel bir storeprocedure gibi yapılardır . ( insert update delete ) işlemlerinden sonra devreye girerler. Trigger mantıgında karsımıza iki adet sözde tablolar gelmekdedir ve biz bu sözde tablolar uzerinde bazı işlemlerimizi yaparız. Sözde tablolarımız inserted ve deleted tablolarımızdır .
inserted : veri eklendigi zaman insert veya update komutunun yeni eklenen verisinde .
deleted  : veri silindigi zaman delete veya update komutunun eski verisinde …
triggerlar her zaman olay oldukdan sonra devreye giren yapılar degildir … sql 2000 ile hayatımıza giren Instead of türü triggerlar gercek tablo degisiklikden etkilenmeden hemen once devreye giren yapılar olarak gelmişdir .
Temel olarak iki farklı trigger cesitimiz vardır After ( for ) instead of
After ( for ) : sadece tablolar uzerinde tanımlanabilirler . for trigger ı after trigger ı ile aynıdır sadece sql server ın eski surumlerinin uyumlulugu icin kullanılır …
Instead of    : triggerlar ise hem tablolar hem viewlar uzerinde tanımlanabilirler .
After trigger ı ile instead of trigger ı arasındaki en buyuk fark after trigger ı olayın olusunu kabul eder ve kendini trigger a bırakır .  instead of triggerlar ise istenilen işlemi gercekleştirmez . sadece bahsettigimiz sözde tablolara inserted ve deleted kaydetmekle yetinirler .
trigger bir islem oldukdan sonra kendisini cagıran işlemi rollback ile geri cevirebilir .
Önemli Not : triggerlar truncate table komutunu gormezler bir tabloya truncate dedigimiz zaman buna baglı olan hic bir trigger bu işlemi farketmez . bunu nedeni truncate tablo log dosyasına herhangi bir iz bırakmamasındandıır ki triggerlar log yani ldf adını verdigimiz dosyadan faydalanırlar …
Önemli Not 2 : triggerlar içerisinde select cumlelerimizde hic bir seyi ifade etmez … bize result dondurmezler …
Triggerlar olusturdugumuz tabloların altında trigger klasorunde barınırlar ve database e ozeldir…
uygulamamız esnasında bize eslik edicek database i ve tabloları olusturalım …
create database TriggerUygulama
create table Ogrenciler
(
Ogrenciid int identity(1,1),
Ogrenciadi nvarchar(max),
Ogrencisoyad nvarchar(max),
Adres nvarchar(max),
DevamsizlikGunsayisi int
)
create table OgrencilerLog
(
Logid int identity(1,1),
Ogrenciid int,
Ogrenciadi nvarchar(max),
Ogrencisoyad nvarchar(max),
Adres nvarchar(max),
DevamsizlikGunsayisi int,
Olay nvarchar(max),
Zaman datetime
)
— insert islemi icin trigger tanımı yapalım …
create trigger tg_ogrenciekle on Ogrenciler
with encryption
for insert
as
begin
insert into OgrencilerLog select Ogrenciid,ogrenciadi,ogrencisoyad,Adres,DevamsizlikGunSayisi,’Veri Eklendi’,getdate() from inserted
end
insert into Ogrenciler values (‘Cengiz’,’Atilla’,’Sefakoy’,2)
select * from Ogrenciler
Select * from OgrencilerLog
— yukarıdaki trigger ogrenciler tablosuna veri eklendigi zaman devreye giren bir trigger dır with encryption ile trigger larımızın ici sifrelenebilir . sifrelenmiş trigger içerigi gorunmez o nedenle bizimde tsql kodlarımızı saklamamız gerekicekdir …
———————————————————————————————————
— update işlemi icin gerekli olan trigger
create trigger tg_update on Ogrenciler
with encryption
After update
as
begin
insert into OgrencilerLog select Ogrenciid,OgrenciAdi,OgrenciSoyad,Adres,DevamsizlikGunSayisi ,’Veri Guncellendi Guncelleme işleminden sonraki hali ‘, getdate() from inserted
insert into OgrencilerLog select Ogrenciid,OgrenciAdi,OgrenciSoyad,Adres,DevamsizlikGunSayisi ,’Veri Guncellendi Guncelleme işleminden onceki hali ‘, getdate() from deleted
end
update Ogrenciler set OgrenciAdi = ‘Ugur’ where Ogrenciid = 1
Select * from Ogrenciler
Select * from OgrencilerLog
———————————————————————————————————
— Silme işlemi icin olan trigger
create trigger tg_OgrenciSil on Ogrenciler
for delete
as
begin
insert into OgrencilerLog select Ogrenciid,OgrenciAdi,OgrenciSoyad,Adres,DevamsizlikGunSayisi ,’Veri Silindi ‘, getdate() from deleted
end
delete ogrenciler where ogrenciid = 1
select * from ogrenciler
select * from ogrencilerlog
———————————————————————————————————
Truncate table komutunu triggerlar gormez demişdik o zaman bir adet veri ekleyelim ve daha sonra ogrenciler tablomuzu truncate edelim bakalım delete işlemimiz bunu gorucek mi
insert into ogrenciler values (‘Yakup’,’Demir’,’Bakırkoy’,4)
select * from Ogrenciler
verilerimizi gorduk simdi truncate table diyelim ….
truncate table Ogrenciler
select * from OgrencilerLog
resutl dada goruldugu gibi sadece insert esnasında olan kayıtlarım tutulmakdalar truncate table kısmını trigger gormemekde …
———————————————————————————————————
— Devamsızlık gun sayısı 40 dan buyuk olan ogrencinin girisini istemeyelim …
create trigger tg_ogrenciekle on ogrenciler
after insert
as
begin
declare @Gunsayisi int
select @Gunsayisi = DevamsizlikGunsayisi from inserted
if(@Gunsayisi >40)
begin
rollback
end
else
begin
insert into OgrencilerLog select Ogrenciid,ogrenciadi,ogrencisoyad,Adres,DevamsizlikGunSayisi,’Veri Eklendi’,getdate() from inserted
end
end
insert into ogrenciler values (‘Cengiz’,’Atilla’,’Sefakoy’,99)
yukarıdaki veri tabloya insert olma esnasında trigger tarafından geri cevrildi …
insert into ogrenciler values (‘Cengiz’,’Atilla’,’Sefakoy’,22)
select * from ogrencilerlog
yukarıdaki trigger ımızda ogrencinin devamsizlik gun sayisi 40 dan buyuk ise trigger tarafından işlem rollback yani geri alındı …
———————————————————————————————————
— DDL database triggerlarımız …
create trigger tg_databaseupdate on database
for ALTER_TABLE
as
begin
print ‘duzenleme işlemi red edildi’
rollback
end
alter table Ogrenciler
add Deneme nvarchar(20)
create trigger tg_databasedrop on database
for DROP_TABLE
as
begin
print ‘silme işlemi red edildi ‘
rollback
end
drop table Ogrenciler
— triggerları tepkimeye kapatmak icin …
alter table Ogrenciler
disable trigger tg_ogrenciekle
insert into Ogrenciler values (‘A’,’B’,’F’,22)
alter table Ogrenciler
enable trigger tg_ogrenciekle
yazılımgünlüğünden alıntıdır.

Cevap Gönder

E-posta adresiniz yorumunuzda yayınlanmayacaktır.