Таблица public.triggers cодержит список триггеров, которые выполняются при заданных операциях.
Триггером является модуль ECMAScript, экспортирующий по умолчанию функцию-обработчик. Сигнатуры функций-триггеров и API, доступный внутри, можно изучить в виде сигнатур TypeScript здесь.
https://bitbucket.org/ozma/ozma-api/src/master/src/serverside_api.d.ts
Описание полей таблицы public.triggers:
allow_broken ( bool) - флаг, разрешающий сохранить некорректно заданный триггер (например, с синтаксическими ошибками)schema_id (reference (public.schemas)) - схема, к которой привязан данный триггер.trigger_entity_id (reference (public.entities) on delete cascade) - сущность, на события которой реагирует триггер.name (string) - название триггера. Не может быть пустым, содержать пробелы, строки / и __.time (enum ('BEFORE', 'AFTER')) - время выполнения триггера (до или после операции).priority (int) - приоритет выполнения триггера, при наличии нескольких триггеров для одной операции.on_insert (bool) - триггер реагирует на вставку записейon_update_fields (array(string)) - триггер реагирует на изменение записей. Массив, в котором могут быть перечислены названия полей или *. чтобы реагировать на изменения любого поля.on_delete (bool) - триггер реагирует на удаление записей.procedure (string) - код триггера на JavaScript.Триггер получает
event - содержит информацию о сущности, действии, которое произошло с записью в этой таблице, и ID записиevent:{
"entity": {
"schema": "pm",
"name": "actions"
},
"time": "BEFORE",
"source": {
"type": "insert",
"newId": null
}
}
args - содержит список полей и их новые/измененные значенияargs:{
"responsible_contact": 71,
"stage": 5,
"subject": null
}
Триггеры, выполняющиеся до операции, могут модифицировать аргументы операции, возвращая новое значение args.
Если модификации не нужны, возвращать необходимо true.
При возврате false операция считается отменённой; дальнейшие триггеры не запускаются, однако транзакция выполняется до конца.
Исполняется до вставки новой записи в таблицу.
id записи = null, т.к. записи еще не присвоен идентификаторargs - содержит все поля новой записи, которым присвоено значениеargs, если в коде триггера меняются значения полей вставляемой записи, true - если не меняются, false - если нужно исполнить код триггера, но не вставлять записьПример: при вставке в таблицу base.clients создать запись base.people, создать две записи base.communication_ways с телефоном и почтой, которые связаны с человеком:
// schema_id: 1, name: 'insert_and_process_clients'
// time: 'BEFORE', priority: 0
// on_insert: true, on_update_fields: false, on_delete: false
export default async function handle(event, args) {
/* args: { person: 'Иван', phone: '+7(901)234-56-78', email: '[email protected]'} */
if (!args.person)
return false;
const person = await FunDB.insertEntity(
{ schema: 'base', name: 'people' },
{ name: args.person }
);
if (args.phone) {
await FunDB.insertEntity(
{ schema: 'base', name: 'communication_ways' },
{
contact: person,
type: 'Телефон',
data: args.phone
}
);
}
if (args.email) {
await FunDB.insertEntity(
{ schema: 'base', name: 'communication_ways' },
{
contact: person,
type: 'Email',
data: args.email
}
);
}
return false;
}
Исполняется после вставки новой записи в таблицу.
id записи - event.source.newIdargs - содержит все поля новой записи, которым присвоено значениеПример: заполняет поля "когда создано", "кем создано" после создания записи
// schema_id: 1, name: 'fill_in_created_by_and_created_on_fields'
// time: 'AFTER', priority: 0
// on_insert: true, on_update_fields: false, on_delete: false
export default async function handle(event, args) {
const queryStr = `SELECT id FROM base.people WHERE user = $$user_id`;
const personName = await FunDB.getUserView({ type: "anonymous", query: queryStr });
const person = personName.result.rows[0].values[0].value;
const now = new Date();
await FunDB.updateEntity(
{ schema: 'pm', name: 'actions' },
event.args.newId,
{
created_datetime: now,
created_person: person
}
);
return true;
}
Исполняется до изменения записи.
id записи - event.source.idargs - содержит поля записи, значения которых были измененыargs, если в коде триггера меняются значения полей изменяемой записи, true - если не меняются, false - если нужно исполнить код триггера, но не изменять записьПример: заполняет поля "когда изменено", "кем изменено" во время изменения записи
// schema_id: 1, name: 'fill_in_modified_by_and_modified_on_fields'
// time: 'BEFORE', priority: 0
// on_insert: false, on_update_fields: true, on_delete: false
export default async function handle(event, args) {
const queryStr = `SELECT id FROM base.people WHERE user = $$user_id`;
const personName = await FunDB.getUserView({ type: "anonymous", query: queryStr });
const person = personName.result.rows[0].values[0].value;
const now = new Date();
args.modified_person = person;
args.modified_datetime = now;
return args;
}
Исполняется после изменения записи.
id записи - event.source.idargs - содержит поля записи, значения которых были измененыПример: пишет справочное сообщение в отдельную таблицу после изменения записи
// schema_id: 1, name: 'write_to_log'
// time: 'AFTER', priority: 0
// on_insert: false, on_update_fields: true, on_delete: false
export default async function handle(event, args) {
await FunDB.insertEntity(
{schema: 'admin', name: 'userfull_log'},
{ message: `Action with id = ${event.source.id} have been modified (${new Date}). Changes: ${JSON.stringify(args, null, 3)}`}
);
return true;
}
Исполняется до удаления записи.
id записи - event.source.idПример: удаляет все связанные записи перед тем, как удалить действие
// schema_id: 1, name: 'delete_connected_actions
// time: 'BEFORE', priority: 0
// on_insert: false, on_update_fields: false, on_delete: true
export default async function handle(event, args) {
const queryStr = `{ $id reference(pm.actions) }: SELECT id FROM pm.events WHERE connected_action = $id`;
const exprResult = await FunDB.getUserView({type: "anonymous", query: queryStr }, {id: event.source.id });
const resultIds = [];
for (const row of exprResult.result.rows) {
resultIds.push(row.values[0].value);
}
for (const action of resultIds) {
await FunDB.deleteEntity(
{schema: 'pm', name: 'events'},
action
);
}
return true;
}
Исполняется после удаления записи.
id записи - event.source.id
Пример: пишет справочное сообщение в отдельную таблицу после удаления записи
// schema_id: 1, name: 'write_to_log'
// time: 'AFTER', priority: 0
// on_insert: false, on_update_fields: false, on_delete: true
export default async function handle(event, args) {
await FunDB.insertEntity(
{schema: 'admin', name: 'userfull_log'},
{ message: `Action with id = ${event.source.id} have been deleted (${new Date()})`}
);
return true;
}