SQL veritabanı yönetiminde, verimlilik, güvenlik ve veri bütünlüğü kritik öneme sahiptir. Bu bağlamda, Görünümler (Views), Saklı Yordamlar (Stored Procedures) ve Tetikleyiciler (Triggers) gibi yapısal elemanlar, geliştiricilere güçlü araçlar sunar. Bu makale, söz konusu bu temel SQL bileşenlerinin ne işe yaradığını, nasıl kullanıldığını ve veritabanı işlemlerini nasıl optimize ettiğini ayrıntılarıyla inceleyecektir.
SQL Görünümler (Views)
Görünümler, SQL’de fiziksel olarak veri depolamayan, ancak bir veya daha fazla temel tablonun verilerinden türetilmiş sanal tablolardır. Bir görünüm aslında kaydedilmiş bir sorgudan ibarettir ve her çağrıldığında bu sorgu çalıştırılır. Görünümler, kullanıcılar için veri erişimini basitleştirir ve veri soyutlama katmanı oluşturur.
Görünümlerin Kullanım Amaçları
- Güvenlik ve Veri Gizliliği: Kullanıcılara tüm tabloyu göstermek yerine, sadece yetkili oldukları belirli sütun veya satırları içeren görünümler sunularak hassas veriler gizlenebilir. Bu, yetkilendirme katmanını veritabanı seviyesine taşır.
- Sorgu Basitliği ve Veri Soyutlama: Karmaşık JOIN’ler ve filtrelemeler içeren uzun sorguları bir görünüm içinde saklayarak, son kullanıcıların bu karmaşıklığı anlamadan sadece basit
SELECT * FROM view_adı;gibi ifadelerle verilere erişmesini sağlar. - Veri Bütünlüğü ve Tutarlılık: Farklı tablolardan birleştirilmiş veriyi tutarlı bir yapı altında sunarak, raporlama veya analiz süreçlerini kolaylaştırır.
- Uyumluluk: Temel tablo yapısı değişse bile (örneğin sütun adları), görünüm tanımı güncellenerek uygulama katmanının etkilenmemesi sağlanabilir.
Görünüm Oluşturma ve Kullanımı
Bir görünüm, CREATE VIEW ifadesiyle oluşturulur. Örneğin, müşteri ve sipariş bilgilerini birleştiren bir görünüm:
CREATE VIEW MusteriSiparisDetay AS
SELECT
m.MusteriID,
m.Ad,
m.Soyad,
s.SiparisID,
s.SiparisTarihi,
s.ToplamTutar
FROM
Musteriler m
JOIN
Siparisler s ON m.MusteriID = s.MusteriID
WHERE
s.SiparisTarihi > '2023-01-01';
Bu görünümü kullanmak tıpkı bir tablo kullanmak gibidir:
SELECT MusteriID, Ad, Soyad, SiparisTarihi FROM MusteriSiparisDetay WHERE ToplamTutar > 1000;
Mevcut bir görünümü değiştirmek için ALTER VIEW, silmek için ise DROP VIEW kullanılır.
Saklı Yordamlar (Stored Procedures)
Saklı yordamlar, bir veya daha fazla SQL ifadesinden oluşan, önceden derlenmiş ve veritabanında saklanan programatik bloklardır. Bu yordamlar, parametre alabilir, kontrol akışı ifadeleri (IF, WHILE) içerebilir ve geri değer döndürebilirler.
Saklı Yordamların Kullanım Amaçları
- Performans İyileştirme: Saklı yordamlar ilk çağrıldığında derlenir ve veritabanı sunucusunda önbelleğe alınır. Sonraki çağrılarda tekrar derlenmeye gerek kalmadığından daha hızlı çalışır. Ayrıca, ağ trafiğini azaltır çünkü uygulama sadece yordam adını ve parametrelerini gönderir, tüm SQL kodunu değil.
- Güvenlik: Kullanıcılara doğrudan tablolara erişim vermek yerine, belirli işlemleri gerçekleştiren saklı yordamlara erişim izni verilerek daha güvenli bir ortam sağlanır. Bu, veri manipülasyonunu ve yetkilendirmeyi merkezi hale getirir.
- Modülerlik ve Yeniden Kullanılabilirlik: Sık kullanılan veya karmaşık iş mantığına sahip işlemleri tek bir yordamda toplayarak kodun tekrar yazılmasını önler ve bakım kolaylığı sağlar.
- Veri Bütünlüğü ve Tutarlılık: Veritabanı seviyesinde iş kurallarını uygulayarak, veri girişi veya güncellemelerinde tutarlılığı garanti eder.
Saklı Yordam Oluşturma ve Kullanımı
Bir saklı yordam CREATE PROCEDURE ifadesiyle tanımlanır. Aşağıdaki örnek, yeni bir müşteri ekleyen bir yordamı gösterir:
CREATE PROCEDURE YeniMusteriEkle
@Ad NVARCHAR(50),
@Soyad NVARCHAR(50),
@Email NVARCHAR(100)
AS
BEGIN
INSERT INTO Musteriler (Ad, Soyad, Email)
VALUES (@Ad, @Soyad, @Email);
SELECT SCOPE_IDENTITY() AS YeniMusteriID; -- Eklenen müşterinin ID'sini döndürür
END;
Bu yordam EXEC veya EXECUTE komutuyla çağrılır:
EXEC YeniMusteriEkle 'Ayşe', 'Yılmaz', 'ayse.yilmaz@example.com';
Saklı yordamlar OUT parametreleri aracılığıyla da değer döndürebilir, bu da daha karmaşık işlevsellik sunar.
Tetikleyiciler (Triggers)
Tetikleyiciler, belirli bir tabloda INSERT, UPDATE veya DELETE gibi bir olay meydana geldiğinde otomatik olarak çalışan özel saklı yordam türleridir. Tetikleyiciler, veritabanı seviyesinde iş kurallarını zorlamak, denetim (auditing) kayıtları tutmak veya basamaklı değişiklikler yapmak için kullanılır.
Tetikleyicilerin Kullanım Amaçları
- Otomatik İşlemler: Bir veri değişikliği olduğunda otomatik olarak başka bir işlemi tetikleyerek veritabanı düzeyinde iş mantığı uygular.
- Denetim (Auditing): Bir tablodaki veri değişikliklerini (kimin, ne zaman, neyi değiştirdiğini) bir denetim tablosuna kaydetmek için idealdir.
- Veri Doğrulama: Bir kayıt eklenmeden veya güncellenmeden önce verinin belirli kurallara uygunluğunu kontrol etmek ve gerekirse işlemi iptal etmek için kullanılabilir (
BEFOREtetikleyiciler). - Basamaklı Değişiklikler (Cascading Changes): Bir tabloda yapılan değişikliğin, ilgili diğer tablolara otomatik olarak yansımasını sağlamak (örneğin, bir kullanıcının silinmesiyle ilişkili tüm yorumlarını da silmek).
Tetikleyici Türleri ve Oluşturma
Tetikleyiciler, olayın zamanlamasına göre farklı türlerde olabilir:
AFTERTetikleyiciler: İlgili SQL olayı (INSERT, UPDATE, DELETE) gerçekleştikten sonra tetiklenir. Çoğunlukla denetim veya başka bir tabloda veri güncellemek için kullanılır.BEFORETetikleyiciler: İlgili SQL olayı gerçekleşmeden önce tetiklenir (SQL Server’daINSTEAD OFtetikleyiciler bu senaryoların bir kısmını karşılar, diğer veritabanlarındaBEFOREbulunur). Genellikle veri doğrulama ve veri üzerinde değişiklik yapma için kullanılır.INSTEAD OFTetikleyiciler: Olayın kendisi yerine tetiklenir. Genellikle doğrudan güncellenemeyen görünümleri (JOIN içeren görünümler gibi) güncellemek için kullanılır.
Aşağıdaki örnek, bir ürünün fiyatı güncellendiğinde, eski ve yeni fiyatı bir log tablosuna kaydeden bir AFTER UPDATE tetikleyiciyi gösterir:
CREATE TRIGGER trg_UrunFiyatGuncellemeLog
ON Urunler
AFTER UPDATE
AS
BEGIN
IF UPDATE(Fiyat) -- Sadece Fiyat sütunu güncellendiğinde çalışır
BEGIN
INSERT INTO UrunFiyatLog (UrunID, EskiFiyat, YeniFiyat, GuncellemeTarihi, GuncelleyenKullanici)
SELECT
d.UrunID,
d.Fiyat AS EskiFiyat,
i.Fiyat AS YeniFiyat,
GETDATE(),
SUSER_SNAME() -- Güncelleyen kullanıcı adını alır
FROM
DELETED d
INNER JOIN
INSERTED i ON d.UrunID = i.UrunID;
END;
END;
INSERTED ve DELETED sanal tabloları, tetikleyici içinde ilgili olayın eski ve yeni değerlerine erişmek için kullanılır. INSERTED tablosu yeni eklenen veya güncellenen satırları, DELETED tablosu ise silinen veya güncellenmeden önceki satırları içerir.
SQL’deki Görünümler, Saklı Yordamlar ve Tetikleyiciler, modern veritabanı yönetiminin temel taşlarıdır. Veri güvenliğini artırırken, karmaşık sorguları basitleştirir, performansı optimize eder ve iş mantığını veritabanı seviyesinde uygularlar. Bu araçları etkin bir şekilde kullanarak, geliştiriciler daha sağlam, bakımı kolay ve performanslı veritabanı uygulamaları oluşturabilir, böylece veri bütünlüğünü ve sistem verimliliğini garantileyebilirler.