space_object:on_replace()
-
object
space_object
¶ -
space_object:
on_replace
([trigger-function[, old-trigger-function]])¶ Создание «триггера замены». Функция-триггер
trigger-function
будет выполняться в случае операцииreplace()
илиinsert()
, илиupdate()
, илиupsert()
, илиdelete()
над кортежем в спейсе<space-name>
.Параметры: - trigger-function (
function
) – функция, в которой будет триггер; подробнее о параметрах функции с триггером см. пример 2 ниже - old-trigger-function (
function
) – существующая функция-триггер, которую заменит новаяtrigger-function
возвращает: nil или указатель функции
Если указаны параметры
(nil, old-trigger-function)
, то старый триггер будет удален.Если не указан ни один параметр, ответом будет список существующих функций с триггером.
Следует знать, что если активация триггера произошла в случае репликации или определенного вида подключения, функция может ссылаться на box.session.type().
Подробная информация о характеристиках триггера находится в разделе Триггеры.
См. также space_object:before_replace().
Пример 1:
tarantool> x = 0 > function f () > x = x + 1 > end tarantool> box.space.my_space_name:on_replace(f)
Пример 2:
В функции с триггером может быть до 4 параметров:
- (кортеж) старое значение до начала запроса,
- (кортеж) новое значение после окончания выполнения запроса,
- (строка) имя спейса,
- (строка) тип запроса:
INSERT
(вставка),DELETE
(удаление),UPDATE
(обновление) илиREPLACE
(замена).
Например, следующий код вызывает вывод
nil
иINSERT
при обработке запроса на вставку и вывод[1, 'Hi']
иDELETE
при обработке запроса на удаление:box.schema.space.create('space_1') box.space.space_1:create_index('space_1_index',{}) function on_replace_function (old, new, s, op) print(old) print(op) end box.space.space_1:on_replace(on_replace_function) box.space.space_1:insert{1,'Hi'} box.space.space_1:delete{1}
Пример 3:
Следующая серия запросов создаст спейс, создаст индекс, создаст функцию, которая увеличит содержимое счетчика, создаст триггер, сделает две вставки, удалит спейс и отобразит значение счетчика – 2, поскольку функция выполняется однократно после каждой вставки.
tarantool> s = box.schema.space.create('space53') tarantool> s:create_index('primary', {parts = {{field = 1, type = 'unsigned'}}}) tarantool> function replace_trigger() > replace_counter = replace_counter + 1 > end tarantool> s:on_replace(replace_trigger) tarantool> replace_counter = 0 tarantool> t = s:insert{1, 'First replace'} tarantool> t = s:insert{2, 'Second replace'} tarantool> s:drop() tarantool> replace_counter
Примечание
Так как всё, что выполняется в триггерах, уже находится в транзакции, не следует использовать в триггерных функциях
on_replace
иbefore_replace
- транзакции,
- yield-operations (explicit or not),
- действия, которые не разрешено использовать в транзакциях (см. правило №2).
Пример:
tarantool> box.space.test:on_replace(fiber.yield) tarantool> box.space.test:replace{1, 2, 3} 2020-02-02 21:22:03.073 [73185] main/102/init.lua txn.c:532 E> ER_TRANSACTION_YIELD: Transaction has been aborted by a fiber yield --- - error: Transaction has been aborted by a fiber yield ...
- trigger-function (
-