Таблица public.triggers
cодержит список триггеров, которые выполняются при заданных операциях.
Триггером является модуль ECMAScript, экспортирующий по умолчанию функцию-обработчик. Сигнатуры функций-триггеров и API, доступный внутри, можно изучить в виде сигнатур TypeScript здесь.
https://bitbucket.org/ozma/ozma-api/src/master/src/serverside_api.d.ts
Колонка | Тип | Описание |
---|---|---|
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 записиargs
- содержит список полей и их новые/измененные значенияТриггеры, выполняющиеся до операции, могут модифицировать аргументы операции, возвращая новое значение args
.
Если модификации не нужны, возвращать необходимо true
.
При возврате false
операция считается отменённой; дальнейшие триггеры не запускаются, однако транзакция выполняется до конца.
Для BEFORE INSERT
триггера event
и args
могут выглядеть так:
event:{
"entity": {
"schema": "pm",
"name": "actions"
},
"time": "BEFORE",
"source": {
"type": "insert",
"newId": null
}
}
args:{
"responsible_contact": 71,
"stage": 5,
"subject": null
}
Исполняется до вставки новой записи в таблицу.
id записи |
null , т.к. записи еще не присвоен идентификатор |
args |
содержит все поля новой записи, которым присвоено значение |
Возвращаемое значение | args , если в коде триггера меняются значения полей вставляемой записи, true - если не меняются, false - если нужно исполнить код триггера, но не вставлять запись |
// add different types of records instead of temporary record insert
export default async function handle(event, args) {
/* args: { person: 'Иван', phone: '+7(901)234-56-78', email: 'ivan@example.com'} */
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 |
содержит все поля новой записи, которым присвоено значение |
// fill created_datetime and created_person after record insert
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 - если нужно исполнить код триггера, но не изменять запись |
// fill modified_datetime and modified_person before record update
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 |
содержит поля записи, значения которых были изменены |
// write info about modified record after update action
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 |
// delete all connected records before delete action
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 |
// write info about deleted record after delete action
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;
}