====== Удаление фото из базы данных ====== ===== Планирование ===== Первым делом, необходимо **__обращение__**, в котором мы будем согласовывать с клиентом нюансы. Например: * Когда проводить работы. Удаление может занять много время, нужно согласовать с клиентом время работ, чтоб не мешать их работе; * Есть ли возможность занять начало рабочего дня, если вдруг удаление не успевает пройти; * Дату, до которой очищаем фото; При планировании надо проверить: *Наличие свободного места для: * бэкапа базы __с фото__; * оптимизации(это минимум размер БД*3). Понадобится делать backup/restore, для этого нужно будет место; * Наличие и правильность процедуры для удаления фото; * Отсутствие у клиента облачного хранилища или использования для хранения фотографий локального хранилища (Химчистка/Сервис/Другие сервисы/Настройка хранилища данных - на закладке "Локальное хранилище" не активен чекбокс "Включить хранение фото в локальном хранилище", на закладке "Облачное хранилище" не активен чекбокс "Активировано"). **При наличии облачного или использовании для хранения фотографий локального хранилища удаление по сценарию, указанному в этой инструкции, не производить**. ==== Удаление старых фото ==== {{ :pasted:20220609-085349.png?400 |}} 1. Сделать копию БД. Делается для того, чтоб при возникновении какого-то сбоя или если клиент неожиданно передумает, у нас была БД от куба мы могли бы восстановить данные или полностью заменить этой базой \\ \\ 2. Проверить наличие в БД процедуры SP_DEL_OLD_PHOTOS_DT. Для этого открываем IBExpert, в в поиск копируем название этой процедуры и убеждаемся в ее наличие. Данная процедура необходима для удаления старых фотографий за указанный период\\ \\ 3. Убедиться что код в процедуре соответствует скрипту, см. ниже. У клиента может находится старая версия этой процедуры, а выполнять нужно только в актуальном состоянии\\ SET TERM ^ ; CREATE OR ALTER procedure SP_DEL_OLD_PHOTOS_DT ( DATE_FIRST D_TIMESTAMP, DATE_LAST D_TIMESTAMP) as declare variable DOSP_ID D_INT64; begin 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) >= :DATE_FIRST and -- начало периода cast(dor.date_out_fact as date) <= :DATE_LAST and -- конец периода dor.status_id in (5, 6, 7) and dp.id is not null into :DOSP_ID do begin delete from doc_order_serv_photos dp where dp.id = :DOSP_ID and coalesce(dp.is_main_photo, 0) = 0; --Если в таблице нет колонки is_main_photo, то убрать условие "and coalesce(dp.is_main_photo, 0) = 0" end end^ SET TERM ; ^ \\ Если код не соответствует, в IBExpert нажимаем Ctrl+F12, копируем текст из скрипта в поле и нажимаем F9. 4. Отключить триггер **DOC_ORDER_SERV_PHOTOS_AD** (если триггера нет, пропускаем этот пункт). Для этого убираем галочку с "IsActive", потом жмем "Compile". Триггет мы отключаем для того, чтоб удаленные данные не попали в лог репликации и это удаление не уходило по репликации (если не пунктах нужно будет уменьшить место, то нужно будет делать новую БД на основе центральной) {{ :pasted:20220609-090744.png }} Если этого не сделать, то информация об удалении фото попадет в репликацию, что, свою очередь, очень сильно навредит клиенту и нам! 5. Отключить остальные триггеры на удаление по таблице DOC_ORDER_SERV_PHOTOS (как отключить см. п.4) {{ :pasted:20220610-125250.png }} 6. Убедиться в наличие индекса **DOR_IDX_DT_OUT_FACT** в таблице **DOCS_ORDER**. Без этого индекса скрипт по удалению фото может очень долго работать. {{ :pasted:20220609-091056.png }} Если индекса нет, провести скрипт: CREATE INDEX DOR_IDX_DT_OUT_FACT ON DOCS_ORDER (DATE_OUT_FACT); \\ 7. В IBExpert нажимаем Ctrl+F12, вставить скрипт. За место параметров :DATE_FIRST, :DATE_LAST период за который нужно удалить фото и выполнить его нажав F9. execute procedure SP_DEL_OLD_PHOTOS_DT('01.01.2021', '31.12.2021'); commit; \\ {{ :pasted:20220609-091959.png }} Время удаления зависит от размера БД, периода удаления фото и мощности ПК. 8. Включить триггер **DOC_ORDER_SERV_PHOTOS_AD** (если триггера нет, пропускаем этот пункт). Для этого ставим галочку с "IsActive", потом жмем "Compile". Возвращаем триггер к прежнему состоянию, чтоб он все действия фиксировал в логе репликации \\ \\ 9. Включить остальные триггеры на удаление (которые были выключены в п.4) \\ \\ 10. Сделать backup/restore. Без этой операции размер БД не уменьшится, только после restore мы увидим каким размером БД стала после удаления старых фото. \\