- Katılım
- 7 Nis 2025
- Konular
- 367
- Mesajlar
- 780
- Çözümler
- 1
- Tepkime puanı
- 121
- Puan
- 93
- Konum
- İstanbul
- Web sitesi
- forumagel.com
Saklı Yordamlar ve Fonksiyonlar, ihtiyacımız olduğunda çağırdığımız kod bloklarıdır. Ancak bazen, belirli bir olay (örneğin bir tabloya yeni bir satır eklendiğinde veya mevcut bir satır güncellendiğinde) meydana geldiğinde veritabanının otomatik olarak belirli bir eylemi gerçekleştirmesini isteyebiliriz. İşte Tetikleyiciler (Triggers) tam olarak bu amaçla kullanılır. Bir tetikleyici, bir tabloda belirli bir veri değiştirme işlemi (INSERT, UPDATE, DELETE) gerçekleştiğinde otomatik olarak çalışan, veritabanında depolanan özel bir saklı yordam türüdür.
Tetikleyicilerin Amacı ve Kullanım Alanları
Tetikleyiciler genellikle şu amaçlarla kullanılır:
Bir tetikleyici tanımlarken şu unsurlar belirtilir:
Tetikleyicilerin Dikkatli Kullanımı
Tetikleyiciler güçlü araçlar olsa da, kullanımları bazı potansiyel dezavantajları beraberinde getirebilir:
Bu bölümde, veritabanının otomatik tepkilerini yöneten tetikleyiciler konusuna giriş yaptık. Bu, veritabanı programlama yeteneklerinizi tamamlayan önemli bir konudur.
Veritabanı sistemleri ve SQL'in sunduğu imkanlar oldukça geniştir. Bu seri, size temelden ileri seviyeye kadar birçok konuda bir başlangıç ve genel bir bakış sunmayı amaçladı.
Eğer bu seriyi daha da genişletmek isterseniz, belirli bir DBMS'in detaylarına inmek, farklı indeks türlerini ve daha gelişmiş performans ayarlamalarını ele almak, belki de dağıtık veritabanı sistemleri veya bulut veritabanı hizmetleri gibi modern konulara daha derinlemesine dalmak gibi seçenekler değerlendirilebilir.
Umarım bu ek bölüm de veritabanı bilginize katkı sağlamıştır.
Tetikleyicilerin Amacı ve Kullanım Alanları
Tetikleyiciler genellikle şu amaçlarla kullanılır:
- Karmaşık İş Kurallarını Uygulama:
CHECK CONSTRAINT
ile uygulanamayan daha karmaşık iş mantığını veya birden fazla tabloyu etkileyen kuralları uygulamak. - Denetim Kayıtları (Auditing): Tablolardaki veri değişikliklerini (kim, ne zaman, neyi değiştirdi) otomatik olarak başka bir denetim tablosuna kaydetmek.
- Veri Bütünlüğünü Sağlama: İlişkili tablolarda otomatik güncellemeler veya silmeler yaparak veri tutarlılığını korumak (bazı DBMS'lerde
ON UPDATE CASCADE
veyaON DELETE CASCADE
gibi referans bütünlüğü kısıtlamaları tercih edilebilir). - Türetilmiş Verileri Otomatik Güncelleme: Bir tablodaki verilere bağlı olarak başka bir tablodaki özet veya türetilmiş verileri otomatik olarak güncellemek (örneğin, sipariş detayları eklendiğinde ana sipariş tablosundaki toplam sipariş tutarını güncellemek).
Bir tetikleyici tanımlarken şu unsurlar belirtilir:
- Olay (Event): Tetikleyicinin çalışmasına neden olan DML (Data Manipulation Language) işlemi. Bunlar
INSERT
,UPDATE
veyaDELETE
olabilir. Bir tetikleyici birden fazla olaya yanıt verebilir (ON INSERT OR UPDATE OR DELETE
). - Zamanlama (Timing): Olaydan önce mi (
BEFORE
) yoksa sonra mı (AFTER
) çalışacağı.BEFORE
tetikleyiciler, veri değiştirme işlemi gerçekleşmeden önce çalışır. Genellikle veriyi doğrulamak veya değiştirmek için kullanılır.AFTER
tetikleyiciler, veri değiştirme işlemi tamamlandıktan sonra çalışır. Genellikle denetim, ilişkili tablolarda güncelleme veya diğer yan etkileri gerçekleştirmek için kullanılır.- (Not: SQL Server gibi bazı DBMS'lerde
INSTEAD OF
tetikleyiciler de bulunur, bunlar olayın kendisi yerine çalışır ve özellikle görünümlerde (views) güncelleme yapmak için faydalıdır.)
- Tablo (Table): Tetikleyicinin tanımlandığı ve olayın gerçekleştiği tablo.
- Aksiyon (Action): Olay meydana geldiğinde tetikleyicinin çalıştıracağı SQL kodu bloğu.
INSERT
veUPDATE
tetikleyicilerinde, yeni veya güncellenmiş satırları içeren bir "inserted" (veya benzeri) yapı.DELETE
veUPDATE
tetikleyicilerinde, silinmiş veya güncellenmeden önceki orijinal satırları içeren bir "deleted" (veya benzeri) yapı.Bu yapılar, tetikleyici kodunun etkilenen verilere erişmesini ve işlem yapmasını sağlar.
Kod:
-- Basit bir AFTER INSERT tetikleyicisi oluşturma (Örnek: Sipariş detayları eklendiğinde ana sipariş tablosunu güncelleme)CREATE TRIGGER trig_SiparisDetaylari_AFTER_INSERTAFTER INSERT ON SiparisDetaylariFOR EACH ROW -- PostgreSQL, MySQL gibi bazılarında satır bazlı tetikleyici için kullanılırASBEGIN-- SQL Server sözdizimi örneği:-- inserted tablosu yeni eklenen satırları içerirUPDATE SiparislerSET ToplamTutar = ToplamTutar + inserted.Miktar * inserted.Fiyat -- Basit bir hesaplama varsayımıFROM insertedWHERE Siparisler.SiparisID = inserted.SiparisID;
-- PostgreSQL/MySQL sözdizimi örneği (FOR EACH ROW ve NEW kullanarak):<br>-- UPDATE Siparisler<br>-- SET ToplamTutar = ToplamTutar + NEW.Miktar * NEW.Fiyat<br>-- WHERE Siparisler.SiparisID = NEW.SiparisID;<br>
END;GO -- SQL Server
Kod:
-- Basit bir AFTER DELETE tetikleyicisi oluşturma (Örnek: Sipariş detayları silindiğinde ana sipariş tablosunu güncelleme)CREATE TRIGGER trig_SiparisDetaylari_AFTER_DELETEAFTER DELETE ON SiparisDetaylariFOR EACH ROW -- PostgreSQL, MySQL gibi bazılarındaASBEGIN-- SQL Server sözdizimi örneği:-- deleted tablosu silinen satırları içerirUPDATE SiparislerSET ToplamTutar = ToplamTutar - deleted.Miktar * deleted.Fiyat -- Basit bir hesaplama varsayımıFROM deletedWHERE Siparisler.SiparisID = deleted.SiparisID;
-- PostgreSQL/MySQL sözdizimi örneği (FOR EACH ROW ve OLD kullanarak):<br>-- UPDATE Siparisler<br>-- SET ToplamTutar = ToplamTutar - OLD.Miktar * OLD.Fiyat<br>-- WHERE Siparisler.SiparisID = OLD.SiparisID;<br>
END;GO -- SQL Server
Tetikleyicilerin Dikkatli Kullanımı
Tetikleyiciler güçlü araçlar olsa da, kullanımları bazı potansiyel dezavantajları beraberinde getirebilir:
- Karmaşıklık ve Hata Ayıklama: Tetikleyiciler arka planda otomatik çalıştığı için, ne zaman ve neden çalıştıklarını anlamak zor olabilir. Hata ayıklaması diğer SQL kodlarına göre daha zahmetli olabilir.
- Performans Etkisi: İyi yazılmamış veya çok karmaşık tetikleyiciler, DML işlemlerinin performansını ciddi şekilde düşürebilir.
- Gizli Mantık: İş mantığının bir kısmı uygulama kodunda, bir kısmı saklı yordamlarda ve bir kısmı tetikleyicilerde olduğunda, sistemin genel işleyişini anlamak zorlaşabilir.
Bu bölümde, veritabanının otomatik tepkilerini yöneten tetikleyiciler konusuna giriş yaptık. Bu, veritabanı programlama yeteneklerinizi tamamlayan önemli bir konudur.
Veritabanı sistemleri ve SQL'in sunduğu imkanlar oldukça geniştir. Bu seri, size temelden ileri seviyeye kadar birçok konuda bir başlangıç ve genel bir bakış sunmayı amaçladı.
Eğer bu seriyi daha da genişletmek isterseniz, belirli bir DBMS'in detaylarına inmek, farklı indeks türlerini ve daha gelişmiş performans ayarlamalarını ele almak, belki de dağıtık veritabanı sistemleri veya bulut veritabanı hizmetleri gibi modern konulara daha derinlemesine dalmak gibi seçenekler değerlendirilebilir.
Umarım bu ek bölüm de veritabanı bilginize katkı sağlamıştır.