SQL UPDATE güvenliği için en temel kural, güncelleme sorgusunu doğrudan çalıştırmamaktır. Önce aynı WHERE koşulunu bir SELECT sorgusunda kullanarak hedef kayıtları görmeli, ardından COUNT(*) ile beklenen satır sayısını kontrol etmelisin. Mümkünse işlemi bir transaction içinde denemek de hatalı sonucu kalıcılaştırmadan önce güvenli bir kontrol noktası sağlar.
Başlangıç seviyesindeki bir CRUD projesinde bu alışkanlık, küçük bir yazım hatasının öğrenci tablosundaki birçok kaydı etkilemesini önler. Amaç kimseyi suçlamak değil; UPDATE sorgusunu çalıştırmadan önce birkaç basit doğrulama adımını standart hâle getirmektir.
WHERE koşulu neden UPDATE sorgusunun güvenlik sınırıdır?
UPDATE sorgusu, bir tablodaki mevcut verileri değiştirir. Hangi satırların değişeceğini belirleyen temel bölüm ise WHERE koşuludur. Bu nedenle WHERE kullanılmadığında sorgunun kapsamı tüm tabloya kadar genişleyebilir.
UPDATE ogrenciler
SET sinif = 10;
Bu örnekte belirli bir öğrenci, şehir veya sınıf seçilmediği için ogrenciler tablosundaki tüm kayıtların sinif değeri 10 yapılabilir. Oysa amaç yalnızca kimliği 12 olan öğrencinin sınıf bilgisini güncellemekse koşul açıkça yazılmalıdır:
UPDATE ogrenciler
SET sinif = 10
WHERE ogrenci_id = 12;
Ancak WHERE eklemek tek başına yeterli değildir. Koşul yanlış yazılırsa yine beklenenden fazla kayıt etkilenebilir. Örneğin yalnızca belirli öğrencileri hedeflemek isterken şehir filtresini fazla geniş kurmak risk oluşturur:
UPDATE ogrenciler
SET sinif = 10
WHERE sehir = 'Ankara';
Bu sorgu, Ankara’daki tek bir öğrenciyi değil, koşulu sağlayan tüm öğrencileri günceller. Bu sonuç amaçlanıyorsa sorun yoktur; fakat yalnızca belirli bir öğrenci grubunu hedefliyorsan şehir bilgisi tek başına yeterli olmayabilir. Şehir adında yazım farkı, beklenmeyen kayıtlar veya yanlış seçilmiş bir filtre, güncelleme kapsamını değiştirebilir.
Bu yüzden güvenli akışın ilk adımı, yazacağın UPDATE sorgusunu önce SELECT ile sınamaktır. Ardından beklenen satır sayısını COUNT(*) ile kontrol etmeli ve mümkünse transaction içinde sonucu görmeden COMMIT kararı vermemelisin. Transaction komutlarının kullanımı ve davranışı, kullanılan veritabanı ürününe veya yapılandırmaya göre farklılaşabilir; bu nedenle kendi ortamının belgelerini de kontrol etmen gerekir.
UPDATE çalıştırmadan önce SELECT ile hedef kayıtları önizleyin

Güncelleme koşulunu önce SELECT içinde kullanmak, hedef kayıtları görmenin en pratik yoludur. Şehir filtresiyle ilerleyen bir örnekte önce şu sorguyu çalıştırabilirsin:
SELECT ogrenci_id, ad, sehir, sinif
FROM ogrenciler
WHERE sehir = 'Ankara';
Sonuç ekranında öğrenci kimliği, ad, şehir ve mevcut sınıf değerlerini karşılaştır. Beklediğin öğrenciler yerine farklı şehirlerden kayıtlar görünüyorsa veya kayıt sayısı makul görünmüyorsa UPDATE sorgusunu durdurup koşulu yeniden incelemelisin. Aynı filtreyi daha sonra güncellemede kullanabilirsin:
UPDATE ogrenciler
SET sinif = 10
WHERE sehir = 'Ankara';
Bu tür kontrol alışkanlıkları, birebir online yazılım eğitimleri gibi uygulama odaklı çalışmalarda yalnızca sorgu yazmayı değil, sorgunun etkisini önceden düşünmeyi de öğrenmenin önemli bir parçasıdır.
Özetle, SELECT sonucu beklenen hedef kayıtları göstermiyorsa sorguyu çalıştırma. Önizleme, yanlış şehir filtresi veya fazla geniş bir koşulu veriyi değiştirmeden fark etmeni sağlar.
COUNT(*) ile etkilenecek satır sayısını doğrulayın
SELECT önizlemesinde hedef kayıtları gördükten sonra, aynı WHERE koşulunu kullanarak kaç satırın etkileneceğini de kontrol edin. Böylece yalnızca kayıtların içeriğini değil, güncellemenin kapsamını da doğrulamış olursun.
SELECT COUNT(*)
FROM Ogrenciler
WHERE sehir = 'İzmir'
AND durum = 'aktif';
Buradaki “beklenen sayı”, herkes için geçerli sabit bir değer değildir. Sorgunun amacına göre önceden belirlediğin kayıt kapsamıdır. Örneğin yalnızca belirli bir şehirdeki aktif öğrencileri güncellemek istiyorsan, sonuç bu hedefle uyumlu olmalıdır. Sayı beklenenden çok yüksekse şehir filtresi fazla geniş olabilir veya başka bir koşul eksik kalmış olabilir.
COUNT(*) sonucu için kısa kontrol çerçevesi
- Koşul doğru mu? Sütun adlarını, karşılaştırma değerlerini ve mantıksal bağlaçları yeniden incele.
- NULL değerler kapsamı etkiliyor mu? Bir sütunda NULL bulunan kayıtlar, normal eşitlik karşılaştırmalarında beklediğin şekilde eşleşmeyebilir.
- Şehir ya da kategori filtresi fazla geniş mi? Yalnızca şehirle filtrelemek, aynı şehirdeki beklenmeyen kayıtları da kapsayabilir.
- COUNT sonucu beklenen aralıkta mı? Sonuç amacınla uyuşmuyorsa UPDATE sorgusunu çalıştırma.
COUNT(*) sonucu ile SELECT önizlemesindeki kayıt kapsamı birbirini doğrulamıyorsa, sorguyu durdurup koşulları yeniden incelemek en güvenli adımdır. Kullanılan veritabanı ürünü, istemci veya uygulama katmanı; COUNT(*) sonucunun ve UPDATE sonrasında etkilenen satır sayısının nasıl gösterildiğini farklı biçimde raporlayabilir. Bu nedenle ekrandaki bilgiyi, kullandığın ortamın davranışıyla birlikte değerlendirmelisin.
Transaction içinde deneme yapın, sonucu görmeden kalıcılaştırmayın

Veritabanı ve kullandığın çalışma ortamı transaction işlemlerini destekliyorsa, UPDATE sorgusunu doğrudan kalıcı hâle getirmek yerine önce bir transaction içinde deneyebilirsin. Ürünler ve istemciler arasında sözdizimi, otomatik commit ayarı ve ROLLBACK davranışı değişebileceği için aşağıdaki akışı kendi ortamına uyarlamalısın.
- Transaction’ı başlat.
- Önceden kontrol ettiğin
UPDATEsorgusunu çalıştır. - Raporlanan etkilenen satır sayısını kontrol et.
- Değişen değerleri aynı koşulla
SELECTederek incele. - Sonuç doğruysa
COMMIT, hata veya beklenmeyen kapsam varsaROLLBACKuygula.
-- Kavramsal akış
TRANSACTION BAŞLAT
UPDATE Ogrenciler
SET durum = 'pasif'
WHERE ...;
ETKİLENEN SATIR SAYISINI KONTROL ET
DEĞİŞEN KAYITLARI SELECT İLE İNCELE
-- Uygunsa
COMMIT
-- Uygun değilse
ROLLBACK
Bu yaklaşım, hatayı fark ettiğinde değişikliği geri alma fırsatı sağlayabilir; ancak her ortamda aynı kapsamı garanti etmez. Bu yüzden transaction’ın gerçekten hangi işlemleri kapsadığını, otomatik commit’in açık olup olmadığını ve ROLLBACK komutunun kullandığın veritabanı ile istemcide nasıl çalıştığını önceden kontrol et.
UPDATE sonrasında etkilenen satırları ve yeni değerleri kontrol edin
Güvenli bir UPDATE akışında sorgunun çalışması son adım değildir. Veritabanının kaç satırı etkilediğini ve hedef kayıtların yeni değerlerini kontrol etmek gerekir. Böylece hem fazla geniş bir WHERE koşulunu hem de yanlış sütunun güncellenmesi gibi hataları erken fark edebilirsin.
Örneğin önce şu kayıtları hedeflediğini varsayalım:
SELECT id, ad, sehir, durum
FROM ogrenciler
WHERE sehir = 'İzmir' AND durum = 'pasif';
Bu sorgunun döndürdüğü id değerlerini not et. Ardından transaction içinde UPDATE çalıştır ve istemcinin raporladığı etkilenen satır sayısını beklediğin kapsamla karşılaştır. Beklediğin kayıt sayısı üçken iki yüz satır etkilenmiş görünüyorsa işlemi kalıcılaştırma.
UPDATE ogrenciler
SET durum = 'aktif'
WHERE sehir = 'İzmir' AND durum = 'pasif';
Sonraki adımda aynı koşulla veya önizlemede belirlediğin kimliklerle kayıtları yeniden sorgula:
SELECT id, ad, sehir, durum
FROM ogrenciler
WHERE sehir = 'İzmir' AND durum = 'aktif';
Bu kontrolde üç noktaya bakılır: Önizlemede görülen kimlikler beklenen kayıtlarla aynı mı, yalnızca amaçlanan sütun mu değişmiş, yeni değer gerçekten beklenen değer mi? Örneğin ad ve sehir sütunlarında da değişiklik görüyorsan sorguyu durdurup işlemi incelemelisin. SQL istemcilerinin etkilenen satır sayısını gösterme biçimi kullanılan veritabanı ürünü, sürücü veya istemciye göre farklılaşabileceğinden, bu sayıyı tek başına değil, SELECT doğrulamasıyla birlikte değerlendirmek daha güvenlidir.
SQL ve CRUD temellerini bu tür kontrollerle pekiştirmek isteyenler, seviyesini görmek için ücretsiz yazılım bilgi testlerinden yararlanabilir. Amaç yalnızca sorguyu yazmak değil, sorgunun beklenen sonucu üretip üretmediğini sistemli biçimde incelemektir.
UPDATE güvenlik kontrol listesi
- WHERE koşulunu yaz ve gözden geçir: Hangi kayıtların hedeflendiğini açıkça tanımla.
- Aynı koşulla SELECT önizlemesi yap: Güncellemeden önce hedef kayıtları gör.
- COUNT(*) sonucunu beklenen kapsamla karşılaştır: Kayıt sayısı mantıklı değilse devam etme.
- Transaction içinde dene: Sonucu inceleyebileceğin bir çalışma alanı kullan.
- Etkilenen satır sayısını kontrol et: Raporlanan sayı beklentinle uyuşuyor mu bak.
- Yeni değerleri SELECT ile doğrula: Kimlikleri ve değişen sütunları yeniden incele.
- Uygunsa COMMIT, değilse ROLLBACK kullan: Beklenmeyen sonuçta işlemi kalıcılaştırma.
Güvenli UPDATE akışını günlük sorgu alışkanlığına dönüştürün
Bu yaklaşımı bir defalık kontrol değil, her UPDATE sorgusunda uygulanan kısa bir karar akışı hâline getirmek önemlidir. Hedef kayıtları net biçimde tanımlayamıyorsan sorguyu çalıştırma. COUNT(*) sonucu beklediğin kapsamdan farklıysa dur ve WHERE koşulunu yeniden incele. Transaction desteğini ve otomatik commit ayarını da kullandığın veritabanı aracıyla birlikte kontrol et; transaction komutlarının davranışı veritabanı ürününe ve yapılandırmaya göre değişebilir.
İşlem sırasında kayıtları önizle, güncellemeyi uygula, etkilenen satır sayısını kontrol et ve yeni değerleri doğrula. Ancak tüm sonuçlar beklediğin gibiyse COMMIT ile kalıcılaştır. Beklenmeyen bir kayıt, sayı veya sütun değişikliği görürsen ROLLBACK seçeneğini değerlendir ve sorguyu düzeltmeden devam etme.
SQL ve CRUD temellerini sistemli biçimde geliştirmek isteyenler, birebir online yazılım eğitimleri ile kişiye göre ilerleyebilir. Seviyesini önce ölçmek isteyenler için ücretsiz bilgi testleri de kullanılabilir; böylece hangi konularda tekrar gerektiği daha net görülebilir.
Sık Sorulan Sorular
WHERE kullanmadan UPDATE çalıştırırsam ne olur?
WHERE koşulu olmayan bir UPDATE, sorgunun yapısına bağlı olarak tablodaki tüm kayıtları etkileyebilir. Bu nedenle çalıştırmadan önce sorguyu durdurup hangi kayıtların hedeflendiğini bir SELECT ile kontrol etmelisin.
UPDATE öncesinde neden aynı koşulla SELECT çalıştırılmalı?
SELECT önizlemesi, güncellemenin hangi kayıtları etkileyeceğini önceden gösterir. Böylece şehir filtresinin fazla geniş olması veya yanlış durum değerinin seçilmesi gibi hatalar UPDATE çalışmadan fark edilebilir.
COUNT(*) sonucu beklenenden farklı çıkarsa ne yapılmalı?
İşlemi durdurmalı, WHERE koşulunu ve filtre değerlerini yeniden incelemelisin. Sayı açıklığa kavuşmadan UPDATE’i kalıcılaştırmak güvenli değildir.
COMMIT ve ROLLBACK ne zaman kullanılmalı?
Kontroller tamamlanıp sonuç beklenen gibiyse COMMIT kullanılabilir. Beklenmeyen bir kayıt, sayı veya değer görülürse değişiklikleri geri almak için ROLLBACK tercih edilir.
UPDATE sonrasında hangi değerler ve satır sayısı doğrulanmalı?
Öncelikle etkilenen satır sayısı beklenen kapsamla karşılaştırılmalıdır. Ardından önizlemede belirlenen kimlikler, güncellenen sütunların yeni değerleri ve amaçlanmayan sütunlarda değişiklik olup olmadığı SELECT ile kontrol edilmelidir.
Güvenli UPDATE kullanımı, tek bir komutu ezberlemekten çok; hedefi görme, kapsamı sayma, sonucu doğrulama ve ancak sonra kalıcılaştırma alışkanlığıdır.