Trigger Nedir

Yazar: Cengiz Atilla
Kategori: SQL Server
Eklenme Tarihi: 7.1.2010 10:27:32



Merhaba arkadaşlar bugun sql server da trigger işlemlerine bakıcaz .... 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 .

Merhaba arkadaşlar bugun sql server da trigger işlemlerine bakıcaz ....

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


Cengiz Atilla

Cengiz Atilla 02.11.1984 / İstanbul doğumludur . Nahit Menteşe Endüstri Meslek Lisesi Programcılık bölümünden mezun olmuştur .  2 yıllık Bursa Uludağ Unv Bilgisayar Programcılığı bölümünü bitirmiştir .

MCPD ve MCT ünvanlarına sahiptir.

atilla@cengizatilla.com
cengiz.atilla@hotmail.com
www.cengizatilla.com


Serkan Kesen - 25.1.2012
güzel yazı koduna sağlık..

Ahmet Topaloğlu - 15.3.2011
hocam ellerine sağlık çok açıklayıcı olmuş

Yorumunuz