UPDATE ve DELETE Komutlarında Veri Kaybını Önleme Rehberi
Beceri rehberi

UPDATE ve DELETE Komutlarında Veri Kaybını Önleme Rehberi

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

WHERE unutulduğunda ne olur? SELECT ile önizleme, transaction, yedek ve satır sayısı kontrolüyle UPDATE ve DELETE komutlarını güvenle kullanmanın yolları.

UPDATE ve DELETE neden riskli komutlardır?

SELECT yalnızca okur; hatalı yazılsa bile veriye zarar vermez. UPDATE ve DELETE ise kalıcı değişiklik yapar. En bilinen kaza, WHERE koşulunu yazmayı unutmaktır: UPDATE customers SET sehir = 'Ankara' komutu tablodaki tüm müşterilerin şehrini değiştirir, DELETE FROM siparisler ise tabloyu boşaltır. Komut hatasız çalıştığı için sistem uyarı vermez.

Risk yalnızca unutulan koşuldan gelmez. Koşul yazılmış olsa bile beklenenden fazla satırı kapsayabilir: zayıf bir filtre, birleştirme sonrası çoğalan satırlar, büyük küçük harf farkları ya da NULL davranışı yanlış sonuç doğurur. Ayrıca silinen bir satır, yabancı anahtar kuralına bağlı olarak başka tablolardaki ilişkili kayıtları da silebilir.

Bu yüzden güvenli kullanım bir alışkanlıktır: komutu çalıştırmadan önce neyi etkileyeceğini görmek, işlemi geri alınabilir hale getirmek ve sonucu doğrulamak.

Önce SELECT, sonra UPDATE ya da DELETE

En etkili tek alışkanlık, değiştireceğiniz satırları önce SELECT ile görmektir. UPDATE customers SET durum = 'pasif' WHERE son_giris_tarihi < tarih yazmadan önce aynı koşulla SELECT * FROM customers WHERE son_giris_tarihi < tarih çalıştırın. Sonuçta gelen satırları ve sayılarını inceleyin. Bunlar gerçekten değişmesini istediğiniz kayıtlar mı?

Sonra komutu yazarken kendinize şu sırayı uygulatın: önce WHERE satırını yazın, gerekirse SELECT olarak çalıştırın, en son baştaki komutu UPDATE ya da DELETE'e çevirin. Böylece WHERE yazılmadan komut çalıştırılamaz hale gelir.

Kayıt sayısını önceden tahmin etmek de iyi bir kontroldür. Örneğin yalnızca belirli bir müşterinin adresini güncelliyorsanız, tek bir satır etkilenmelidir. Komut çalıştığında sistemin bildirdiği etkilenen satır sayısı, tahmininizle uyuşmuyorsa durup nedenini araştırın.

Transaction ile geri alınabilir hale getirmek

Transaction, bir dizi komutu bütün olarak onaylamayı ya da tümünü geri almayı sağlar. Değişiklik komutundan önce BEGIN (ya da kullandığınız sisteme göre START TRANSACTION) ile işlem başlatır, UPDATE ya da DELETE komutunu çalıştırır, sonucu SELECT ile kontrol eder ve ancak her şey beklendiği gibiyse COMMIT yazarsınız. Bir sorun görürseniz ROLLBACK ile değişiklik hiç yapılmamış gibi geri döner.

Dikkat edilecek noktalar var. Bazı araçlar komutları otomatik onaylar (auto-commit); bu durumda her komut anında kalıcı olur. Transaction açıkken ilgili satırlar kilitlenir, bu yüzden onay vermeden uzun süre beklemek diğer kullanıcıları engeller. Ayrıca bazı komutlar, özellikle tablo yapısını değiştirenler, bazı sistemlerde transaction'a rağmen geri alınamaz.

Transaction yöntemi, yedeğin yerini tutmaz; çalıştığınız oturum kapanmadan ve onay vermeden önce geçerli bir güvencedir.

Yedek, kopya tablo ve silme yerine işaretleme

Kalıcı etkisi olan toplu değişikliklerden önce etkilenecek satırların bir kopyasını ayrı tabloya almak basit bir sigortadır. Örneğin silmeden önce aynı koşulla etkilenecek satırları bir arşiv tablosuna yazarsınız; sorun çıkarsa oradan geri yükleyebilirsiniz. Daha büyük işlerde veritabanının tam yedeği ve geri yükleme prosedürü alınmış olmalıdır.

Birçok sistemde değişen satırı komutun kendisi döndürebilir: SQL Server'da OUTPUT, PostgreSQL'de RETURNING bu işe yarar. Silinen ya da güncellenen satırların eski değerlerini bir log tablosuna yazmak, hangi veriyi neyle değiştirdiğinizi kayıt altına alır.

Silmenin alternatifi mantıksal silmedir. Tabloya silindi mi gibi bir bayrak ya da silinme tarihi sütunu eklenir; satır fiziksel olarak durur ama uygulama tarafından gizlenir. Böylece hata yapıldığında kayıt geri getirilebilir. Bu yaklaşımın bedeli, sorgularda sürekli filtre yazma zorunluluğu ve verinin birikmesidir; hukuki silme gerekliliği varsa ayrıca değerlendirilmelidir.

Birleştirmeli UPDATE ve DELETE'te dikkat edilecekler

Başka bir tablodaki değere göre güncelleme ya da silme yaptığınızda risk büyür. Sözdizimi sistemden sisteme farklıdır: SQL Server'da UPDATE ... FROM ... JOIN, MySQL'de UPDATE tablo JOIN tablo SET, PostgreSQL'de UPDATE ... FROM ... WHERE kalıbı kullanılır. Genel ilke aynıdır: değişecek tabloyla başka tabloyu ilişkilendirip filtre uygularsınız.

En sık sorun, birleştirmenin satırları çoğaltmasıdır. Güncellenecek satır karşı tabloda birden fazla satırla eşleşirse, hangi değerin yazılacağı sisteme göre değişir; bazıları rastgele bir eşleşmeyi alır, bazıları hata verir. Güncellemeden önce JOIN'i SELECT olarak çalıştırıp her hedef satırın karşı tarafta tam olarak bir satırla eşleştiğini doğrulayın.

Bir başka tuzak bağlı tablolardır. Yabancı anahtarda silme kuralı cascade ise ana kaydı silmek bağlı tüm kayıtları da siler. Bu davranışı komut çalışmadan önce tablo tanımlarından kontrol etmek gerekir.

Yetki ve ortam disiplini

Teknik önlemlerin yanında çalışma düzeni de belirleyicidir. Canlı veritabanında doğrudan çalışan her kullanıcının tüm tablolarda silme yetkisi olması gerekmez; raporlama kullanıcılarına yalnızca okuma yetkisi vermek kazaların büyük kısmını yapısal olarak engeller. Değişikliklerin ayrı bir yetkili hesapla yapılması da iz bırakır.

Değişikliği önce test ya da kopya ortamda denemek, sonra canlıda çalıştırmak temel pratiktir. Bazı araçlar güvenli güncelleme modu sunar: MySQL Workbench'te anahtar sütunu içermeyen UPDATE ve DELETE komutlarını engelleyen bir ayar vardır. Bu ayarı kapatmak yerine koşulu gerçekten doğru kurmaya çalışın.

Bağlantınızın hangi ortama baktığını da kontrol edin. Sık yapılan kazalardan biri, test sanılan bağlantıda canlı veriyi değiştirmektir. Araçta bağlantı adını belirgin kılmak ve canlı bağlantıyı farklı renkle işaretlemek bu hatayı azaltır. Toplu değişiklikleri kod incelemesinden geçirmek de ekip içinde ek bir güvence sağlar.

Sık yapılan hatalar ve nereden başlanır?

En sık görülen hatalar şunlardır: • WHERE koşulunu unutmak ya da yanlış sütuna yazmak. • OR ve AND işleçlerini parantezsiz karıştırmak; koşul beklenenden fazla satırı kapsar. • NULL değerlerle = ya da <> karşılaştırması yapmak; boş değerler bu koşullarda eşleşmez, IS NULL kullanılmalıdır. • Tüm tabloyu temizlemek için DELETE yerine TRUNCATE kullanmak; TRUNCATE çoğu sistemde satır satır silmez, geri almak daha zordur ve tetikleyicileri çalıştırmayabilir. • Etkilenen satır sayısını okumamak. • Veri tipi dönüşümünün sessizce veri bozması, örneğin metin sütununa tarih benzeri değer yazmak.

Öğrenme sırası olarak önce SELECT ve WHERE, ardından INSERT, UPDATE, DELETE ve transaction kavramı öğrenilmelidir. Mindset kataloğunda SQL ile Programlama Eğitimi, Veri İşleme Dili (Data Manipulation Language) ve Sorgular modüllerini içerir; SQL ile Veri Sorgulama (Temel) ise filtreleme teknikleri modülüyle WHERE mantığını kapsar. Bu içerikler, veriyi güncelleme yetkisi olan operasyon ve raporlama ekipleri için uygundur.

İlgili Mindset programı

SQL ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

WHERE olmadan UPDATE çalıştırdım, ne yapmalıyım?

Önce işlemin hâlâ açık transaction içinde olup olmadığına bakın; açıksa hemen ROLLBACK yapın. Onaylanmışsa veritabanı yöneticisiyle iletişime geçin ve yedekten ya da sistemin sunduğu zamana göre geri yükleme özelliğinden yararlanın. Daha fazla işlem yapmayın, çünkü yeni yazmalar eski değerlere dönmeyi zorlaştırabilir.

DELETE ile TRUNCATE arasındaki fark nedir?

DELETE koşula göre satır siler, işlemi kayıt altına alır ve transaction içinde geri alınabilir. TRUNCATE tablonun tüm satırlarını hızla boşaltır, WHERE kabul etmez ve davranışı sisteme göre farklıdır; bazı sistemlerde geri alınması zordur. Seçmeli silme için DELETE, tabloyu tümüyle sıfırlamak için TRUNCATE düşünülür.

UPDATE ile aynı anda kaç satır değiştirmem sorun olur?

Mutlak bir sınır yoktur; belirleyici olan beklentinizle gerçek etkinin uyuşmasıdır. Çok büyük toplu güncellemeler kilitlenmeye ve işlem kaydının şişmesine yol açabilir. Bu durumda işi küçük gruplara bölmek, her grup sonrası kontrol etmek ve yoğun olmayan saatte çalıştırmak yaygın yaklaşımdır.

Silinen kaydı geri getirmek mümkün mü?

Transaction açıkken ROLLBACK ile evet. Onaylandıktan sonra ancak yedek, arşiv tablosu ya da sistemin sunduğu zamana dayalı geri yükleme özellikleri varsa mümkündür. Bu yüzden toplu silmelerden önce kopya almak ve mantıksal silmeyi (bayrak sütunu) tercih etmek en güvenli yoldur.

Güvenli güncelleme modu neden komutlarımı engelliyor?

MySQL Workbench gibi araçlardaki bu mod, birincil anahtar gibi indekslenmiş bir sütuna dayanmayan UPDATE ve DELETE komutlarını reddeder; amaç yanlışlıkla tüm tabloyu değiştirmeyi önlemektir. Modu kapatmak yerine koşulunuzu anahtar sütuna bağlamayı ya da komutu sınırlandırmayı deneyin.

SQL UPDATE ve DELETE: Veri Kaybı Olmadan Kullanım