Hadi gelin şimdi şu veri ekleme işlerine bir dalış yapalım. INSERT komutu, veritabanı dünyasının temel taşlarından biri, hani böyle her gün kullandığımız çekiç, tornavida gibi düşünebilirsiniz. Ne güzel değil mi? Birkaç basit komutla kocaman verileri sisteme dahil edebiliyorsunuz. Tabii, her işte olduğu gibi bunda da dikkat etmemiz gereken bazı noktalar var. Yoksa işler çığırından çıkabilir, inan ki. Bir kere yanlış bir veri eklediniz mi, sonra onu düzeltmek ayrı dert, bulmak ayrı dert. Sanki bir iğne aramak gibi, hem de samanlıkta 🙂
INSERT komutu aslında oldukça basit bir mantığa dayanıyor. Elinizde bir tablo var ve içine yeni kayıtlar atmak istiyorsunuz. İşte tam bu noktada INSERT devreye giriyor. Diyorsunuz ki, “Ey veritabanı, benim şu tabloma şu bilgileri ekle” ve o da sağ olsun, ekliyor. Bu arada, veritabanı dediğimiz şey de öyle aman aman bir sihirbaz değil, sadece belirli kurallara göre çalışan bir yapı sonuçta. Yani işler karmaşık görünse de, temelde çok net bir mantığı var.
En temel INSERT kullanımı, tüm sütunlara değer atayarak yapılır. Yani tabloya yeni bir kayıt girerken, tablonun sahip olduğu tüm sütunlar için birer değer verirsiniz. Bu, en garantili yöntemlerden biri aslında çünkü hangi verinin nereye gideceği belli. Sanki yeni bir ev alıyorsunuz ve her odası için eşya seçiyorsunuz gibi. Salon için koltuk, yatak odası için yatak, mutfak için buzdolabı… Hepsi yerli yerine.
Peki ya sadece bazı sütunlara veri eklemek istersek ne olur? İşte orada da işler biraz değişiyor. Tüm sütunlara değer vermek zorunda değilsiniz, fakat hangi sütunlara veri eklediğinizi belirtmeniz gerekiyor. Hani bazen bir form dolduruyorsunuz ya, bazı alanlar zorunlu, bazıları ise isteğe bağlıdır. İşte INSERT komutu da biraz böyle çalışıyor diyebiliriz. Zorunlu alanları dolduruyorsunuz, isteğe bağlıları ise boş bırakabiliyorsunuz. Tabii, boş bırakılacak alanların NULL değer almasına izin veriliyor olması lazım, yoksa hata alırsınız. Bu da önemli bir detay.
Mesela şöyle bir senaryo düşünün: Bir müşteri tablonuz var. Bu tabloda müşteri adı, soyadı, email, telefon ve adres sütunları var. Diyelim ki yeni bir müşteri kaydı alıyorsunuz ama telefon numarası henüz belli değil. İşte bu durumda, telefon sütununu boş bırakarak yani NULL atayarak kaydı oluşturabilirsiniz. Bu, veri bütünlüğünü bozmadan esneklik sağlar. Ne güzel değil mi?
INSERT komutunun bir diğer güzel yanı da, değerleri belirli bir sütuna atamak yerine, bir sorgunun sonucunu doğrudan ekleyebilmeniz. Yani başka bir tablodan çektiğiniz verileri, tek bir komutla başka bir tabloya aktarabilirsiniz. Bu, veri taşıma veya senkronizasyon gibi işlemlerde hayat kurtarıcı olabiliyor. Hani bazen bir yerden bir yere bir sürü eşya taşımanız gerekiyor ya, işte bu komutla sanki o eşyaları tek bir kerede ışınlamış gibi oluyorsunuz. Süper bir şey yani.
Şimdi gelelim işin kod kısmına. Veritabanı işlerinde kodlama, işleri çok daha dinamik hale getirir. Bir web uygulamasında kullanıcıdan aldığınız veriyi direkt olarak veritabanına eklemek isteyebilirsiniz. İşte bu noktada C# ve benzeri diller devreye giriyor. Örneğin, bir ASP.NET Core projesinde kullanıcıdan alınan bilgileri bir Dapper yardımıyla PostgreSQL’e nasıl ekleriz, ona bakalım. Bu arada, Dapper çok kullanışlı bir ORM (Object-Relational Mapper) aslında, SQL sorgularınızı direkt C# kodunuz içinde yazmanıza olanak tanıyor, bu da işleri hem hızlandırıyor hem de okunabilirliğini artırıyor. Zaten işin özü bu, değil mi? İşleri kolaylaştırmak, daha hızlı ve anlaşılır hale getirmek.
Aşağıda basit bir C# kodu örneği var. Bu örnekte, bir ‘Urun’ sınıfımız var ve bu sınıfın bilgilerini PostgreSQL veritabanındaki ‘Urunler’ tablosuna ekliyoruz. Önce bir ‘Yanlış’ örnekle başlayalım, yani direkt SQL injection’a açık bir kod yazalım ki, neden böyle yapmamamız gerektiğini anlayalım. Sonra da, Dapper’ın güvenli yöntemini kullanarak doğru yolu gösterelim. Hani derler ya, önce hatayı gör, sonra doğrusunu anla diye. İşte tam da öyle bir şey olacak.
// YANLIŞ YÖNTEM: SQL Injection'a Açık! public async Task AddUrunYanlis(Urun urun) { var connectionString = _configuration.GetConnectionString("DefaultConnection"); using (var connection = new NpgsqlConnection(connectionString)) { connection.Open(); // Dikkat: Bu sorgu SQL Injection saldırılarına açıktır! Kullanmayın! string query = $"INSERT INTO Urunler (Ad, Fiyat, Stok) VALUES ('{urun.Ad}', {urun.Fiyat}, {urun.Stok})"; await connection.ExecuteAsync(query); } return Ok("Ürün yanlış yöntemle eklendi."); }
Gördünüz mü? Oradaki tırnak işaretleri ve string birleştirme, ne kadar tehlikeli bir durum yaratıyor. Birisi ‘urun.Ad’ yerine ‘ OR ‘1’=’1′ –‘ gibi bir şey gönderirse, tüm veritabanınız tehlikeye girebilir. Aman diyeyim, böyle bir şey yapmayın sakın. Kendi programım sınıfta kaldı derler ya, işte böyle kodlar da sınıfta kalır 🙂
Şimdi gelelim doğru ve güvenli yönteme. Dapper’ın parametreli sorgu özelliğini kullanacağız. Bu sayede, gönderdiğimiz değerler doğrudan SQL sorgusuna dahil edilmez, güvenli bir şekilde işlenir. Sanki birisi size bir mektup gönderiyor ve siz o mektubu açmadan önce kontrol ediyorsunuz gibi. Hem içeriği öğreniyorsunuz hem de zararlı bir şey olup olmadığını anlıyorsunuz. Bu arada, PostgreSQL için Npgsql kütüphanesini kullanacağız, tabii ki.
// DOĞRU YÖNTEM: Dapper ile Güvenli INSERT public async Task AddUrunDogru(Urun urun) { var connectionString = _configuration.GetConnectionString("DefaultConnection"); using (var connection = new NpgsqlConnection(connectionString)) { connection.Open(); string query = @"INSERT INTO Urunler (Ad, Fiyat, Stok) VALUES (@Ad, @Fiyat, @Stok)"; // Parametreler @ ile belirtilir await connection.ExecuteAsync(query, new { urun.Ad, urun.Fiyat, urun.Stok }); // Anonim obje ile parametreler atanır } return Ok("Ürün güvenli yöntemle eklendi."); }
İşte bu kadar! Gördüğünüz gibi, @Ad, @Fiyat, @Stok gibi parametreler kullanarak ve anonim bir C# objesiyle bu değerleri Dapper’a ileterek sorgumuz çok daha güvenli hale geliyor. Bu yöntem, sadece veri eklerken değil, veri çekerken veya güncellerken de kullanılması gereken standart bir pratik. Hani web güvenliği derslerinde hep söylenir ya, “Asla kullanıcıdan gelen veriyi doğrudan çalıştırma” diye, işte bu da onun bir uygulaması.
Sonuç olarak, INSERT komutu veritabanı yönetiminin olmazsa olmazı. Temel kullanımından, sorgu sonuçlarını eklemeye kadar birçok farklı yolu var. Kodlama yaparken de güvenlik en öncelikli konu olmalı. Dapper gibi araçlar bu konuda bize oldukça yardımcı oluyor. Unutmayın, iyi kod yazmak sadece çalışmak değil, aynı zamanda güvenli ve sürdürülebilir olmaktır. Bu arada, Bursa’da kod yazarken bazen dışarı çıkıp hava almak harika oluyor. Şimdilik bu kadar, umarım faydalı olmuştur 🙂