You are on page 1of 33

Veritabanı Yönetim Sistemleri-II

Dr.Öğr.Üyesi Füsun YAVUZER ASLAN


Trigger
(Tetikleyici)
Trigger
• Sunucu, veritabanı ve tablo üzerinde belirli bir olaya bağlı olarak tetiklenip çalışan SQL
komutlarıdır.
• Bir komut çalıştığında başka bir komutun daha çalışması isteniyorsa trigger nesnesi kullanılır.
• Trigger nesneleri özellikle veri bütünlüğünün korunması açısından önemli mekanizmalardır.
• Bir trigger nesnesi;
• DML komutlarından INSERT, UPDATE, DELETE
• DDL komutlarından CREATE, ALTER ve DROP
için hazırlanabilir.
Örneğin;
• Bir tabloya kayıt eklendiğinde (insert) başka bir tabloda değişiklik yapılması isteniyorsa 2 ayrı
komut yazmaktansa tablonun insert komutu için bir trigger oluşturulabilir.
• Böylece tabloda insert komutu çalıştırıldığında yazılan trigger tetiklenir ve başka bir komut
daha çalışır.
• Yani bir tablo veya veritabanında bir işlem yapıldığında o işleme göre başka bir işlemin
gerçekleşmesi istendiği zaman trigger kullanılır.
Trigger ile Temel İşlemler
• Trigger ile temel olarak 3 işlem gerçekleştirilir;
• ROLLBACK: Yapılan işlem tamamen geriye alınabilir (Geri Alma/İptal Etme)
Örneğin bir tablodan kayıt silme işlemi gerçekleşti ise işlem iptal edilerek silinen kayıtlar geri
alınabilir.
• AFTER/FOR: Yapılan işlemin yanında başka işlemlerin de yapılması sağlanabilir. Bu şekilde iki
işlem ardışık yapılabilir.
Örneğin bir tabloda silme işlemi gerçekleştiği zaman başka bir tabloya ekleme işleminin
gerçekleşmesi gibi.
• INSTEAD OF: Yapılan işlemin yerine tamamen farklı bir işlem yaptırılabilir.
Örneğin bir tabloya ekleme yapılacakken bunun yerine güncelleme yapılması gibi.
Trigger Çeşitleri
• SQL Server içerisinde 3 ayrı trigger bulunmaktadır. Bunlar;
• Tablo seviyesinde bulunan Triggers,
• Veritabanı düzeyinde olan Database Triggers,
• Sunucu seviyesinde olan Triggers dır.

Sunucu Triggers

Tablo Triggers Veritabanı Triggers


Veritabanı Düzeyindeki Triggers
• Veritabanı komutları için veritabanı triggerları yazılabilir.
• Örneğin; CREATE_DATABASE, DROP_TABLE, CREATE VIEW vs. (TABLO 1)
• Tablo1 de verilen komutlar çalıştığında başka komutların tetiklenmesi isteniyorsa veritabanı
triggerı yazılır.
• Bu trigger nesneleri veritabanı içerisinde saklanmaktadır.
• Dolayısı ile veritabanı başka bir sunucuya taşındığında trigger nesneleri de taşınacaktır.
Veritabanı Düzeyinde Trigger Oluşturma
• Veritabanı düzeyinde trigger oluşturmak için aşağıdaki komutlar kullanılır;
Veritabanı düzeyinde bir trigger yazıldığını
CREATE TRIGGER <trigger adi> ifade eder.
ON DATABASE
FOR <tablo1 den seçilen komut> tablodan seçilen bir komut için trigger
oluşturulduğu belirtilir.
AS
<TSQL Kodları>
yapılacak işlemler sıralanır
Örnek 1: Tablo silmeyi engelleyen bir trigger nesnesi
CREATE TRIGGER trg_tablosilmeyiengelle •trg_tablosilmeyiengelle isimli trigger
ON DATABASE DROP_TABLE komutu için gerçekleşir.
FOR DROP_TABLE •AS dan sonraki satırlar DROP_TABLE
AS komutu için tetiklenecektir.
PRINT 'Silme işlemi iptal edildi' •Yani veritabanındaki herhangi bir tablo
ROLLBACK silinmeye çalışıldığında AS sonrasındaki
komutlar çalışacaktır.
•Komutlara bakıldığında PRINT ile önce
bir mesaj verilecek ve daha sonrasında
ROLLBACK komutu çalışacaktır.
Örnek 2
• Aşağıdaki trigger komutu ise CREATE_TABLE, ALTER_TABLE, DROP_TABLE komutlarını
ROLLBACK ile çalışmasını engellemektedir.

CREATE TRIGGER trg_tablokontrol


ON DATABASE
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
PRINT 'Tabloda değişiklik yapmak için trg_tablokontrol nesnesini kapatmalısınız'
ROLLBACK
Veritabanı Düzeyinde Trigger Silme
• Trigger nesneleri aynı tablolarda olduğu gibi CREATE komutu ile yaratılır, ALTER ile değiştirilir
ve DROP ile silinir.
• DROP komutu aşağıdaki gibi kullanılır;
DROP TRIGGER <trigger adı> ON DATABASE
Trigger Nesnesini Aktif/Pasif Yapma
• Trigger nesneleri çoğunlukla veritabanından silinmezler, çalışmaları istenmediği zaman etkisiz
yani pasif hale getirilirler.
• Bir triggeri pasif hale getirmek için DISABLE komutu kullanılır.
• Etkisiz haldeki trigger nesnesini aktif hale getirmek için ise ENABLE komutu kullanılır.
Trigger Nesnesini Aktif/Pasif Yapma
• Triggerı pasif/aktif hale getirmek için aşağıdaki komutlar kullanılır;
DISABLE TRIGGER <trigger adı> ON <trigger kapsamı>
ENABLE TRIGGER <trigger adı> ON <trigger kapsamı>

• Örneğin, trg_tablokontrol trigger’ı aşağıdaki gibi pasif veya aktif yapılabilir;


DISABLE TRIGGER trg_tablokontrol ON DATABASE
ENABLE TRIGGER trg_tablokontrol ON DATABASE
Sunucu Düzeyinde Triggers
•Sunucu seviyesinde çalışan komutlar için sunucu triggerları yazılabilir (TABLO 2);
ALTER_AUTHORIZATION_SERVER,
CREATE_ENDPOINT, DROP_ENDPOINT,
CREATE_LOGIN, ALTER_LOGIN, DROP_LOGIN,
GRANT_SERVER, DENY_SERVER, REVOKE_SERVER

•Bu komutlar genellikle yetki ile ilgili komutlardır.


•Bu sebeple bu tip trigger nesnelerine logon triggerları adı verilir.
•Örneğin; CREATE_LOGIN komutu üzerine trigger hazırlanırsa sunucuda bir kullanıcı
oluşturulduğunda otomatik olarak trigger içindeki komutlar da çalışır.
Sunucu Düzeyinde Trigger Oluşturma
• Sunucu düzeyinde trigger oluşturmak için aşağıdaki komutlar kullanılır;
Sunucu düzeyinde bir trigger yazıldığını
CREATE TRIGGER <trigger adı> ifade eder
ON ALL SERVER
FOR <tablo2 den seçilen komut> tablodan seçilen bir komut için trigger
AS oluşturulduğu belirtilir
<TSQL Kodları>

yapılacak işlemler sıralanır


Sunucu Düzeyinde Trigger Silme
• Sunucu düzeyindeki bir trigger nesnesini silmek için aşağıdaki komut kullanılır;

DROP TRIGGER <trigger adı> ON ALL SERVER


Trigger Nesnesini Aktif/Pasif Yapma
• Triggerı pasif/aktif hale getirmek için:
DISABLE TRIGGER <trigger adı> ON <trigger kapsamı>
ENABLE TRIGGER <trigger adı> ON <trigger kapsamı>

• Örneğin trg_server triggeri aşağıdaki gibi pasif veya aktif yapılabilir:


DISABLE TRIGGER trg_server ON ALL SERVER
ENABLE TRIGGER trg_server ON ALL SERVER
Tablo Düzeyinde Triggers
• En çok kullanılan trigger çeşidi tablo için oluşturulan triggerlardır.
• Veriler tablolarda saklandığından tablo seviyesindeki trigger nesneleri en önemli olanlardır.
• Tablo triggerları INSERT, UPDATE ve DELETE komutları ile tetiklenir.
• Trigger kullanımının genel amacı veri bütünlüğünün korunmasıdır.
Tablo Düzeyinde Trigger Oluşturma
• Tablo düzeyinde trigger oluşturmak için aşağıdaki komutlar kullanılır;
Hangi tabloya INSERT, UPDATE veya DELETE yapıldığında
tetikleneceği belirlenir.
CREATE TRIGGER <trigger adı>
ON <tablo veya view adı>
FOR | AFTER | INSTEAD OF INSERT,UPDATE,DELETE komutları
AS INSERT, UPDATE veya DELETE komutlarından biri
veya birkaçı yazılır.
TSQL Kodları

ilgili tabloya ilgili işlem veya işlemler FOR ve AFTER ayni işlemi yapar.
yapıldığında AS komutundan sonra gelecek Dolayısıyla burada FOR/AFTER veya INSTEAD OF
TSQL kodları yazılır. komutlarından biri seçilir.
Örnek1
• Aşağıdaki trigger, öğrenci tablosuna ekleme yapıldığı zaman tetiklenecek ve AS den sonraki
T-SQL kodlarını çalıştıracak.

CREATE TRIGGER trg_deneme


ON ogrenci Kodlar hem INSERT işlemini
FOR/AFTER INSERT gerçekleştirir hem de AS den sonraki
AS işlemleri gerçekleştirir.
<kodlar>
Örnek2
CREATE TRIGGER trg_deneme CREATE TRIGGER trg_deneme
ON ogrenci ON ogrenci
INSTEAD OF INSERT INSTEAD OF INSERT, DELETE
AS AS
<kodlar> <kodlar>

Öğrenci tablosuna ekleme işlemi Öğrenci tablosuna ekleme veya silme


yapılmaya çalışıldığında, ekleme işlemi yapılmaya çalışıldığında ekleme ve
işlemi yapılmayacak bunun yerine silme işlemi yapılmayacak bunun yerine
AS den sonraki kodlar tetiklenecek. AS den sonraki kodlar tetiklenecek.
INSERTED ve DELETED Tabloları
• Trigger yapısının en önemli unsurlarından biri sözde (pseudo) tablolardır.
• Sözde tablolar, INSERTED ve DELETED olmak üzere iki adettir.
• Bu tablolar trigger anında RAM üzerinde mantıksal olarak bulunurlar, normalde yoktur.
• Gerçek veri tablosuna veri eklendiğinde, eklenen kayıt INSERTED tablosuna da eklenir.
• Tablodan bir kayıt silindiğinde ise silinen kayıt DELETED tablosunda da yer alır.
• Bu tablolar sadece okunabilirdir, herhangi bir değişiklik yapılamaz, tablolarda sadece bilgi
amaçlı olarak veriler saklanır.
INSERTED ve DELETED Tabloları
INSERTED TABLOSU DELETED TABLOSU

INSERT KOMUTU Yeni Eklenen Kayıt -

DELETE KOMUTU - Silinen Kayıt

UPDATE KOMUTU Güncelleştirilmiş Kayıt Güncelleştirmeden Önceki Kayıt

• Trigger’lar güncelleme işlemi için UPDATED isimli bir sözde tabloya sahip değildir.
• Güncellenen veriler ilk olarak silinerek DELETE işlemi ve sonrasında tekrar eklenerek INSERT
işlemi gerçekleştirilir.
Örnek1: Kayıt Ekleme ve Silme
OGR_NO AD SOYAD
1195613046 EMİR CEM ÖRGÜÇ
3195691033 ESMA YILDIZ
2165663338 MEHMET ÇELİK

• Tabloya aşağıdaki kayıt eklenmeye çalışılırsa; bu kayıt aynı zamanda INSERTED tablosunda da
saklanır.
INSERTED

1105613052 KÜBRA ÖZDEMİR

• Tablodan 1195613046 numaralı EMİR CEM ÖRGÜÇ kaydı silinmek istenirse; o zaman
DELETED tablosunda da kayıt yer alacaktır.
DELETED

1195613046 EMİR CEM ÖRGÜÇ


Örnek2: Kayıt Güncelleme
OGR_NO AD SOYAD
1195613046 EMİR CEM ÖRGÜÇ
3195691033 ESMA YILDIZ
2165663338 MEHMET ÇELİK

• Tabloda bulunan 3195691033 numaralı öğrencinin soyadı AY olarak güncellenmek


istendiğinde; INSERTED tablosunda yeni güncelleştirilmiş kayıt, DELETED tablosunda ise eski
kayıt yer alacaktır.
INSERTED
OGR_NO AD SOYAD
3195691033 ESMA AY

DELETED
OGR_NO AD SOYAD
3195691033 ESMA YILDIZ
Tablo Düzeyinde Trigger Silme
• Tablo düzeyindeki trigger nesnesini silmek için;
DROP TRIGGER <trigger adı>
Uygulama
• stok_takip adında bir veritabanı oluşturunuz.
• Veritabanı içinde iki tablo oluşturunuz.
• urunler(urun_no, urun_adi, stok_adedi)
• satis(satis_no, urun_no)
• Ürünler tablosuna 5 kayıt giriniz.
• Satış yapıldığında (yani satış tablosuna kayıt girildiğinde), ilgili
ürünün stok adedini bir azaltan trg_sat adında trigger nesnesini
oluşturunuz.
Uygulama
CREATE DATABASE stok_takip

CREATE TABLE urunler(urun_no int primary key not null, urun_adi varchar(30),
stok_adedi int )

CREATE TABLE satis(satis_no int primary key not null, urun_no int )
Uygulama
• trg_sat adlı trigger, satis tablosuna insert yapılırken stok adedini 1 azaltmalıdır.
Uygulama
CREATE TRIGGER trg_sat trg_sat adında satis tablosunda Insert işlemi için bir
trigger oluşturur ve AS den sonraki komutlar
ON satis
tetiklenir
FOR INSERT
AS
@satilan_urun_no adında bir değişken tanımlanır

DECLARE @satilan_urun_no int


SELECT @satilan_urun_no=urun_no FROM INSERTED

UPDATE urunler SET stok_adedi=stok_adedi-1


satış tablosuna eklenen yani satış yapılan
WHERE urun_no=@satilan_urun_no ürünün numarası inserted tablosundan çekilir.

Update komutu ile ilgili ürünün adeti 1 azaltılır. Böylelikle satış tablosuna bir kayıt
eklendiğinde tetikleme başlar ve otomatik olarak ürünler tablosunda güncelleme yapılır.
Ödev
• Satış tablosunda satış adeti için adet adında bir alan ekleyin.
• Satış tablosuna girilen adet kadar, ürünler tablosundan stok azaltan trigger nesnesini yazın.
• Eğer stok satış yapılamayacak kadarsa yani stokta yeterli ürün yoksa satış işlemi iptal edilsin.
Kaynaklar
• Yazılımcılar için SQL Server 2014 ve Veritabanı Programlama, Yaşar Gözüdeli, Seçkin Yayınları
• Veritabanı İlkeleri ve Yönetim Sistemleri, Bora Aslan vd, Paradigma Akademi
Veritabanı Yönetim Sistemleri-II
Dr.Öğr.Üyesi Füsun YAVUZER ASLAN

You might also like