А почему среди триггеров вычислений нет события "Перед сохранением/вставкой"?
Приведу реальный пример: пусть продается некий дорогостоящий товар (таблица "Товары"), на поставку которого заключается договор (таблица "Договоры"), причем оплата по договору может быть договорной - вся сумма сразу либо рассрочка: "Договор" имеет поле-список "Тип оплаты"=[Сразу|В рассрочку] и соответственно два поля "Рассрочка: Годовой процент", "Рассрочка: Срок в месяцах". Обязательными для заполнения поля отметить не могу, т.к. тип оплаты может быть разный. Таким образом еще до вставки в таблицу необходимо убедиться в корректности введенных данных и если что-то не так - вообще не записывать ничего в базу, ибо сохранение чревато дальнейшими ошибками - человек может просто не заметить того, что сделал, а более того еще и пойти вносить платежи в ошибочный договор.
Проверять и удалять запись внутри вычислений "Сохранение в таблице" не предлагать - риск сбоя есть всегда и запись просто повиснет в базе.
JavaScript тоже - это проверка только на стороне клиента. В его обход всегда можно подсунуть на сервер любые данные - достаточно его просто отключить. Так надежные приложения не разрабатываются.
И встречный вопрос - есть ли 100% гарантия, что после вставки/обновления записи вычисления обязательно будут вызваны и отработают до конца, а в ином случае база останется в нетронутом состоянии? Работает ли ваше ядро по такому алгоритму?
/* ... где-то в недрах зашифрованных Zend'ом скриптов находится обработчик, запускающийся после нажатия кнопки Сохранить... */ /* Подключаемся к базе */ $link = mysqli_connect(...); /* >> В обязательном порядке открываем новую транзакцию, прежде чем что-то изменять << */ mysqli_autocommit($link, FALSE); /* Обновляем данные записи в таблице в рамках транзакции */ mysqli_query(...); /* Вызываем вычисления по триггеру "Сохранение в таблице" */ calc_save(); /* >> И только после всех этих действий закрываем транзакцию << */ mysqli_commit($link);
Как еще более строгий вариант - передавать в вычисления кроме $line еще и объект $link, обязав разработчика конфигурации работать только через него и в конце самому вызывать commit транзакции. И вот тогда любая работа с записями действительно будет одной цельной операцией. Иначе при любом сбое между инструкциями - сбой по питанию, например - который произойдет до завершения вычислений - и в базе окажется непредсказуемый хаос. Запись есть, а другие данные, с ней связанные окажутся испорчены или вообще не успеют появиться. Целостность данных должна быть в приоритете, ведь вы согласны?