Очень простой вопрос.Скажем, у меня есть триггер для преобразования некоторых текстовых полей, поступающих из других таблиц, в индексы tsv, чтобы я мог реализовать полнотекстовый поиск быстрым способом.
Для этого у меня есть:
- Создана функция, которая выполняет мой желаемый SQL-запрос (работает)
- Создала триггер, который вызывает эту функцию, когда моя таблица ordering.order обновляется (работает)
- Попытка повторно использовать эту же функциюперед триггером, потому что я хочу, чтобы старые данные также обновлялись (не работает)
миграция не удалась: триггерные функции можно вызывать только как триггеры
Короче говоря, есть ли какой-либо тип возврата в функции postgres, который позволяет мне использовать его в триггере и вызывать в других местах как обычную функцию?Большое спасибо.
CREATE OR REPLACE FUNCTION index_text_fields() RETURNS trigger AS $$
BEGIN
UPDATE ordering.order as uo SET tsv = setweight(to_tsvector
(coalesce(s.name, '')), 'A')
|| setweight(to_tsvector(coalesce(split_part(o.order_ref,'-',2),'')), 'A')
FROM ordering.order AS o
LEFT JOIN ordering.sender AS s USING (order_id)
LEFT JOIN ordering.receiver AS r USING (order_id)
WHERE uo.order_id = o.order_id;
RETURN NULL;
END
$$ LANGUAGE plpgsql;
DO $$ BEGIN
PERFORM index_text_fields();
END $$;
CREATE TRIGGER orders_trigger AFTER
INSERT OR UPDATE
ON ordering.order FOR EACH ROW
WHEN (pg_trigger_depth() < 1)
EXECUTE PROCEDURE index_text_fields();