Коррекция базы после удаления блога - есть решение

Иногда после удаления блога «сыплется сайт», и без лазания в базу ручками восстановить работоспособность нереально. И топики с описанием такого рода проблем появляются на этом сайте с завидной регулярностью. Потому и было предложено решение. И да, я опять задействовал для этого админку aceAdminPanel. Но в данном случае, по-моему, это более, чем оправдано :)

В плагине aceAdminPanel появилась новая позиция в меню: «Контроль БД» с единственным пока пунктом «Проверка удаленных блогов». Выполняется проверка, не состоят ли юзеры в удаленных блогах, и нет ли онлайн-комментариев, которые ссылаются на удаленные блоги. Если такие находятся — они выводятся админу. Хочет админ — пусть дальше разбирается, что там не так, либо может одним кликом удалить ссылки на удаленные блоги (вот, опять тавтология).

Кстати, я давно пришел к мысли, что даже в таблицах InnoDB не стоит полагаться на внешние ключи, а при удалении сущностей надо тщательно удалять также и все зависимые сущности, так, как будто нет этих ключей. Удаление — редкая операция, и пара-другая «холостых» запросов на удаление погоды не сделает, но может избавить от разных неожиданностей

20 комментариев

avatar
Штука хорошая
Но я никак не могу воспроизвести этот кейс, есть четкие шаги, чтобы повторить баг?
  • ort
  • 0
avatar
У меня пару дней назад была подобная проблема, день ушел на перелопачивание базы руками. Точно сказать не могу из-за чего, но по предположению так случается тогда, когда удаляешь блог в котором есть топики (с удалением топиков, а не переносом их в другой блог). В итоге в прямом эфире (в блоке и на странице), а также на странице публикаций пользователя (комментарии), автора коммента к удаленному топику сыплются ошибки, потому как сами комменты остаются и они ссылаются на несуществующие топики и боги.
avatar
… топики и блоги.
avatar
Да, так и есть. Я для тестов делал так:
1) Создается блог, юзер на этот блог подписывается, создает в нем топик и комментарий к нему
2) Этот блог удаляется
3) Наблюдаем ошибки в профайле юзера и в прямом эфире

А для надежности я еще таблицу с блогами из InnoDB в MyISAM переводил
avatar
Если юзер состоит в блоге в момент его удаления, то возникает еще и ошибка при попытке публикации данным юзером топика, но эта тема уже как-то поднималась, поэтому я при удалении блога убираю предварительно подписчиков, так что вышеописанная проблема возникает и в случае, если в блоге один админ.

Да, и кстати, подскажите кто: после удаления топика он должен удаляться из базы или нет? Потому как в первом случае еще и с топиками что-то не то — в базе они остаются (предположительно те, которые были в удаляемом блоге, а может и все — хз, терпения не хватило проверять).
avatar
после удаления топика он должен удаляться из базы или нет?
По хорошему — должен. И если блог удаляется, то его топики тоже должны удаляться
avatar
возможно в кешах остаются зависимости и следует збрасывать кеш после удаления блогов?
avatar
нет, реально в таблицах базы остаются
во всяком случае, подписка на удаленный блог точно остается, даже если все в InnoDB
avatar
а в файле дампа инсталятора прописаны зависимости?
avatar
Не знаю, не смотрел специально. Но, как писал, считаю, что более правильный путь — явно удалять все зависимые сущности
avatar
т.е. вручную ещё и delete для всего вызвать?
avatar
Что значит вручную? В модуле при отработке Blog_Delete() явно удалять все зависимое
avatar
ну я это и имею ввиду — чистить все таблицы явно связанные?
avatar
А, ну да — все таблицы
avatar
Я так понимаю нужно качать обновление?
avatar
Сначала глянь у себя в админке — возможно там уже есть :)
Я не афишировал эту фичу, т.к. хотел, чтоб ее проверили на практике
avatar
Я уже обновился.
avatar
Тут в плагине «Форум» при удалении форума «спрашивается» куда перенести посты из этого топика или удалить их. Нельзя сделать по такому же принципу?
avatar
… из этого форума
avatar
Можно было бы сделать чтоб при удалении блока, появлялась окно в котором показано что за топики находятся в этом блоке и сверху написано.
Предупреждение если удалить блог и не удалить топики которые содержаться в блоке произойдет фатал ерор) или пойти дальше.
Предупреждение если вы удалите этот блог, то все ваши топики которые находятся в этом блоке, тоже удаляться.
теперь еще дальше пойдем.
Предупреждение если вы хотите удалить этот блог то вам необходимо перенести все виды топиков, в другой блог.
или еще кручи, можно объединить все что я написал в месте.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.