Selamlar! Bugün biraz veritabanı dünyasına dalacağız ama öyle derinlere değil, hani şu orta seviye bir geliştiricinin bilmesi gereken ama bazen kafasını karıştıran bir konu var ya, işte o: Stored Procedure’lar. Hani şu ‘Stored Procedure nedir ya?’ diye sorduğumuzda, karşımıza çıkan acayip acayip kod blokları var ya, onlardan. Açıkçası ben de ilk duyduğumda biraz ürkmüştüm, sanki uzaydan gelmiş bir şey gibiydi. Ama zamanla anladım ki, aslında o kadar da korkutucu değilmiş, hatta işimizi bayağı kolaylaştıran sihirli değnekler gibi bir şey.
Şimdi öncelikle şunu bir netleştirelim, Stored Procedure dediğimiz şey aslında veritabanı sunucusunda saklanan, önceden derlenmiş bir dizi SQL komutu. Yani siz bir kere yazıyorsunuz, o veritabanının içinde duruyor. Sonra ihtiyaç duyduğunuzda sadece ismini çağırıp çalıştırıyorsunuz. Sanki evdeki temel malzemelerle hazırladığınız bir tarif gibi düşünün. Bir kere tarifi yazıyorsunuz, sonra canınız çektiğinde o tarifi alıp hemen yemeği yapıyorsunuz, her seferinde en baştan malzemeleri karıştırıp ölçmekle uğraşmıyorsunuz. Bu da hem zaman kazandırıyor hem de işleri standartlaştırıyor, ne güzel değil mi?
Peki neden kullanmalıyız bunu? İşte orada devreye birkaç tane önemli sebep giriyor. Birincisi, performans! Stored Procedure’lar önceden derlendiği için, her çalıştırıldığında tekrar tekrar derlenmezler. Bu da özellikle çok sık çağrılan veya karmaşık işlemler yapan sorgular için inanılmaz bir hız farkı yaratabiliyor. Hani böyle bazen bir sayfayı açmak için bekleriz ya dakikalarca, işte o bekleme sürelerini ciddi anlamda azaltabilir bu arkadaş.
İkincisi, güvenlik! Stored Procedure’lar, uygulamanızın veritabanına doğrudan erişmesini engelleyerek daha kontrollü bir ortam sağlıyor. Uygulamanız doğrudan tabloya müdahale etmek yerine, sadece o prosedürü çalıştırabiliyor. Bu da SQL injection gibi riskleri azaltıyor. Tabii ki bu tek başına bir çözüm değil ama katmanlı bir güvenlik oluşturmada önemli bir rolü var. Ayrıca, kullanıcı yetkilendirmesini de daha kolay yapmanızı sağlıyor; hangi kullanıcının hangi stored procedure’ı çalıştırabileceğini belirleyebiliyorsunuz.
Üçüncüsü, bakım ve tekrar kullanılabilirlik. Bir işlem için yazdığınız Stored Procedure’ı, projenizin farklı yerlerinde veya farklı projelerinizde bile tekrar tekrar kullanabilirsiniz. Bu da kod tekrarını azaltıyor, bakımını kolaylaştırıyor. Hani bir yerde bir hata buldunuz ve düzelttiniz, artık o hata başka yerlerde de olmayacak demek oluyor bu. Düşünsenize, bir kere kod yazıp defalarca kullanmak ne kadar güzel bir şey!
Bir de işin şöyle bir boyutu var: Uygulama mantığı ile veritabanı mantığını ayırmak. Stored Procedure’lar sayesinde, iş mantığının bir kısmını veritabanına taşıyabilirsiniz. Bu, özellikle büyük ve karmaşık sistemlerde mimariyi daha temiz tutmaya yardımcı olabilir. Yani her şeyi uygulamanın içinde yapmak yerine, veritabanının da işin bir parçası olmasını sağlayabiliyorsunuz. Ama tabii bu noktada da dikkatli olmak lazım, her şeyi veritabanına yüklemek de ileride başınızı ağrıtabilir, dengeli olmak önemli.
Şimdi gelelim pratik kısımlara. Diyelim ki bir kullanıcı ekleme işleminiz var. Bunu her seferinde ayrı ayrı INSERT sorguları göndermek yerine, tek bir Stored Procedure içinde yapabilirsiniz. Mesela şöyle bir şey düşünebiliriz: Kullanıcının adını, soyadını, e-postasını alırsınız, bir Stored Procedure’a gönderirsiniz ve o Stored Procedure da bu bilgileri alıp veritabanına kaydeder. Hatta gerekirse, aynı e-posta adresiyle daha önce kayıtlı kullanıcı var mı diye kontrol bile edebilir.
Örnek olarak, PostgreSQL üzerinde basit bir kullanıcı ekleme stored procedure’ı şöyle bir şeye benziyor olabilir:
Şimdi burada biraz kafa karışıklığı olabilir, hani ‘Bu ne böyle?’ diyebilirsiniz. Ama aslında temel mantığı çok basit.
Öncelikle bir fonksiyon tanımlıyoruz. Bu fonksiyona dışarıdan bazı parametreler alacağını söylüyoruz (kullanıcının adı, soyadı, e-postası gibi). Sonra `BEGIN` ve `END` arasına asıl işi yapacak SQL kodlarımızı yazıyoruz. Bu kodlar, gelen parametreleri kullanarak bir `INSERT` işlemi gerçekleştiriyor.
Şimdi bu kodları direkt kullanmak yerine, bir de ‘Yanlış kullanım’ senaryosu düşünelim. Mesela, her seferinde tek tek sorgu göndermek. Bu hem daha çok ağ trafiğine neden olur hem de daha fazla kod tekrarı anlamına gelir. Bir de şöyle bir şey hayal edin:
Hani dedik ya, her şeyi tek tek göndermek yerine Stored Procedure kullanmak daha iyi diye, işte tam da burada o farkı görebiliyoruz. Yukarıdaki ilk örnekte, hem parametreleri tek tek gönderiyorsunuz hem de her bir alan için ayrı bir SQL komutu yazmak zorunda kalıyorsunuz. Gerçi ilk başta basit görünebilir ama yüzlerce, binlerce kayıt eklerken veya çok daha karmaşık işlemler yaparken ciddi bir yük haline gelebiliyor. Bu arada, kendi programımı yaparken böyle tek tek sorgu gönderiyordum ve performansın nasıl düştüğünü görünce şaşırmıştım açıkçası.
Şimdi gelelim ‘Doğru kullanım’ örneğine, yani Stored Procedure ile yapılmış haline.
Gördüğünüz gibi, tek bir komutla (kullanici_ekle) tüm işlemi halletmiş oluyoruz. Bu hem kodumuzu daha okunabilir hale getiriyor hem de performansı ciddi anlamda artırıyor. Veritabanı sunucusu bu prosedürü zaten biliyor, optimize etmiş durumda. Sizin tek yapmanız gereken bu prosedürü çağırmak. Basit değil mi?
Tabii Stored Procedure’ların da bazı dezavantajları yok değil. Mesela, eğer veritabanı sunucusu ile uygulama sunucusu farklı makinelerde çalışıyorsa, bazen Stored Procedure’lar performans açısından bekleneni vermeyebilir. Ya da bir hata olduğunda, bunu hata ayıklamak (debug etmek) bazen daha zor olabiliyor, çünkü kodlar veritabanı tarafında çalışıyor. Ama yine de, doğru kullanıldığında faydaları saymakla bitmez.
Bu arada, Stored Procedure’ları sadece veri eklemek için değil, veri çekmek, güncellemek, hatta karmaşık raporlar oluşturmak için de kullanabilirsiniz. Mesela belirli bir tarihteki satışları listeleyen bir Stored Procedure yazabilirsiniz. Ya da bir ürünü güncellemek için, sadece ürün ID’sini ve yeni fiyatını gönderirsiniz, prosedür de kendi işini halleder. Ne güzel değil mi?
Sonuç olarak, Stored Procedure’lar veritabanı işlemlerinizi daha hızlı, daha güvenli ve daha yönetilebilir hale getiren güçlü araçlar. Orta seviye bir geliştirici olarak bu konuya hakim olmak, işlerinizi çok daha kolaylaştıracaktır. Hani böyle bir teknoloji var ama kullanmak istemiyorum diyorsunuz ama sonra kullanınca ‘Neden daha önce kullanmamışım?’ diyorsunuz ya, işte Stored Procedure’lar da tam olarak öyle bir şey bana göre. Eğer veritabanı ile yoğun çalışıyorsanız, kesinlikle denemenizi tavsiye ederim. Belki ilk başta biraz karmaşık gelebilir ama üstesinden gelinemeyecek bir şey değil. Zaten internette bolca örnek ve kaynak bulabilirsiniz. Mesela, Google’da basit örnekler aratarak başlayabilirsiniz. Ya da daha detaylı bilgi için Wikipedia’ya bir göz atabilirsiniz. Hatta bazen YouTube’da videolu anlatımlar da çok işe yarıyor.
Unutmayın, teknoloji sürekli gelişiyor ve biz de bu gelişimlere ayak uydurarak kendimizi geliştirmeye devam etmeliyiz. Stored Procedure’lar da bu gelişimlerden biri ve doğru kullanıldığında iş akışlarınızı ciddi anlamda iyileştirebilir. Hadi bakalım, bu konuyu da hallettiğimize göre şimdi başka şeylere geçebiliriz. 🙂