Tetikleyiciler (TRIGGER) Nedir,Nasil Kullanilir.. | Ms Sql Server | Çağlar Özenç
Bir tetikleyici bir tabloya bağlı olarak bir takım işlemler yapan özel bir saklı yordamdır. Bu yazımızda sadece Ardı Sıra Tetikleyici (After Trigger) ve Yerine Tetikleyici (Instead Of Triggers) adı verilen tetikleyicileri anlatacağız.
Tetikleyiciler ne zaman kullanılırlar ?
Tetikleyicileri kullanmanın bir çok nedeni vardır. Bir tabloda bir değişiklik yapıldığında ayni anda bir çok değişik işlemin de yapılması gerekli olabilir. Belki de bu tabloda yapılan değişikliklerin veritabanı sorumlusuna bir e-mail atması istenebilir. Bu işlemler için tetikleyiciler kullanmak çoğu kez çok zarif çözümler üretmenizi sağlayabilir.
Bir tabloya UPDATE, INSERT veya DELETE işlemi yapıldıktan sonra bir takım işlemlerin yapılması için kullanılan tetikleyicilere Ardı Sıra Tetikleyici denir. Bu tür tetikleyiciler pek çok değişik iş yapabilirler. Bir başka tabloya veri girişi yapmak veya tabloyu güncellemek, tablolar arasında uyumu sağlamak için bu tür tetikleyiciler çok uygundur.
1. Bu örnekte öncelikler üç tablo oluşturalım. Müşteriler, Kitaplar ve Satışlar
CREATE TABLE Musteriler (
MusteriNo int IDENTITY (1, 1) NOT NULL ,
AD nvarchar  (20),
SOYAD nvarchar(20) )
UrunNo int  IDENTITY (1, 1) NOT NULL ,
UrunAD nvarchar  (255),
CREATE TABLE Satislar(
FisNo int  IDENTITY (1, 1) NOT NULL ,
UrunNo int  ,
Tarih smalldatetime )
INSERT INTO Musteriler VALUES ('Yusuf','Ünlü')
INSERT INTO Musteriler VALUES ('Orhan','Sönmez')
INSERT INTO Musteriler VALUES ('Naime','Ekici')
INSERT INTO Urunler VALUES ('Modern Cebir, Herstein, Academic Press',5)
INSERT INTO Urunler VALUES ('Analiz, Rudin, Van Nostrand',4)
INSERT INTO Urunler VALUES ('Geometri, Coxeter, North Holland',2)
INSERT INTO Urunler VALUES ('Şu Çılgın Türkler, Özakman',450)
CREATE TRIGGER SatisGir_StokGuncelle ON Satislar
SELECT @SAY = COUNT(i.UrunNo)
FROM Urunler u INNER JOIN inserted i ON u.UrunNo= i.UrunNo
WHERE (i.Adet > u.Stok)
IF @Say >0
RAISERROR ('Girilen ürünlerden biri stokdan fazla',16,1)
UPDATE Urunler SET  Stok = u.Stok - i.Adet
FROM Urunleru INNER JOIN inserted i ON u.UrunNo= i.UrunNo
Burada inserted olarak adlandırılan tablo yeni bir kayıt girilmekte olan Satışlar tablosunda yeni kayıtın girildiği satırdan oluşan tablonun tetikleyicide kullanılan mantıksal adıdır. Tetikleyicinin ne yaptığı son derece açıktır. Eğer yeterli stok varsa
satış yapıldıktan sonra satış adedini stoktan düşmektedir.
2. Bir DELETE tetikleyici yazalım
CREATE TRIGGER SatisSil_StokGuncelle ON Satislar
UPDATE Urunler SET  Stok = p.Stok + i.Adet
FROM Urunler p JOIN deleted i ON p.UrunNo = i.UrunNo
Bu tetikleyiciyi deneyelim
DELETE FROM   Satislar WHERE FisNo = 2
Burada deleted olarak adlandırılan tablo kayıt silinmekte olan Satışlar tablosunda silinen kayıttan oluşan tablonun tetikleyicide kullanılan mantıksal adıdır. Tetikleyici iptal edilen satış adedini stoka eklemektedir.
Yerine Tetikleyiciler( INSTEAD OF TRIGGER)
Bir INSERT, UPDATE veya DELETE işlemi bir tabloya uygulandığında bu tablo üzerinde , sırasıyla bir Instead Of INSERT, Instead Of UPDATE veya Instead Of DELETE tetikleyici varsa bu işlem tablo üzerinde gerçekleşmez. Onun yerine tetikleyici içinde yazılı kodlar
SQL Server Transaction Log Backup ile istenilen zamana geri dönün.. SQL’in Veri İşleme Lisanı ( Data Manipulation Language (DML)) SQL Server – İstatistik (Statistic) Nedir? SELECT INTO Kullanimi Microsoft SQL Server PDW nedir ?
← SELECT INTO Kullanimi Programlama Ogreniyorum – TextBox Nedir Ozellikleri nelerdir ? →
7 thoughts on “Tetikleyiciler (TRIGGER) Nedir,Nasil Kullanilir..”
Ali SARMAN 1 September 2016
Ersoy AYDIN 18 January 2017
ilk 3 query ile table ları oluşturdum.
insert into komutunu çalıştırdım.
yazmış olduğunuz Trigger kodunda
daha ile satırda
“Satislar” tablosu için şu hatayı almaktayım.
The object ‘Satislar’ does not exist or is invalid for this operation
Aşağıdaki satırda ise;
“i” deki UrunNo fieldı için , “invalid column name ‘UrunNo'” hatası almaktayım.
Acaba nerede hata yapmış olabilirim?
Çağlar Özenç Post author 6 February 2017
Kullanmakta olduğunuz sunucunun collaction bilgisi nedir ?
Satislar tablosunun olmadığı yönünde hata mesajı veriyor. İlk 3 sorguyu çalıştırdığınız veritabanı içerisinde mi trigger oluşturmaya çalışıyorsunuz ?
Farklı sunucularda yazdığım kodları denedim. Herhangi bir hata ile karşılaşmadım.
metin 27 March 2017
Benim yazmış olduğum bir trigger var cari kart kopayalama ile alakalı,kodlarda problem görünmüyor hatta çalıştırıyorum sorunsuz çalışıyor lakin tetikleme işlemini gerçekleştirmiyor yani yeni bir cari kart ekle dediğimde diğer bir tabloya da gidip aynı cari kartı eklemesi gerekirken bu işlem gerçekleşmiyor.Aslında kodları görmeden elbette yorum yapmak saçma olur ama genel geçer bilmediğimiz ince bir ayar vs var mıdır acaba ?
Çağlar Özenç Post author 6 April 2017
Trigger disable durumda olabilir, aksi durumda eğer tanımlı ve aktif ise gereken işlemi gerçekleştirmesi gerekmektedir.
Ömer 27 July 2017
Merhaba trigger ile uzak bir MySQL sunucusundaki bir tabloya insert edebilir mi?
Çağlar Özenç Post author 27 July 2017
Tabi yapabilirsin. MySQL için LinkedServer tanımlayıp insert query’sinde kullanabilirsin.