Trigger Nedir

Dark-Man

Kıdemli Üye
5 Ocak 2013
4,430
9
I Don't Know
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
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.