runCommand
В функцию FunDB.runCommand(queryString)
можно передать INSERT
, UPDATE
или DELETE
запрос.
Это можно использовать в триггерах и процедурах (экшнах) для массовой вставки, изменения или удаления данных в соответствии с бизнес-логикой вашей системы
Недоступно использование
INSERT
в таблице, на которой естьINSERT
триггер(ы)
Недоступно использованиеUPDATE
для поля в таблице, на котором естьUPDATE
триггер(ы).
Недоступно использованиеDELETE
в таблице, на которой естьDELETE
триггер(ы)При попытке выполнить команду появится ошибка
"Mass modification on entities with triggers is not supported"
runCommand
)Кейс: При добавлении нового сотрудника (base.people
), добавляем его к списку "Ответственных" (owners_for_tasks.responsible
) для всех активных задач с тегом "Общая" (tasks.tag = 'Общая'
). Для таблицы ответственных за задачи (pm.owners_for_tasks
) нет INSERT
триггеров
/* trigger entity: base.people
trigger type: AFTER INSERT */
export default async function addToActiveTasks(event, args) {
const cmd = `{ $person reference(base.people) }:
INSERT INTO pm.owners_for_tasks(responsible, task)
SELECT $person as responsible, id as task
FROM pm.tasks
WHERE tag = 'Общая' AND status = 'active`
await FunDB.runCommand(cmd, { person: event.source.newId });
return true;
};
Кейс: Пишем экшн, позволяющий убрать сотрудника(base.people
) из поле "Ответственный"(tasks.responsible
) для всех его задач. Для поля "Ответственный" в таблице задач (pm.tasks
) нет UPDATE
триггеров.
export default async function updateResponsible(args) {
const cmd = `{ $person reference(base.people) }:
UPDATE pm.tasks
SET responsible = NULL
WHERE responsible = $person`;
await FunDB.runCommand(cmd, { person: args.person });
return { ok: true };
};
Кейс: После фиксации суммы остатков на счетах на определенную дату(balances.commit_date
) удаляем все транзакции до этой даты. Для таблицы транзакций (fin.transactions
) нет DELETE
-триггеров.
/* trigger entity: fin.balances
trigger type: AFTER INSERT */
export default async function deleteOldTransactions(event, args) {
const cmd = `{ $datetime datetime }:
DELETE FROM fin.transactions
WHERE transaction_datetime <= $datetime`
await FunDB.runCommand(cmd, { datetime: args.commit_date });
return true;
};