21 Mart 2013 Perşembe

MS SQL'de View, Stored Procedure, Function ve Trigger

Merhaba Webkolog takipçileri!

SQL Server'da sadece tablolar ve verilerle değil, aynı zamanda bu veriler üzerinde işlemler yapmamızı, karmaşık iş mantıklarını saklamamızı ve veri bütünlüğünü sağlamamızı sağlayan birçok güçlü obje bulunur. Bugün sizlerle, veri tabanı yönetimini ve uygulama geliştirmeyi çok daha kolay ve verimli hale getiren View, Stored Procedure, Function ve Trigger gibi önemli veri tabanı objelerini inceleyeceğiz. Hazırsanız, SQL Server'ın "akıllı" bileşenlerini tanımaya başlayalım!

---

1. VIEW: Sanal Tablolarla Veri Sunumu

Bir View (Görünüm), bir veya birden fazla tablodan veri çekerek oluşturduğumuz sanal bir tablodur. Kendi başına veri saklamaz, sadece temel tablolardaki verileri belirli bir sorgu sonucuna göre sunar. View'ler, karmaşık sorguları basitleştirmek, güvenlik sağlamak ve veri tutarlılığını artırmak için harikadır.

Neden Kullanılır?
  • Sorgu Karmaşıklığını Azaltma: Sık kullanılan, karmaşık JOIN'li sorguları bir View olarak kaydederek, daha sonra sadece View'i seçerek bu verilere kolayca erişebilirsiniz.
  • Güvenlik: Kullanıcılara tüm tabloya erişim izni vermek yerine, sadece belirli sütunları veya satırları gösteren bir View üzerinden erişim sağlayabilirsiniz. Bu, veri güvenliğini artırır.
  • Veri Tutarlılığı ve Basitleştirme: Birden fazla tablodan gelen verileri tek bir mantıksal birimde toplayarak, kullanıcıların veriyle etkileşimini basitleştirir.
View Oluşturma ve Kullanma
-- Örnek bir tablo olduğunu varsayalım: Personel (isim, soyad, yas)
-- Yaşı 30'dan büyük personeli gösteren bir View oluşturalım
CREATE VIEW v_BuyukYasliPersonel AS
SELECT isim, soyad, yas
FROM Personel
WHERE yas > 30;

-- View'i çağırma (Tıpkı bir tablo gibi)
SELECT * FROM v_BuyukYasliPersonel;

-- Başka bir örnek: Sadece 'Yazı' değeri 1 olan kayıtları gösteren View
CREATE VIEW v_TabloVerileri AS
SELECT yazi
FROM TabloAdi
WHERE sayi = 1;

-- View'den veri çekme
SELECT * FROM v_TabloVerileri;
Önemli Notlar:
  • View'ler genellikle veri ekleme (INSERT), güncelleme (UPDATE) veya silme (DELETE) işlemleri için tasarlanmamıştır, ancak bazı basit View'lerde bu işlemler dolaylı olarak yapılabilir. Ancak genel kural, View'lerin sadece veri sunumu için kullanıldığıdır.
  • Bir View'de ORDER BY kullanmak isterseniz, genellikle TOP ifadesi ile birlikte kullanmanız gerekir. Aksi takdirde, sorgu View'in çağrıldığı yere göre sıralanabilir.
  • WITH SCHEMABINDING seçeneği ile oluşturulan View'ler, temel tabloların yapısının (örneğin sütun adlarının) View oluşturulduktan sonra değiştirilmesini engeller. Bu, View'in bağımlılığını güvence altına alır.
  • WITH ENCRYPTION seçeneği ile oluşturulan View'lerin tanımı şifrelenir ve doğrudan okunamaz.
  • View'ler 1024'ten fazla sütun içeremez.
---

2. STORED PROCEDURE: Saklı Yordamlarla İş Mantığı

Bir Stored Procedure (Saklı Yordam), bir veya daha fazla SQL ifadesinden oluşan ve veri tabanında derlenmiş olarak saklanan bir kod bloğudur. Tekrar tekrar kullanılabilir, parametre alabilir ve sonuç döndürebilirler. İş mantığını uygulamanızdan veri tabanına taşımanın en yaygın yoludur.

Neden Kullanılır?
  • Performans: Bir kez derlenir ve bellekte saklanır. Her çağrıldığında tekrar derlenmesine gerek kalmaz, bu da performansı artırır.
  • Güvenlik: Kullanıcılara doğrudan tablolara erişim izni vermek yerine, sadece Stored Procedure'leri çalıştırma yetkisi verilebilir. Böylece hassas verilere doğrudan erişimi engellenir.
  • Kod Tekrarı Azaltma: Sık kullanılan karmaşık işlemleri bir prosedürde toplayarak kod tekrarını önler ve bakımı kolaylaştırır.
  • Ağ Trafiğini Azaltma: Uygulamadan veri tabanına gönderilen komut sayısı azalır, çünkü tek bir prosedür çağrısı birden fazla SQL işlemini tetikleyebilir.
  • Modülerlik: Uygulama katmanı ile veri tabanı katmanı arasında bir soyutlama sağlar.
Stored Procedure Oluşturma ve Kullanma
-- Basit, parametreli bir Stored Procedure oluşturma
CREATE PROCEDURE sp_OgrenciBilgiGetir
    @OgrenciID INT,
    @AdSoyad NVARCHAR(100) OUTPUT -- Çıktı parametresi
AS
BEGIN
    SELECT isim, soyad, email
    FROM Ogrenciler
    WHERE ID = @OgrenciID;

    -- Örnek çıktı parametresi ataması
    SELECT @AdSoyad = isim + ' ' + soyad
    FROM Ogrenciler
    WHERE ID = @OgrenciID;
END;

-- Stored Procedure'ü çalıştırma
DECLARE @GelenAdSoyad NVARCHAR(100);
EXEC sp_OgrenciBilgiGetir @OgrenciID = 1, @AdSoyad = @GelenAdSoyad OUTPUT;
SELECT 'Gelen Ad Soyad: ' + @GelenAdSoyad;

-- Parametresiz Stored Procedure
CREATE PROCEDURE sp_TumUrunleriGetir
AS
BEGIN
    SELECT UrunAdi, Fiyat, StokMiktari
    FROM Urunler;
END;

-- Parametresiz Stored Procedure'ü çalıştırma
EXEC sp_TumUrunleriGetir;
Önemli Notlar:
  • CREATE PROCEDURE yerine CREATE PROC, EXECUTE yerine EXEC kısaltmaları kullanılabilir.
  • Mevcut bir prosedürü değiştirmek için ALTER PROCEDURE kullanılır.
  • Stored Procedure'ler kendi içinde başka SQL ifadeleri veya başka prosedürleri çağırabilir.
  • OUTPUT parametreleri ile prosedürden değer döndürülebilir. Ayrıca RETURN anahtar kelimesi ile bir tamsayı durum kodu döndürülebilir.
---

3. FUNCTION: Fonksiyonlarla Tekrar Kullanılabilir Hesaplamalar

MS SQL'de Function (Fonksiyon), belirli bir hesaplama veya işlem sonucunda tek bir değer (scalar function) veya bir tablo (table-valued function) döndüren bir veri tabanı objesidir. Stored Procedure'lerden farklı olarak, fonksiyonlar genellikle daha küçük, odaklanmış işlemler için kullanılır ve bir sorgu içinde çağrılabilirler.

Neden Kullanılır?
  • Hesaplama Tekrarı: Sık kullanılan karmaşık hesaplamaları bir kez yazıp defalarca kullanmanızı sağlar.
  • Kod Okunurluğu: Sorguları daha temiz ve okunabilir hale getirir.
  • Performans: Stored Procedure'ler gibi derlenerek performans artışı sağlayabilir.
Fonksiyon Çeşitleri ve Kullanımı
Scalar (Tekil Değer Döndüren) Fonksiyonlar

Tek bir değer döndüren fonksiyonlardır. Bir sütun gibi sorgularınızda kullanılabilirler.

-- Belirtilen sayının karesini alan bir fonksiyon
CREATE FUNCTION dbo.fn_KaresiniAl (@sayi INT)
RETURNS INT
AS
BEGIN
    RETURN @sayi * @sayi;
END;

-- Fonksiyonu SELECT sorgusu içinde kullanma
SELECT dbo.fn_KaresiniAl(5) AS BesinKaresi;

-- Tablodaki verilerle birlikte kullanma
SELECT UrunAdi, Fiyat, dbo.fn_KaresiniAl(StokMiktari) AS StokKaresi
FROM Urunler;
Table-Valued (Tablo Değerli) Fonksiyonlar

Sonuç olarak bir tablo döndüren fonksiyonlardır. Bu fonksiyonlar bir View gibi sorgularınızın FROM kısmında kullanılabilir.

-- Belirli bir kategoriye ait ürünleri döndüren tablo değerli fonksiyon
CREATE FUNCTION dbo.fn_KategoriyeGoreUrunler (@KategoriID INT)
RETURNS TABLE
AS
RETURN
(
    SELECT UrunAdi, Fiyat, StokMiktari
    FROM Urunler
    WHERE KategoriID = @KategoriID
);

-- Fonksiyonu çağırma (tıpkı bir tablo gibi)
SELECT * FROM dbo.fn_KategoriyeGoreUrunler(1); -- Kategori ID'si 1 olan ürünleri getir
Önemli Notlar:
  • Fonksiyonlar, Stored Procedure'ler gibi INSERT, UPDATE, DELETE gibi DML işlemleri yapamazlar (sadece tablo değerli fonksiyonlar kendi içlerinde SELECT yapabilir).
  • Fonksiyonlar bir sorgu içinde çağrılabilirken, Stored Procedure'ler EXEC komutu ile çağrılır ve genellikle ayrı birer komut olarak çalışır.
---

4. TRIGGER: Otomatik Olay Tetikleyicileri

Bir Trigger (Tetikleyici), bir veri tabanı tablosunda belirli bir DML olayı (INSERT, UPDATE veya DELETE) gerçekleştiğinde otomatik olarak çalışan özel bir Stored Procedure türüdür. Veri bütünlüğünü sağlamak, iş kurallarını zorlamak veya denetim (auditing) kayıtları oluşturmak için kullanılırlar.

Neden Kullanılır?
  • Veri Bütünlüğü: Bir tablodaki değişiklikler başka bir tabloyu etkilediğinde otomatik güncellemeler yapma.
  • İş Kuralları Uygulama: Belirli bir koşul sağlandığında veri üzerinde ek kontroller veya işlemler yapma.
  • Denetim (Auditing): Hangi kullanıcının hangi veriyi ne zaman değiştirdiğini kaydetme.
  • Karmaşık İlişkisel Bütünlük: FOREIGN KEY kısıtlamalarının ötesinde daha karmaşık ilişkisel bütünlük kurallarını uygulama.
Trigger Çeşitleri ve Kullanımı

Trigger'lar genellikle AFTER veya INSTEAD OF olmak üzere iki ana türdedir:

  • AFTER Trigger: DML işlemi (INSERT, UPDATE, DELETE) başarılı bir şekilde tamamlandıktan sonra tetiklenir. En yaygın kullanılan türdür.
  • INSTEAD OF Trigger: DML işlemi yerine tetiklenir. Yani DML işlemi gerçekleşmeden önce Trigger çalışır ve işlemin kendisini engeller veya farklı bir işlem yapmasını sağlar. Genellikle View'ler üzerinde veri manipülasyonu yapmak için kullanılır.

Trigger'lar içerisinde, gerçekleşen DML olayıyla ilgili geçici tablolar olan INSERTED ve DELETED tablolarına erişebilirsiniz:

  • INSERTED: INSERT ve UPDATE işlemleri sırasında yeni eklenen veya güncellenen verilerin (yeni hali) bulunduğu sanal tablodur.
  • DELETED: DELETE ve UPDATE işlemleri sırasında silinen veya güncellenen verilerin (eski hali) bulunduğu sanal tablodur.
Trigger Oluşturma Örnekleri
-- AFTER INSERT Trigger: Bir tabloya yeni kayıt eklendiğinde başka bir tabloya loglama
CREATE TRIGGER tg_LogPersonelEkleme
ON Personel
AFTER INSERT
AS
BEGIN
    -- INSERTED tablosundaki yeni eklenen verileri LOG tablosuna kopyala
    INSERT INTO PersonelLog (IslemTipi, PersonelID, IslemTarihi)
    SELECT 'Ekleme', ID, GETDATE() FROM INSERTED;

    -- Eklenen personelin adını başka bir tabloya kopyalama örneği
    DECLARE @yeniAd NVARCHAR(50);
    SELECT @yeniAd = isim FROM INSERTED;
    INSERT INTO YedekPersonelIsimleri (YedekAd) VALUES (@yeniAd);
END;

-- INSTEAD OF DELETE Trigger: Tablodan silme işlemini engelleme veya özel bir işlem yapma
-- Örneğin, kaydı tamamen silmek yerine 'Aktif' durumunu 'Pasif' yapalım
CREATE TRIGGER tg_PersonelSilmeYerinePasifYap
ON Personel
INSTEAD OF DELETE
AS
BEGIN
    -- Silinmek istenen kaydın ID'sini DELETED tablosundan al
    DECLARE @silinecekID INT;
    SELECT @silinecekID = ID FROM DELETED;

    -- Kaydı silmek yerine durumunu 'Pasif' yap
    UPDATE Personel
    SET Durum = 'Pasif'
    WHERE ID = @silinecekID;

    PRINT 'Kayıt silinmedi, durumu pasif yapıldı.';
END;
Önemli Notlar:
  • Trigger'lar genellikle veri tabanının içinde, yani "arka planda" çalışır ve kullanıcının doğrudan müdahalesi olmadan tetiklenir.
  • Nested Trigger (İç İçe Trigger): Bir Trigger'ın başka bir Trigger'ı tetiklemesidir. Varsayılan olarak etkin olabilir ve maksimum 32 seviyeye kadar desteklenir.
  • Recursive Trigger (Özyinelemeli Trigger): Bir Trigger'ın, kendi tablosunda yaptığı bir değişikliğin tekrar kendisini tetiklemesidir. Genellikle istenmeyen bir durumdur ve dikkatli olunmalıdır.
  • Web uygulamalarında doğrudan Trigger kullanmaktan ziyade, iş mantığını uygulama katmanında yönetmek ve veri bütünlüğünü Stored Procedure'ler, Function'lar ve kısıtlamalar (CONSTRAINT) ile sağlamak daha esnek ve yönetilebilir olabilir. Trigger'lar genellikle son çare veya çok spesifik veri tabanı seviyesi işler için kullanılır.

MS SQL'deki View'ler, Stored Procedure'ler, Function'lar ve Trigger'lar, veri tabanı geliştirme süreçlerinizi çok daha güçlü ve esnek hale getirir. Her birinin kendine özgü kullanım alanları ve avantajları vardır. Bu yapıları doğru senaryolarda kullanarak, hem performansı artırabilir hem de veri tabanı uygulamanızın bakımını kolaylaştırabilirsiniz.

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder