SQL Server Trigger Kullanımı
Merhabalar,
SQL üzerinde en sık kullanılan objelerden birisi olan Trigger(Tetikleyici), yönetim ya da kontrol alanında çeşitli faydalar sağlamasıyla ön plana çıkmaktadır.Bu faydalara ve kullanım alanlarına geçmeden önce kısaca içeriğinden bahsedelim.
Trigger yapısı itibariyle manuel olarak çalıştırılamazlar.Bu çalışmaya sebep olacak detaylar gereklidir.Ve bu sebepleri Trigger oluştururken belirtmek durumundayız.Aynı şekilde hangi düzeyde çalışacağını da belirtmemiz gerekir.Aksi halde Trigger tanımlandığında her database ve tablolar üzerinde çalışmaz.Create ederken hangi durumlarda ve seviyede çalışacağını belirtmeniz gerekir.
Nedir bu seviyeler ?
1.Server Seviyesinde Trigger
2.Database Seviyesinde Trigger
3.Tablo Seviyesinde Trigger
Genel kullanım şekilleri birbirine benzer olduğundan ortak bir genel kullanım ifadesini paylaşıp daha sonrasında 3 farklı seviyeyi de ayrı ayrı inceleyeceğiz.
Genel kullanım;
CREATE TRIGGER trigger_ismi
ON [ALL SERVER] \ DATABASE \ [TABLE OR VIEW]
AFTER\INSTEAD OF
AS
<Sorgular>
Burada dikkat edilirse seviye kırılımlarından sonra iki farklı kırılım daha gerçekleşiyor.INSTEAD OF ve AFTER durumları.
AFTER : Durum başarıyla gerçekleştikten sonra trigger çalışacaktır.
INSTEAD OF : Trigger da bahsi geçen olay gerçekleşeceği sırada o işlem yerine gerçekleşir.
1.Server Seviyesinde Trigger
Trigger oluştururken,bu triggerın nerede ve hangi durumlarda çalışmasını istediğimizi belirtmemiz gerektiğini söylemiştik.Eğer sunucuda birisi database oluşturduğunda kimin oluşturduğunu ,ne zaman oluşturduğunu takip etmek istersek bunu başka bir tabloya istediğimiz bilgiler çerçevesinde insert edebiliriz.Ya da bir başka örnek olarak sisteme login olanların listesini bir tabloya insert edip,o tabloyu da belirli periyotlarla istenilen maile göndermesini sağlayabiliriz.
Bir örnek üzerinde inceleyelim.
CREATE TRIGGER tg_DropTable
ON DATABASE
AFTER DROP_TABLE
AS
BEGIN
SELECT
QUOTENAME(EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname')) + N'.' +
QUOTENAME(EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'))+' tablosu silindi' AS [Silinen Tablo Bilgileri]
END
DROP TABLE HumanResources.Employee_
Görüldüğü üzere oluşturduğumuz Trigger database oluşturulduğunda devreye giriyor ve bize bir mesaj gösteriyor.
2.Database Seviyesinde Trigger
Bu seviyede bir trigger tanımladığımızda tablo oluşturmak,tablo silmek gibi database yapısını değiştirecek durumlarda tetiklenir.
Örnek kullanımı ;
CREATE TRIGGER tg_DropTable
ON DATABASE
AFTER DROP_TABLE
AS
BEGIN
SELECT
QUOTENAME(EVENTDATA().value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname')) + N'.' +
QUOTENAME(EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname'))+' tablosu silindi' AS [Silinen Tablo Bilgileri]
END
DROP TABLE HumanResources.Employee_
3.Tablo Seviyesinde Trigger
Bu seviyede bir Trigger oluştururken tablo oluşturmak,güncellemek,silmek gibi işlemleri takip edebiliriz.En sık kullanılan trigger çeşidi olan Tablo bazlı Trigger,çok farklı kullanımlara imkan sağlar.Örneğin bir ulaşım aracı için bilet satın alırken,dolu koltuğu kontrol edip o koltuğa bilet kesilmesini engellemek,bir ürün için toplu satın alım yapılacağı zaman stok kontrolü yapılarak yanlış işlemlere sebebiyet verecek durumları ortadan kaldırmak gibi çeşitlendirebiliriz. Burada inserted ve deleted olmak üzere gerçekte olmayan fakat trigger yapısında karşımıza çıkan iki farklı tablo mevcuttur.
Inserted : Tablomuza eklenen kaydın tutulduğu tablodur.
Deleted : Silinen kayıtların tutulduğu tablodur.
Updated isminde bir tablo olmamakla birlikte Update komutuyla karşılaşıldığında sistem öncelikle varolan kaydı siler.Deleted tablosuna yazılır.Daha sonrasında ise insert edilir.Ve bu durumda da inserted tablosuna yazılır.
Tablo seviyesinde kullanıma örnek verecek olursak genel kullanımı aşağıdaki gibidir;
CREATE TRIGGER trigger_ismi
ON tablo_adi\view_ismi
AFTER\[INSTEAD OF] INSERT\DELETE\UPDATE
AS
<Sorgular>
şeklindedir.
Örnek :
Tuttuğumuz takımın maçı var ve bu maçta biletler satışa çıktı.Biletler hızla tükeniyor ve sistemde kesilecek bilet sayılarını manuel olarak takip etmek zor olacaktır.İki farklı tablomuz mevcut birisinde maç bilgileri ve bilet sayısı,diğer tablomuzda ise satış yapıldıkça kesilen biletler mevcut.Satış tablosuna her satır eklendiğinde diğer tablomuzdan koltuk sayısı düşecek şekilde bir trigger yazalım.
CREATE TABLE BILET
(
Id INT PRIMARY KEY IDENTITY(1,1) NOT NULL,
Karsilacak_Takimlar varchar(50) NULL,
Mac_Tarih date NULL,
Bilet_Sayisi int NULL,
)
CREATE TABLE BILET_SATIS
(
Id INT PRIMARY KEY IDENTITY(1,1) NOT NULL,
Bilet_Id INT FOREIGN KEY REFERENCES BILET(Id),
Personel_Id INT,
Islem_Tarih DATETIME,
)
INSERT INTO BILET VALUES ('GS-FB','2020-01-30',50000)
SELECT * FROM BILET
tablolarımızı oluşturup kayıt girdik.
Şimdi de triggerı tanımlayalım.
CREATE TRIGGER tg_macbileti
ON BILET_SATIS
AFTER INSERT
AS
BEGIN
UPDATE BILET
SET Bilet_Sayisi = Bilet_Sayisi-1
SELECT CAST(Id AS VARCHAR(10))+ ' numaralı bilet satılmıştır.'+'Geriye '+CAST(50000-Id AS VARCHAR(10))+ ' bilet kaldı.' AS [BILET DURUMU]
FROM INSERTED
END
Oluşturduğumuz triggerı manuel olarak çalıştıramıyoruz ve tetiklenebilmesi için sorguda belirttiğimiz gibi bir bilet satışı gerçekleşmesi gerekiyor.
BILET_SATIS tablosuna bir kayıt insert ediyorum.
Bir kayıt daha girelim.
Trigger istediğimiz şekilde çalışıyor.Bir de bilet durumunu görüntüleyelim.
Görüldüğü üzere her satış gerçekleştiğinde bilet tablomuzdaki bilet sayımız düşmektedir.
Bu yazımızda Trigger kullanarak neler yapılabileceğini,hangi seviyelerde oluşturulabileceğini örnekler üzerinden inceledik.Farklı kullanım şekillerinden yararlanarak siz de ihtiyacınız olan senaryolarınızda trigger kullanarak işinizi hafifletebilir,datalarınızın bütünlüğünü sağlayabilir ya da kontrol altında tutabilirsiniz.
Umarım faydalı bir yazı olmuştur.
Hoşça kalın.