Таблица 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.newId
args
- содержит все поля новой записи, которым присвоено значениеПример: заполняет поля "когда создано", "кем создано" после создания записи
// 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.id
args
- содержит поля записи, значения которых были изменены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.id
args
- содержит поля записи, значения которых были измененыПример: пишет справочное сообщение в отдельную таблицу после изменения записи
// 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;
}