В ходе процесса внедрения системы Docsvision, наступает момент, когда необходимо очистить базу от тестовых данных. Созданные ранее карточки документов, заданий, группы заданий, согласования и т.д., в жизни они обычно имеют смешные, импровизированные названия 🙂 , не позволяют передать решение заказчику. Что может быть проще, чем их просто удалить, подумает инженер и примется за работу. Не знаю кто как, но я такую задачу начинаю с документов, где все большинстве случаев все проходит гладко, но только стоит дойти до процесса удаления заданий и группы заданий начинаются проблемы. Обычно данные типы карточек, очень часто связаны ссылками, что делает процесс удаления невозможным. В ходе удаления вы сталкиваетесь с ошибкой:
Невозможно удалить карточку "...".
"..." - Карточка не может быть удалена, так как она используется в других карточках.
Выхода из такой ситуации два:
- Оставить все, как есть
- Разрывать связи между карточками и уже после этого их удалять.
Я предпочитаю второй вариант, для этого потребуется удалить связи для карточек с необходимыми условиями. Удаление связей происходит через запрос к БД. Предоставлю здесь два варианта, для MS SQL и PostgreSQL.
Удаление связей для карточек заданий.
MS SQL:
Запрос, удаляющий связи карточек, зависящий от указанных (результат выполнения подзапроса после логического условия IN).
DELETE FROM [dbo].[dvsys_links]
WHERE SourceCardID IN (
SELECT tMainInfo.InstanceID FROM [dvtable_{20D21193-9F7F-4B62-8D69-272E78E1D6A8}] as tMainInfo
JOIN dvsys_instances as tIns on
tMainInfo.InstanceID = tIns.InstanceID
JOIN dvsys_instances_date as tInsDate on
tMainInfo.InstanceID = tInsDate.InstanceID
WHERE
tInsDate.CreationDateTime > Convert(datetime, '2023-07-04' ) AND
tIns.Template = 0 AND
tIns.Deleted = 0
);
Следующий запрос позволит удалить зависимости указанных карточек от других карточек.
DELETE FROM [dbo].[dvsys_links]
WHERE DestinationCardID IN (
SELECT tMainInfo.InstanceID FROM [dvtable_{20D21193-9F7F-4B62-8D69-272E78E1D6A8}] as tMainInfo
JOIN dvsys_instances as tIns on
tMainInfo.InstanceID = tIns.InstanceID
JOIN dvsys_instances_date as tInsDate on
tMainInfo.InstanceID = tInsDate.InstanceID
WHERE
tInsDate.CreationDateTime > Convert(datetime, '2023-07-04' ) AND
tIns.Template = 0 AND
tIns.Deleted = 0
);
В данных запросах я выделил строки, отвечающие за условия поиска необходимых карточек. В текущем примере выполняется поиск карточек, созданных позже 4 июля 2023 года, не являющиеся шаблонами и не помеченных на удаление. В вашем случае возможны и другие варианты, для этого необходимо дополнить запрос самостоятельно, либо напишите в комментарии, а я постараюсь вам подсказать.
PostgreSQL:
Здесь синтаксис немного другой, но логика остается прежней.
DELETE FROM "dvsys_links"
WHERE "SourceCardID" IN (
SELECT tMainInfo."InstanceID" FROM "dvtable_{20d21193-9f7f-4b62-8d69-272e78e1d6a8}" as tMainInfo
JOIN "dvsys_instances" as tIns on
tMainInfo."InstanceID" = tIns."InstanceID"
JOIN "dvsys_instances_date" as tInsDate on
tMainInfo."InstanceID" = tInsDate."InstanceID"
WHERE
tInsDate."CreationDateTime" > '2023-07-04'::date AND
tIns."Template" = false AND
tIns."Deleted" = false
);
---
DELETE FROM "dvsys_links"
WHERE "DestinationCardID" IN (
SELECT tMainInfo."InstanceID" FROM "dvtable_{20d21193-9f7f-4b62-8d69-272e78e1d6a8}" as tMainInfo
JOIN "dvsys_instances" as tIns on
tMainInfo."InstanceID" = tIns."InstanceID"
JOIN "dvsys_instances_date" as tInsDate on
tMainInfo."InstanceID" = tInsDate."InstanceID"
WHERE
tInsDate."CreationDateTime" > '2023-07-04'::date AND
tIns."Template" = false AND
tIns."Deleted" = false
);
Удаление связей для карточек ГРУППЫ заданий.
Здесь запрос остается тем же самым, что и для заданий, только лишь вместо таблицы dvtable_{20d21193-9f7f-4b62-8d69-272e78e1d6a8} необходимо использовать dvtable_{7a6593bb-0bdb-4082-b43b-8f26594eff91}. На всякий случай поясню по таблицам:
dvtable_{20d21193-9f7f-4b62-8d69-272e78e1d6a8} — данные секции «Задание», карточки типа «Задание», именно в ней хранится основная информация.
dvtable_{7a6593bb-0bdb-4082-b43b-8f26594eff91} — данные секции «Основная информация», карточки типа «Группа заданий».
Поэтому можете использовать предыдущие запросы, замените лишь название таблицы, а весь остальной текст останется прежним.
Подобные запросы можно написать и другими вариациями, но основной смысл вам должен быть понятен. После удаления связей ,вы сможете уже удалить карточки из рабочего места администратора без ошибок.
Добавить комментарий