İtiraz süreli hesap silme (yumuşak silme + anonimleştirme)
Kısaca: Silme talep edildiğinde bir hesabı hemen geri alınamaz biçimde kaldırmak yerine, önce yalnızca bir zaman noktası kaydedilir (pending_deletion_at) — hesap ancak bir süre dolduktan sonra gerçekten anonimleştirilir.
Biraz daha ayrıntılı: Hemen yapılan, sert bir silme risklidir: yanlışlıkla bir tıklama, ele geçirilmiş bir hesap ya da silme talebinin geri alınması aksi hâlde artık geri alınamazdı. Süre, silinme hakkıyla (m. 17 GDPR) çelişmeden bir “geri al”a yer bırakır — süre dolduktan sonra kişisel veriler kaldırılır/anonimleştirilir (anonymizedAt bunun NE ZAMAN olduğunu kaydeder).
Bizim bağlamımız: Emzett’te db/migrations/add_v27_session_version_deletion.sql, users.pending_deletion_at ve users.anonymized_at ekler — gerçek anonimleştirmeden önce 7 günlük bir itiraz süresi.
Ayrıntılı
Hukuki tavsiye değil, teknik bir sınıflandırmadır. Silinme hakkı (GDPR m. 17) mutlaka hemen, sert bir silme gerektirmez — saklama amacı ortadan kalktığında kişisel verilerin gereksiz gecikme olmadan silinmesini gerektirir. Silme talebinin nasıl geri çekilebileceğine dair net bir notla kısa, açıkça iletilen bir itiraz süresi, silmeyi fiilen uzatmak için kötüye kullanılmadığı sürece genellikle savunulabilir sayılır.
Teknik olarak iki aşama ayırt edilir: yumuşak silme (kayıt tamamen korunur, yalnızca bir bayrak/zaman damgası onu “silinmek üzere planlanmış” olarak işaretler — geri alınabilir) ve anonimleştirme (kişisel alanlar artık geri izlenemeyen yer tutucularla değiştirilir — geri alınamaz). Gerçek anonimleştirme için önemli: yalnızca ad/e-posta gibi bariz alanları silmek yetmez — dolaylı tanımlayıcılar da (benzersiz bir doğum tarihi + posta kodu birleşimi, başvurulan, aksi hâlde boş bir sipariş geçmişi) yerinde bırakılırsa bir kişiyi yeniden tanımlanabilir kılabilir.
-- Planla (geri alınabilir)
UPDATE users SET pending_deletion_at = now() + interval '7 days' WHERE id = $1;
-- Süre dolduktan sonra (geri alınamaz, cron işiyle)
UPDATE users SET email = 'deleted-' || id || '@anon.local', name = 'Deleted user', anonymized_at = now()
WHERE pending_deletion_at < now() AND anonymized_at IS NULL;Ayrıca bak: GDPR veri dışa aktarımı (m. 15/20), GDPR