Как повторно использовать функцию postgres для триггеров и общего использования - PullRequest
1 голос
/ 23 сентября 2019

Очень простой вопрос.Скажем, у меня есть триггер для преобразования некоторых текстовых полей, поступающих из других таблиц, в индексы 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();

1 Ответ

1 голос
/ 23 сентября 2019

Нет смысла использовать одну и ту же функцию для этих двух задач.

  • Для триггера вы бы использовали BEFORE триггер, а функция триггера неНе изменяйте таблицу, но присвойте ей NEW.tsv и верните NEW.

  • Для обновления существующих данных вам необходим оператор UPDATE.

...