30 мар. 2011 г.

Quick and dirty DB cleanup

На скорую руку, очистить базу от документов и проводок можно следующим образом:
  1. Отключить триггеры (перед этим желательно запомнить какие триггеры были в неактивном состоянии).
  2. Выполнить delete from ac_entry.
  3. Выполнить delete from inv_movement.
  4. Выполнить delete from inv_balance.
  5. Потом удалять данные из таблиц позиций документов (имена %LINE). Можно написать такой запрос: SELECT 'DELETE FROM ' || a.relationname || ';' FROM at_relations WHERE relationname like 'USR$%LINE', выполнить в IBExpert, скопировать в буфер результат и вставить в окно скрипта.
  6. Выполнять многократно delete from inv_card c where not exists (select c1.id from inv_card с1 where c1.parent = c.id) пока все не удалится.
  7. Выполнять многократно delete from gd_document, смотреть какие таблицы ругаются и удалять из них информацию. Повторять, пока не очистится gd_document.
  8. Подключить отключенные триггеры.
Если надо оставить некоторые документы в базе, то соответствующие ограничения на типы документов или даты следует добавить в запросы удаления. В том случае, когда удаляются данные только некоторых документов, путем очистки соответствующих таблиц шапок и позиций, может пригодиться следующий запрос, который удаляет из таблицы gd_document все записи для которых нет связанных в специфических таблицах документов:
execute block
as
  declare variable stmt varchar(1024);
  declare variable dt integer;
  declare variable rn varchar(31);
begin
  for
    select t.id, r.relationname from at_relations r
      join gd_documenttype t on t.linerelkey =  r.id
    into :dt, :rn
  do begin
    stmt = 'delete from gd_document doc ' ||
      ' where doc.documenttypekey = ' || :dt ||
      ' and not (doc.parent is null) ' ||
      ' and not (doc.id in (select documentkey ' ||
      '   from ' || :rn || '))';
    execute statement :stmt;
  end
end

1 комментарий:

Александр комментирует...

6. Пункт
UPDATE INV_CARD
SET PARENT = null
6.1 DELETE FROM INV_CARD

Отправить комментарий