HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

Moodle'da silinmiş kullanıcıları tamamen yok etmek

Öğrenmiş oldum ki, moodle asla bir kullanıcıyı silmiyormuş. Yani uygulama tarafında kullanıcı silinse bile, aslında yapılan işlem veritabanında (mdl_user tablosunda) sadece kullanıcının boolean olan deleted alanının 1'e dönüşmesi işlemiymiş. Bu konu hakkında Moodle forumlarında güzel bir tartışma da var.

Özetle bu tartışmada söylenen, bu silinmiş kullanıcıların SQL hareketleriyle uçurulmasının riskli olabileceği. Çünkü kullanıcıların forum mesajı, sınav sonucu vs. bilgilerini de tespit edip temizlemek gerekecek. Aksi halde arkamızda nereye bağlı olduğu veya nasıl oluştuğu belli olmayan bir yığın çöp veri bırakmış oluruz ki - fayda sağlayalım derken daha çok zararı dokunur. Moodle veritabanının karmaşık yapısı ise bu ilişki tespit işlemini çok zorlaştırıyor.

Ancak benim karşılaştığım durum biraz daha farklıydı. Bir çok öğrencinin kaydı yanlışlıkla -bulk upload- yapılmış ve daha sonra bunlar silinmiş. Bu öğrencilerin firstaccess ve lastaccess bilgileri de (mdl_user tablosunda) doğal olarak "0" (veya human-readable olarak 1970-01-01 02:00:00) çünkü hiç giriş yapmamışlar. O halde bunların arkada bırakabileceği harici bir data'da bulunmuyor, yani risk yok.

Risksiz uçurma işlemi öncesinde bunları tespit edelim:

select username, FROM_UNIXTIME(firstaccess), FROM_UNIXTIME(lastaccess), lastaccess from mdl_user where deleted=1 and lastaccess=0 order by FROM_UNIXTIME(lastaccess) desc;

Bunları veritabanından uçuralım:

delete from mdl_user where deleted=1 and lastaccess=0 and firstaccess=0;

Son "1.5 yıldır" giriş yapmamış kullanıcıların silinmesinde de bir sakınca yok, çünkü bunların yaratmış olabileceği forum mesajı, özel mesaj vb. içerikler zaten çoktaaan silinmiştir diyerek onları da uçuruyorum. Bunları da tespit edelim:

select username, FROM_UNIXTIME(firstaccess), FROM_UNIXTIME(lastaccess), lastaccess from mdl_user where deleted = 1 and lastaccess < 1330006358 order by FROM_UNIXTIME(lastaccess) desc;

Yukarıdaki SQL komutunda bulunan 1330006358 değeri, bugünün yani 23 Şubat 2013'ün timestamp bilgisidir.

Bunları da uçuralım:

delete from mdl_user where deleted = 1 and lastaccess < 1330006358

Unutmadan veritabanımıza auto-repair yapalım:

mysqlcheck --auto-repair -c -o moodle

Başarılar.


Share this post!


Blog Comments powered by Disqus.