space_object:before_replace()
-
object
space_object
-
space_object:
before_replace
([trigger-function[, old-trigger-function]]) Создание «триггера замены». Функция с триггером
trigger-function
будет выполняться в случае операцииreplace()
илиinsert()
, илиupdate()
, илиupsert()
, илиdelete()
над кортежем в спейсе<space-name>
.Параметры: - trigger-function (function) – функция, в которой будет триггер; необязательные параметры функции с триггером см. в описании on_replace.
- old-trigger-function (function) – existing trigger function which
will be replaced by
trigger-function
возвращает: nil или указатель функции
Если указаны параметры
(nil, old-trigger-function)
, старый триггер будет удален.If both parameters are omitted, then the response is a list of existing trigger functions.
If it is necessary to know whether the trigger activation happened due to replication or on a specific connection type, the function can refer to box.session.type().
Details about trigger characteristics are in the triggers section.
См. также space_object:on_replace().
Администраторы могут создавать триггеры замены с условием после замены
on_replace()
или до заменыbefore_replace()
. Если созданы оба типа, то все триггеры до заменыbefore_replace
выполняются до всех триггеров после заменыon_replace
. Функции для обоих типов триггеровon_replace
иbefore_replace
могут вносить изменения в базу данных, но только функции с триггерами до заменыbefore_replace
могут изменять кортеж, который будет заменен.Поскольку функция с триггером до замены
before_replace
может вносить дополнительные изменения в старый кортеж, для нее также потребуются дополнительные ресурсы для вызова старого кортежа до внесения изменений. Таким образом, лучше использовать триггер после заменыon_replace
, если нет необходимости изменять старый кортеж. Тем не менее, это применимо только к движку memtx – что касается движка vinyl, такой вызов произойдет для любого типа триггера. (В memtx’е данные кортежа хранятся вместе с ключом индекса, поэтому нет необходимости в дополнительном поиске; для vinyl’а дело обстоит иначе, поэтому нужен дополнительный поиск.)Если нет необходимости в дополнительных изменениях, следует использовать
on_replace
вместоbefore_replace
. Как правило,before_replace
используется только для определенных сценариев репликации – в части разрешения конфликтов.Что случится после возврата значения, которое может вернуть функция с триггером
before_replace
, зависит от этого значения. А именно:- если нет возвращаемого значения, выполнение продолжается со вставкой|заменой нового значения;
- если значение – nil, то кортеж будет удален;
- если значение совпадает со старым, то вызывается функция
on_replace
, и изменение данных не происходит. Возвращаемого значения в таком случае не будет. - если значение совпадает с новым, то считаем, что вызова функции
before_replace
не было; - если значение другое, выполнение продолжается со вставкой/заменой нового значения.
Тем не менее, если функция с триггером возвращает старый кортеж или вызывает run_triggers(false), это не повлияет на другие триггеры, активируемые в том же запросе вставки, обновления или замены.
Пример:
Далее представлены функции
before_replace
: не возвращает значение, возвращает nil, возвращает совпадающее со старым значение, возвращает совпадающее с новым значение, возвращает другое значение.function f1 (old, new) return end function f2 (old, new) return nil end function f3 (old, new) return old end function f4 (old, new) return new end function f5 (old, new) return box.tuple.new({new[1],'b'}) end
-