Как я могу удалить все ревизии узла / поля?

17

У меня есть друпал 7 сайтов, где хранятся ревизии узлов и полей. Я сохраняю ревизии для случая, когда по ошибке сохраняется новая неисправная версия, и я хочу вернуться обратно.

Но теперь я хочу очистить и оптимизировать базу данных, чтобы занимать меньше места на жестком диске.

Какие существуют способы удаления всех ревизий, кроме текущей, для всех узлов / полей сайта?

Джон
источник

Ответы:

13

Используйте модуль Node Revision Delete для удаления и управления вашими ревизиями. (Я поддерживаю модуль.)

Модуль Node Revision Delete позволяет вам управлять версиями Node по вашему выбору. Это поможет вам сохранить определенное количество ревизий для узла. Этот модуль предоставляет вам гибкость для применения удаления ревизии для определенного типа контента и запуска его в определенное время. Вы можете управлять своими настройками со страницы администрирования удаления редакции узла.

Каушал Кишоре
источник
Можете ли вы удалить полевые ревизии с помощью Node Revision Delete? Я не вижу никаких вариантов сделать это с этим модулем
BlondeSwan
15

Еще нет стабильной версии для удаления Revision, но порт D7 уже в пути (не уверен, работает ли он вообще).

В этой теме кто-то предложил использовать VBO, чтобы изолировать ревизии и удалить их.

Если вы чувствуете себя комфортно с API, сделайте цикл по всем вашим узлам, извлеките ревизии с помощью node_revision_list()и удалите их с помощью node_revision_delete().

В крайнем случае, и если вам нравится возиться с БД ( как я ), вы можете удалить строки ревизий field_revision_*и node_revisionтаблицы. Попробуй это:

ВНИМАНИЕ: совсем не проверено!

DELETE FROM field_revision_body
WHERE NOT EXISTS (
  SELECT NULL
  FROM node
  WHERE vid = revision_id
);

DELETE FROM node_revision
WHERE NOT EXISTS (
  SELECT NULL
  FROM node
  WHERE node.vid = node_revision.vid
);

Вы можете найти полный список таблиц ваших ревизий в information_schemaбазе данных:

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE 'field_revision%'
AND TABLE_SCHEMA = 'your_database';
tostinni
источник
3
Модуль удаления редакции узла теперь имеет стабильную версию.
Свободное Радикальное
Тестируя это, я считаю, что условие на запросе node_revision должно быть WHERE node.vid = node_revision.vid. Ошибки как есть. Возможно, укажите таблицы в запросе field_revision_body?
цифрофер
Модуль Revision Deletion, упомянутый в этом ответе, рекомендует вместо этого использовать Node Revision Delete, поскольку нам не нужно, чтобы 5 модулей делали одно и то же. Смотрите принятый ответ.
mbomb007
2

В той же ситуации я использовал код ниже:

foreach (node_load_multiple($nids) as $node) {
  // Delete sub revisions.
  foreach (node_revision_list($node) as $vid => $revision) {
    node_revision_delete($vid);
  }
  // Delete archived revisions.
  revisioning_delete_archived_revisions($node);
}
mrded
источник
1

Я сделал это для людей VBO (выполнить произвольный PHP), он удалит все ревизии (кроме текущей). Это зависит от встроенного порядка сортировки node_revision_list(), поэтому сделайте резервную копию вашей БД и проверьте желаемые результаты, прежде чем использовать данные в реальном времени .

  krumo($entity);

  $revision_array = node_revision_list($entity);  
  $revision_array_ASC = array_reverse($revision_array, TRUE);
  krumo($revision_array_ASC);
  krumo(count($revision_array_ASC));

  foreach ($revision_array_ASC as $vid => $node) {
    $count = count($revision_array_ASC);
    if ($count > 1) {
          node_revision_delete($vid);
    }
  }

  $revision_array = node_revision_list($entity);  
  krumo($revision_array);
Меррик
источник
Похоже, у вас большие проблемы, чтобы избежать удаления текущей ревизии (сортировка, подсчет). Но node_revision_delete уже предотвращает удаление текущей ревизии.
dxvargas
0

Модуль удаления редакции узла теперь имеет стабильную версию.

Модуль Node Revision Delete позволяет вам отслеживать и удалять старые версии типов контента. Функции:

  • Определите максимальное количество ревизий, чтобы сохранить для каждого типа контента.
  • Бег на Drush, cron run или в другой период (ежедневно, еженедельно и т. Д.).
Juampy NR
источник