мета-данные страницы
  •  

Это старая версия документа!


Удаление фото из базы данных

Планирование

Первым делом, необходимо обращение, в котором мы будем согласовывать с клиентом нюансы.Например:

  • Когда проводить работы;
  • Уточняем время Рабочего дня клиента;
  • Есть ли возможность занять начало рабочего дня, если вдруг удаление не успевает пройти;
  • Дату, до которой очищаем фото;

При планировании надо проверить:

  • Наличие свободного места для:
    • бэкапа базы с фото;
    • оптимизации(это минимум размер БД*3);
  • Наличие и правильность процедуры для удаления фото;
  • Отсутствие у клиента облачного хранилища или использования для хранения фотографий локального хранилища (Химчистка/Сервис/Другие сервисы/Настройка хранилища данных - на закладке «Локальное хранилище» не активен чекбокс «Включить хранение фото в локальном хранилище», на закладке «Облачное хранилище» не активен чекбокс «Активировано»). При наличии облачного или использовании для хранения фотографий локального хранилища удаление по сценарию, указанному в этой инструкции, не производить.

О процедуре

Процедура называется SP_DEL_OLD_PHOTOS и имеет следующую «начинку»:

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

begin
/*select value_int
from option_values ov
where ov.option_name='GL_STORE_PHOTO_MNTHS'
into :MNTHS;

if (:MNTHS is null) then
    MNTHS=3;

for
 select dos.id
 from docs_order dor
   inner join doc_order_services dos on dos.doc_order_id=dor.id
 where abs(f_monthsbetween(dor.date_out_fact, 'NOW')) > :MNTHS and
       dor.status_id in (5,6,7)
 into :dos_id
do
begin
 delete
 from doc_order_serv_photos dp
 where dp.dos_id = :dos_id;
 end */

  for
select dp.id
from docs_order dor
  left join doc_order_services dos on dos.doc_order_id=dor.id
  left join doc_order_serv_photos dp on dp.dos_id = dos.id
where dor.date_out_fact is not null and
      cast(dor.date_out_fact as date) > '12.02.2018' and  -- начало периода
      cast(dor.date_out_fact as date) < '06.03.2019' and  -- конец периода
      dor.status_id in (5,6,7) and
      dp.id is not null
into :DP_ID
do
begin
 delete from doc_order_serv_photos dp where dp.id = :DP_ID and coalesce(dp.is_main_photo, 0) = 0; --Если в таблице нет колонки is_main_photo, то убрать условие "and coalesce(dp.is_main_photo, 0) = 0"
end
end


Если в базе клиента другая(такое возможно), нужно создать новую, проведя скрипт через Script Executive (Ctrl+F12 в IBE)

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

SET TERM ^ ;

CREATE OR ALTER procedure SP_DEL_OLD_PHOTOS_1 --Название изменено,чтобы не перетирать старую процедуру 
as
declare variable DOS_ID D_INT64;
declare variable MNTHS D_INTEGER;
declare variable DP_ID D_INT64;
begin
/*select value_int
from option_values ov
where ov.option_name='GL_STORE_PHOTO_MNTHS'
into :MNTHS;

if (:MNTHS is null) then
    MNTHS=3;

for
 select dos.id
 from docs_order dor
   inner join doc_order_services dos on dos.doc_order_id=dor.id
 where abs(f_monthsbetween(dor.date_out_fact, 'NOW')) > :MNTHS and
       dor.status_id in (5,6,7)
 into :dos_id
do
begin
 delete
 from doc_order_serv_photos dp
 where dp.dos_id = :dos_id;
 end */

  for
select dp.id
from docs_order dor
  left join doc_order_services dos on dos.doc_order_id=dor.id
  left join doc_order_serv_photos dp on dp.dos_id = dos.id
where dor.date_out_fact is not null and
      cast(dor.date_out_fact as date) > '12.02.2018' and  -- начало периода
      cast(dor.date_out_fact as date) < '06.03.2019' and  -- конец периода
      dor.status_id in (5,6,7) and
      dp.id is not null
into :DP_ID
do
begin
 delete from doc_order_serv_photos dp where dp.id = :DP_ID and coalesce(dp.is_main_photo, 0) = 0; --Если в таблице нет колонки is_main_photo, то убрать условие "and coalesce(dp.is_main_photo, 0) = 0"
end
end^

SET TERM ; ^


Все проверили, работы запланировали, ждем даты X.

Проведение работ

Наступил день X. Подключились к ПК и видим нашу БД. Что дальше?

Подготовка

Перед удалением фото нужно переименовать и сделать копию БД с фото(для чего,думаю, понятно).

После этого, подключаемся к одной из БД в IBE. Сначала необходимо отключить триггер DOC_ORDER_SERV_PHOTOS_AD.

Если этого не сделать, то информация об удалении фото попадет в репликацию, что, свою очередь, очень сильно навредит клиенту и нам!
Как отключить? Находим наш триггер. Галка Is_Active стоит.
Снимаем ее и нажимаем на молнию (Compile Trigger) для того, что применить изменения.

Подготовка завершена.

Удаление фото

Теперь находим процедуру для удаления фото. В ней нас интересует блок

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

where dor.date_out_fact is not null and
      cast(dor.date_out_fact as date) > '12.02.2018' and  -- начало периода
      cast(dor.date_out_fact as date) < '06.03.2019' and  -- конец периода

В данном случае будут удалены фото с 12.02.2018 по 06.03.2019.

Обычно клиенты задают период до какой даты, например, до 01.01.2020. В этом случае мы комментирует строку начала периода, меняем дату конца периода и нажимаем молнию(Compile procedure), как в ситуации с триггером.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

where dor.date_out_fact is not null and
      --cast(dor.date_out_fact as date) > '12.02.2018' and  -- начало периода
      cast(dor.date_out_fact as date) < '01.01.2020' and  -- конец периода


Выставили нужную дату и теперь нажимаем Execute Procedure(F9)

Время удаления зависит от размера БД, периода удаления фото и мощности ПК. И так, удаление завершилось.

Процедура отработала, но результат еще не закоммичен и его можно откатить
Результаты таковы:

Строка 1 пишет о том, что было удалено 3 фото из БД.

Встает вопрос, что показала 2я строка?

Она говорит о том, что в репликацию попадет 3 записи для удаления фото. ЕЕ БЫТЬ НЕ ДОЛЖНО!
Возникла она из-за того, что Вы не отключили триггер Выше! Нужно откатить изменение(как? укажу ниже) и вернуться в пункту «Подготовка»

В зависимости от результата, применяем или отклоняем изменения.

Завершение

После применения изменений, нужно включить триггер DOC_ORDER_SERV_PHOTOS_AD. Находим наш триггер. Ставим галку Is_Active и нажимаем на молнию (Compile Trigger) для того, что применить изменения.

На этом можно процесс удаления фото закончен. Далее необходимо:

  • Провести оптимизацию для уменьшения размера БД;
  • Вернуть БД в работу, если оптимизация запланирована на другой день.

Назад