Удаление карточек со связями

Удаление карточек со связями

В ходе процесса внедрения системы Docsvision, наступает момент, когда необходимо очистить базу от тестовых данных. Созданные ранее карточки документов, заданий, группы заданий, согласования и т.д., в жизни они обычно имеют смешные, импровизированные названия 🙂 , не позволяют передать решение заказчику. Что может быть проще, чем их просто удалить, подумает инженер и примется за работу. Не знаю кто как, но я такую задачу начинаю с документов, где все большинстве случаев все проходит гладко, но только стоит дойти до процесса удаления заданий и группы заданий начинаются проблемы. Обычно данные типы карточек, очень часто связаны ссылками, что делает процесс удаления невозможным. В ходе удаления вы сталкиваетесь с ошибкой:

Невозможно удалить карточку "...".

"..." - Карточка не может быть удалена, так как она используется в других карточках.

Выхода из такой ситуации два:

  1. Оставить все, как есть
  2. Разрывать связи между карточками и уже после этого их удалять.

Я предпочитаю второй вариант, для этого потребуется удалить связи для карточек с необходимыми условиями. Удаление связей происходит через запрос к БД. Предоставлю здесь два варианта, для 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} — данные секции «Основная информация», карточки типа «Группа заданий».

Поэтому можете использовать предыдущие запросы, замените лишь название таблицы, а весь остальной текст останется прежним.

Подобные запросы можно написать и другими вариациями, но основной смысл вам должен быть понятен. После удаления связей ,вы сможете уже удалить карточки из рабочего места администратора без ошибок.


Опубликовано

в

от


  1. Аватар пользователя Lex
    Lex

    Спасибо тебе добрый человек, столько лет мучений с удалением карточек и тут эта статья.
    Интересно еще как с бизнес-процессами, получится ли таким же образом обойтись с карточками экземпляров БП, которые были созданы из документов или заданий?

    1. Аватар пользователя dvadmin

      Здравствуйте, спасибо за проявленный интерес!
      Да, в целом с БП можно поступить аналогично, в запросе необходимо будет использовать таблицу секции карточек БП, например dvtable_{0ef6bcca-7a09-4027-a3a2-d2eeeca1bf4d} . А так в целом , вся информация о ссылках хранится в «dvsys_links» и нужно удалить оттуда записи именно тех карточек, что вам нужны. Указывая таблицу с секцией мы можно сказать делаем фильтр по типу карточки + даем возможность добавлять условия на набор данных из этой секции.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *