삭제된 게시물을 일괄적으로 영구 삭제할 수 있나요?

어리석은 질문일 수도 있지만 죄송합니다 …
왜 Discourse에서는 데이터베이스에서 메시지를 쉽게 삭제할 수 없나요?

Discourse는 실수를 쉽게 수정할 수 있도록 '소프트 삭제’라는 메커니즘을 사용합니다. 또한 '다른 사용자에게 삭제됨’과 '관리자에게 삭제됨’을 구분할 수 있게 해줍니다.

데이터베이스의 무결성도 유지합니다. 삭제된 게시물이 인용(삭제되기 전에)된 경우 어떻게 될까요? 그러면 인용한 게시물이 더 이상 존재하지 않는 게시물을 참조하게 됩니다. 이는 다양한 오류로 이어질 수 있습니다.

이제 이해했어요… 유일한 문제는 삭제된 메시지가 많을 때예요.

이전에 여러 번 논의되고 요청된 바 있습니다. 예를 들어:

소프트 삭제(soft-delete)가 유용할 수 있다는 점은 이해하지만, 일정 기간(예: 1주 또는 1개월)이 지난 후에는 공간을 절약하고 법적 준수(예: 불법적인 게시물이 올라왔거나, GDPR 준수를 위해 개인 정보를 삭제해야 하는 경우)를 보장하기 위해 삭제된 항목이 실제로 완전히 제거되었으면 합니다.

로그인하여 rake 작업을 실행해 메시지를 '이것은 삭제되었습니다’로 대체해야 하는 것은 다소 번거롭습니다.

아… 죄송합니다. phpBB에서 넘어온 터라 가능할 줄 알았네요.

지금 구현되었습니다

고맙습니다.

하지만 그걸 어떻게 하는 거죠???

오늘 아침에 계속 해보고 있는데, 도저히 모르겠어요. :slightly_smiling_face: 힌트 좀 주실 수 있을까요?

음, 설정은 관리자 > 설정 > 보안(현재는 어떤 이유로든 숨겨져 있음)에서 설정해야 하고, 각 관리자에게는 모더레이터와 마찬가지로 권한을 부여해야 합니다.

권한이 부여되면 게시글 관리자 메뉴에 표시됩니다.

아, 그게 제 걸림돌이었군요. 관리자 설정에서 can_permanently_delete를 찾아봤는데 보이지가 않더라고요.

해당 사이트 설정은 사용을 권장하지 않기 때문에 숨겨져 있습니다. 이 기능은 민감한 정보가 게시된 경우 데이터베이스에서 완전히 제거해야 하는 상황에 대비하여 개발되었습니다. 또한 이 작업은 대량 작업이 아닙니다.

숨겨진 사이트 설정이므로 활성화하려면 콘솔에서만 가능합니다.

제가 필요로 하는 것과 거의 정확히 일치합니다! 감사합니다.

xxxx 날짜 이전에 삭제된 모든 게시글만 포함하도록 문법을 어떻게 작성해야 할까요?

그것은 Post.with_deleted.where("deleted_at < 'YYYY-mm-dd'").update_all(...)가 될 것입니다.

콘솔에서 활성화하는 방법을 알려주실 수 있나요?

다음은 지침입니다:

콘솔에서 기능을 활성화했지만, 삭제된 게시물을 어떻게 영구 삭제할 수 있나요? 모든 게시물이 삭제된 게시물 목록에 남아 있습니다.

저는 이 분야에 전문가가 아니지만, 이 주제에 담긴 정보 조각들이 충분해 보이니 찾고 계신 코드를 만들 수 있을 것 같습니다.

처음에 링크드 주제에는 이 영역이 아직 미개척지라는 창작진의 경고가 포함되어 있으며, 모든 작업은 본인의 책임 하에 진행해야 한다는 내용이 있습니다. 하지만 유용해 보이는 ‘destroy_all’ 부분도 제공하고, 처음에는 배치 처리를 해보라고 조언하고 있습니다.

해당 주제에는 게시글이나 주제를 대상으로 하는 방법의 예시도 몇 가지 있으며, @RGJ 님이 제시한 특정 게시글을 대상으로 하는 방법의 예시와 함께 사용하면 거의 원하는 결과를 얻을 수 있을 것입니다.

다만 저는 이 부분에 대해 경험이 없어서, 직접 해본 적이 없으므로 최종 승인은 내릴 수 없습니다. :man_shrugging:

포럼의 오래된 게시물을 삭제하기 위해 다음 방법을 사용했습니다. 이는 The proper way to completely delete hundred of topics via rails? 와 @RGJ 님의 제안을 결합한 결과입니다.

결국 이렇게 진행한 이유는, 사용자 프라이버시를 보호하기 위해 데이터베이스에서 데이터를 완전히 제거하고 싶었기 때문입니다. 텍스트를 "이 게시물은 삭제되었습니다"로만 재작성하면 편집 이력이 그대로 남아 있고 비교적 쉽게 접근할 수 있어 충분하지 않았습니다.

삭제해야 할 토픽이 20,000개나 되어 시간이 꽤 걸렸습니다!

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

이 작업으로 인해 고아(Orphaned) 게시물이 많이 남았기 때문에, 다음을 추가로 실행해야 했습니다:

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

이후 ./launcher cleanup 명령을 실행하면서 일부 용량도 확보되었을 것 같습니다 :slight_smile:

불행히도, 코드가 예상대로 실행되었음에도 불구하고 posts 테이블에는 여전히 고아 게시글이 가득 차 있습니다. topics 테이블은 깔끔하게 비워졌지만요. /t/topic_id로 게시글을 방문하려고 하면 접근할 수 없는데, 이는 유효한 Topic ID가 없기 때문일 가능성이 높습니다. 하지만 왜 테이블에 여전히 남아 있는지는 정확히 이해가 되지 않습니다.

posts 테이블을 정리하는 더 나은 방법이 있을까요?