Предпосылки
здесь. В этой теме сразу выводы.
1. Следующий запрос выдаёт не пустой результат:
Код:
SELECT
*
FROM
contract_limit_manage m,
contract_limit_period p
WHERE
m.clp_id = p.id AND
m.cid != p.cid;
Т. е. изменение лимита через веб на одном договоре ссылается в том числе на задачу восстановления лимита другого договора! В результате этого в клиенте отображается две задачи на восстановление лимита, и они обе выполняются в назначенное время. Вопрос к разработчикам: почему при формировании списка задач на восстановление лимита не проверяется соответствие кодов договоров?
2. Следующий запрос также выдаёт не пустой результат:
Код:
SELECT
m.*
FROM
contract_limit_manage m
LEFT JOIN contract c ON m.cid = c.id
WHERE
c.id IS NULL;
Получается, что договор удалили, история изменения лимитов через веб для удалённого договора сохранилась.
3. Ну и напоследок:
Код:
SELECT MAX(p.id), MAX(m.clp_id) FROM contract_limit_period p, contract_limit_manage m;
160 689
SELECT COUNT(*) FROM contract_limit_manage m WHERE m.clp_id > 160;
378
Как так понимать, задача на восстановление лимита ещё не существует, а в истории изменения лимитов через веб уже есть её идентификатор?
Тут стоит заметить, что проблемные данные в таблицах имеют даты меньше 2010 года, т. е. если проблемы и были, то более двух лет назад, когда был древний биллинг. С тех пор мы уже несколько раз обновились. Поэтому актуальна остаётся только проблема 1: идентификаторы договоров лучше всё-таки сравнивать.