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 (BEFORE tetikleyiciler).
  • 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:

  • AFTER Tetikleyiciler: İ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.
  • BEFORE Tetikleyiciler: İlgili SQL olayı gerçekleşmeden önce tetiklenir (SQL Server’da INSTEAD OF tetikleyiciler bu senaryoların bir kısmını karşılar, diğer veritabanlarında BEFORE bulunur). Genellikle veri doğrulama ve veri üzerinde değişiklik yapma için kullanılır.
  • INSTEAD OF Tetikleyiciler: 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.