Триггер PostgreSQL срабатывает при обновлении, а не при вставке - PullRequest
1 голос
/ 29 февраля 2012

У меня есть recommendations таблица:

                                           Table "public.recommendations"
        Column         |            Type             |                          Modifiers                           
-----------------------+-----------------------------+--------------------------------------------------------------
 id                    | integer                     | not null default nextval('recommendations_id_seq'::regclass)
 comment_on_provider   | text                        | 
 created_at            | timestamp without time zone | not null
 updated_at            | timestamp without time zone | not null
 search_vector         | tsvector                    | 
Indexes:
    "recommendations_pkey" PRIMARY KEY, btree (id)
    "recommendations_search_vector_idx" gin (search_vector)
Triggers:
    recommendations_vector_update BEFORE INSERT OR UPDATE ON recommendations FOR EACH ROW EXECUTE PROCEDURE search_trigger()

и этот триггер

  CREATE OR REPLACE FUNCTION search_trigger() RETURNS trigger AS $$
  DECLARE
    search TEXT;
    links_title TEXT;
    links_description TEXT;
  begin
    SELECT string_agg(title, ' ') INTO links_title 
    FROM links
    INNER JOIN recommendations
    ON new.link_id = links.id;

    SELECT string_agg(description, ' ') INTO links_description 
    FROM links
    INNER JOIN recommendations
    ON new.link_id = links.id;

    search := '';
    search := search || ' ' || coalesce(new.comment_on_provider);
    search := search || ' ' || links_title;
    search := search || ' ' || links_description;

    new.search_vector := to_tsvector(search); 
    return new;
  end
  $$ LANGUAGE plpgsql;

  CREATE TRIGGER recommendations_vector_update 
    BEFORE INSERT OR UPDATE ON recommendations
  FOR EACH ROW EXECUTE PROCEDURE
    search_trigger();

Когда я вставляю запись в таблицу recommendations, триггер не срабатывает, и search_vector устанавливается на ноль.

Но когда я обновляю любую запись, она срабатывает, и search_vector обновляется с ожидаемыми значениями.

Как заставить работать триггер на INSERT?

1 Ответ

2 голосов
/ 29 февраля 2012

Полагаю, в случае INSERT некоторые из переменных в выражениях, присвоенных переменной search, равны NULL.Скорее всего, это new.comment_on_provider, но лучше проверить.

...