[T-Sql] Triggerlar

Öncelikle herkese merhaba,
Bu yazımda Trigger’ları anlatmaya çalışacağım. Faydalı olması dileğiyle.

Tablolar üzerinde gerçekleştirilen DML komutlarına bakarak belli başlı işlemlerin tetiklenmesi olayına Trigger denir. Trigger’ın karşılığı tetiklemedir. Örneğin bir silme anında verinin silinmesi yerine silindi kolonunun true yapılmasında tetikleyiciler iş yapar. For, After ve instead of modlarında kullanılır.
Örnek kullanım şekli:

create trigger TriggerAdi
on TabloAdi
for Islem
as
--yapılmasını istediğiniz işlemler...

Aşağıdaki sorgu sql sorgusunda Order details tablosunda ekleme işlemi yapıldığında Product tablosunda ürünün stoğundan yapılan alışveriş kadar düşülmesi sağlanır.

create trigger StokAyar
on [Order Details]
for insert
as
set nocount on -- kaç satır eklediğini saymasın
-- update işleminde hem deleted hem de inserted aynı anda doldurulur.
declare @urunID int
declare @adet int
select @urunID = i.ProductID,@adet = i.Quantity from inserted as i
update Products set UnitsInStock -= @adet where ProductID = @urunID

Trigger oluşturulurken iki tablo ile işlem yapılır. Bunlar ;
inserted : insert anında eklenen veriyi getirir.
deleted : delete anında silinen veriyi getirir.

Yukarıdaki trigger’ı oluşturduktan sonra aşağıdaki şekilde işlemler yaparak da çalışıp çalışmadığını, nasıl çalıştığını görebiliriz.

select * from [Order Details]

0

Yukarıda işlem yapmadan önceki tablomuz bulunuyor. 10248 numaralı satışa 1 numaralı üründen ekleyeceğiz. 9 adet alınmıştır. Bu satışı yaparken bizim ürünler tablosundan da 1 numaralı ürünün stoğundan 9 adet düşmemiz gerekmektedir. Ayrıca bu kısımda stokta yeterli miktarda ürün bulunuyor mu diye kontrol yapılması da gerekirdi. Ancak uzatmamak ve karışmaması maksadıyla eklemedim.

insert into [Order Details](OrderID,ProductID,UnitPrice,Quantity,Discount) values(10248,1,18,9,0)

Yukarıdaki satışı yaptıktan sonra product tablosuna bakarsak eğer stoktaki miktarın azaldığını göreceğiz.
1

Bir örnek daha yapacak olursak eğer, daha iyi pekiştirmiş olacağız. Mesela bir satışı iptal edersek, ürünlere o satışa ait miktarı geri eklememiz ve stoktaki miktarını arttırmamız gerekir.
Şimdi bu olayı simüle eden triggerımızı yazalım.

create trigger SatisSil
on [Order Details]
for delete
as
set nocount on -- kaç satır eklediğini saymasın
declare @productID int
declare @adet int

select @productID = d.ProductID,@adet = d.Quantity from deleted as d

update Products set UnitsInStock += @adet where ProductID = @productID

OrderID’si 10251 ve productID’si 22 olan satışı order details tablosundan silersek eğer silinen satışa ait miktarı ürünler tablosuna eklemeliyiz. Bu işlemi yukarıdaki trigger’da tanımladık. Satışa ait ürün miktarını alıp ürünlere ekledik.
Silme işlemini yapmadan önceki tablolarımızın hali:

select * from [Order Details] where OrderID = 10251 and productID=22
select * from Products where ProductID =22

2

Şimdi bu işlemi simüle eden delete işlemini yapalım.

delete from [Order Details] where OrderID = 10251 and productID =22
select * from [Order Details] where OrderID = 10251 and productID=22
select * from Products where ProductID =22

3_001
Yukarıda da görüldüğü gibi satışı sildik ve satışa ait ürünleri ürünler stoğuna ekledik.

Instead of : Yerine demektir. bir delete işlemi için instead of trigger’ı tanımlanırsa delete işlemi engellenir. Silme işlemi yerine istediğiniz işlem yürütülür.

Örnek : Ürünler tablosunda silme işlemi yapıldığında ürünü silmeyip discontinued kolonuna true yazan yani 1 yazan trigger yazınız.


create trigger UrunSilme
on [Products]
instead of delete
as
declare @urunID int =(select ProductID from deleted)

update products set Discontinued=1 where ProductID = @urunID

select * from Products

4
13 numaralı ürün olan Konbu’yu silmek istediğimizde bunu engelleyerek discontinued kolonunu 1 yapalım.

delete from Products where ProductID = 13

5

Bu kullanımlar genişletilebilir. Trigger’lar ile ilgili anlatımlarım bu kadar. Kendinize iyi bakınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir