SQL Trigger Nedir?
Veritabanlarında otomatik işlem yapmayı düşündünüz mü? SQL Trigger’lar, tam da bu noktada işinizi kolaylaştıracak güçlü bir araçtır. Bu yazıda, SQL Trigger kavramını detaylıca öğrenip, örneklerle kullanımını göreceksiniz.
SQL Trigger, bir veritabanı tablosunda belirli bir olay meydana geldiğinde (örneğin, INSERT, UPDATE veya DELETE işlemleri) otomatik olarak çalışan özel bir SQL komutudur. Trigger’lar, veri bütünlüğünü sağlamak, log tutmak, işlemleri otomatikleştirmek gibi işlemler için kullanılır.
Trigger Türleri
- AFTER Trigger:
- Belirtilen olay gerçekleştikten sonra tetiklenir.
- Genelde veritabanı bütünlüğü sağlamak veya log tutmak için kullanılır.
- INSTEAD OF Trigger:
- Belirtilen olayın yerine geçer.
- Özellikle VIEW’ler üzerinde kullanılabilir.
- BEFORE Trigger:
- Belirtilen olay gerçekleşmeden önce tetiklenir.
- Veri doğrulama veya değiştirme işlemleri için uygundur.
Trigger Yapısı
CREATE TRIGGER trigger_adi ON tablo_adi [AFTER | INSTEAD OF | BEFORE] [INSERT, UPDATE, DELETE] AS BEGIN -- Trigger'da çalışacak SQL komutları END
Örnekler
1. AFTER INSERT Trigger
Bu örnekte, bir tabloya yeni bir kayıt eklendiğinde başka bir tabloya log kaydı eklenir.
CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, Name NVARCHAR(50), Department NVARCHAR(50) ); CREATE TABLE EmployeeLogs ( LogID INT IDENTITY(1,1) PRIMARY KEY, LogMessage NVARCHAR(255), LogDate DATETIME ); CREATE TRIGGER trg_AfterInsert ON Employees AFTER INSERT AS BEGIN DECLARE @Name NVARCHAR(50), @Department NVARCHAR(50); SELECT @Name = Name, @Department = Department FROM INSERTED; INSERT INTO EmployeeLogs (LogMessage, LogDate) VALUES ('Yeni çalışan eklendi: ' + @Name + ', Departman: ' + @Department, GETDATE()); END;
Kullanımı:
INSERT INTO Employees (EmployeeID, Name, Department) VALUES (1, 'Ali Yılmaz', 'IT');
Sonuç: EmployeeLogs
tablosuna log kaydı eklenir.
2. AFTER UPDATE Trigger
Bu örnekte, bir çalışanın departmanı değiştirildiğinde log tutulur.
CREATE TRIGGER trg_AfterUpdate ON Employees AFTER UPDATE AS BEGIN DECLARE @OldDept NVARCHAR(50), @NewDept NVARCHAR(50), @Name NVARCHAR(50); SELECT @OldDept = DELETED.Department, @NewDept = INSERTED.Department, @Name = INSERTED.Name FROM INSERTED INNER JOIN DELETED ON INSERTED.EmployeeID = DELETED.EmployeeID; IF @OldDept <> @NewDept BEGIN INSERT INTO EmployeeLogs (LogMessage, LogDate) VALUES ('Çalışanın departmanı değiştirildi: ' + @Name + ', Eski Departman: ' + @OldDept + ', Yeni Departman: ' + @NewDept, GETDATE()); END; END;
Kullanımı:
UPDATE Employees SET Department = 'HR' WHERE EmployeeID = 1;
Sonuç: Departman değişikliği loglanır.
3. INSTEAD OF DELETE Trigger
Bir kaydı silmek yerine, “soft delete” mantığı uygulanır (örneğin, kaydın IsDeleted
alanı true
yapılır).
ALTER TABLE Employees ADD IsDeleted BIT DEFAULT 0; CREATE TRIGGER trg_InsteadOfDelete ON Employees INSTEAD OF DELETE AS BEGIN UPDATE Employees SET IsDeleted = 1 WHERE EmployeeID IN (SELECT EmployeeID FROM DELETED); END;
Kullanımı:
DELETE FROM Employees WHERE EmployeeID = 1;
Sonuç: Kayıt tamamen silinmez, IsDeleted
alanı 1
olur.