Gelöschte Beiträge dauerhaft in großen Mengen löschen?

Entschuldige, falls das eine dumme Frage ist …
Warum ist es bei Discourse nicht möglich, Nachrichten einfach aus der Datenbank zu löschen?

Discourse verwendet einen Mechanismus namens „Soft Delete", der das Korrigieren von Fehlern erleichtert. Zudem lässt sich dadurch unterscheiden, ob ein Beitrag „für andere Benutzer" oder „nur für Administratoren" gelöscht wurde.

Außerdem bleibt die Integrität der Datenbank gewahrt. Was wäre, wenn ein gelöschter Beitrag zuvor zitiert wurde? Dann würde der zitierende Beitrag auf einen Beitrag verweisen, der nicht mehr existiert. Das könnte zu allen möglichen Fehlern führen.

Danke, jetzt verstehe ich… das einzige Problem ist, wenn es viele gelöschte Nachrichten gibt.

Das wurde bereits mehrfach diskutiert und angefragt, z. B.:

Ich verstehe, dass ein Soft-Delete sinnvoll sein kann, aber es wäre wünschenswert, dass gelöschte Inhalte nach einer gewissen Frist (z. B. eine Woche oder einen Monat) tatsächlich entfernt werden, um Speicherplatz zu sparen und die Einhaltung gesetzlicher Vorschriften sicherzustellen – etwa wenn illegale Inhalte gepostet wurden oder personenbezogene Daten gemäß der DSGVO entfernt werden müssen.

Es ist etwas umständlich, sich einzuloggen und einen Rake-Task auszuführen, um die Nachricht durch „Dies wurde gelöscht" zu ersetzen.

Ups… Entschuldigung, von phpBB kommend, dachte ich, das wäre möglich.

Es ist jetzt implementiert

Beste Grüße,

Aber wie machen wir das???

Ich habe das heute Morgen ausprobiert, aber ich komme nicht weiter. :slightly_smiling_face: Hast du einen Tipp?

Nun, die Einstellung muss unter Admin > Einstellungen > Sicherheit gesetzt werden (derzeit aus irgendeinem Grund ausgeblendet), und dann müsste jeder Admin diese Berechtigung wie bei einem Moderator erhalten.

Sobald sie erteilt ist, erscheint sie im Admin-Menü für Beiträge.

Ah, das könnte mein Stolperstein sein. Ich habe in den Admin-Einstellungen nach can_permanently_delete gesucht und konnte es nicht finden.

Die Site-Einstellung ist ausgeblendet, da wir ihre Verwendung nicht empfehlen. Sie wurde für Fälle entwickelt, in denen sensible Informationen veröffentlicht wurden und diese vollständig aus der Datenbank entfernt werden müssen. Außerdem handelt es sich bei dieser Operation ohnehin nicht um eine Massenoperation.

Da es sich um eine ausgeblendete Site-Einstellung handelt, kann sie nur über die Konsole aktiviert werden.

Das ist fast genau das, was ich brauche! Danke.

Wie müsste ich die Syntax schreiben, damit sie nur alle Beiträge abdeckt, die vor dem xxxx-Datum gelöscht wurden?

Das wäre Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...).

Können Sie uns bitte mitteilen, wie man es über die Konsole aktiviert?

Hier sind die Anweisungen:

Funktion über die Konsole aktiviert, aber wie kann ich gelöschte Beiträge endgültig löschen? Alle Beiträge sind in „gelöschte Beiträge" enthalten.

Ich bin zwar kein Experte auf diesem Gebiet, aber es scheint, als gäbe es in diesem Thema genügend Informationsfragmente, um den von dir gesuchten Code zu erstellen.

Das Thema, das ich am Anfang verlinkt habe, enthält Warnungen der Entwickler dazu, dass dies Neuland ist und du es auf eigenes Risiko durchführst. Sie stellen jedoch auch das „destroy_all"-Element bereit, das nützlich erscheint, und empfehlen, zunächst mit Batches zu arbeiten.

In diesem Thema gibt es zudem ein paar Beispiele, wie man entweder Beiträge oder Themen anspricht, was (in Kombination mit den Beispielen von @RGJ zum Ansprechen bestimmter Beiträge) dich sehr weit bringen sollte.

Ich habe jedoch keine Erfahrung damit, daher kann ich es leider nicht freigeben, da ich es noch nie selbst ausprobiert habe. :man_shrugging:

Um alte Beiträge in unserem Forum zu löschen, habe ich dies verwendet. Es ist das Ergebnis einer Kombination aus The proper way to completely delete hundred of topics via rails? und den Vorschlägen von @RGJ.

Ich habe mich schließlich dafür entschieden, da ich die Daten unbedingt aus der Datenbank entfernen wollte, um die Privatsphäre der Nutzer zu schützen. Das Ersetzen des Texts durch „Dieser Beitrag wurde gelöscht" lässt den Bearbeitungsverlauf intakt und relativ leicht zugänglich, was also nicht ausreicht.

Da wir 20.000 Themen zu löschen hatten, hat es eine Weile gedauert!

Topic.with_deleted.where("deleted_at < '2021-08-28'").limit(1000).destroy_all

Da dies viele verwaiste Beiträge hinterließ, musste ich dies mit folgendem Befehl nachbessern:

Post.where('topic_id not in (select id from topics)').limit(1000).destroy_all

Ich stelle mir vor, dass dein ./launcher cleanup danach auch noch etwas Speicherplatz freigemacht hat :slight_smile:

Leider ist die Tabelle posts trotz erfolgreich ausgeführten Befehls immer noch voller verwaister Beiträge. Die Tabelle topics wurde hingegen sauber bereinigt. Die Beiträge sind nicht erreichbar, wenn ich versuche, sie über /t/topic_id aufzurufen, was wahrscheinlich daran liegt, dass keine gültige Topic-ID vorliegt. Ich verstehe jedoch nicht ganz, warum sie trotzdem noch in der Tabelle vorhanden sind.

Hat jemand einen besseren Vorschlag, wie man die Tabelle posts bereinigen kann?