postgresql - 更新无法使用初始插入的触发器函数

时间:2017-02-03 16:15:13

标签: postgresql triggers

我希望每次在表knowledgebase_messages上插入或更新记录时都会运行一个触发器,它将使用已加入的pg_language_dictionary(例如:"法语" )对于该消息的locale_id。

目前,触发器正在进行行更新,但不是初始插入。意思是,如果我插入一行,然后运行查询以获取记录,以任何方式更新行,或刷新postgres UI,我会在那里正确地看到矢量化值。

触发功能:

message

触发:

  runMessageVectorTriggerFn = 'CREATE OR REPLACE FUNCTION run_message_vector() ' +
    'RETURNS TRIGGER ' +
    'AS $BODY$ ' +
      'BEGIN ' +
        'IF pg_trigger_depth() <> 1 THEN ' +
           'RETURN NEW; ' +
        'END IF; ' +
        'UPDATE knowledgebase_messages kbm ' +
        'SET vector = to_tsvector(lang.pg_dictionary_name::regconfig, kbm.message) ' +
        'FROM locales as loca ' +
        'JOIN languages as lang ON loca.language_id = lang.id ' +
        'WHERE kbm.locale_id = loca.id;' +
        'RETURN NEW; ' +
      'END; ' +
    '$BODY$ LANGUAGE plpgsql';

1 个答案:

答案 0 :(得分:1)

在BEFORE INSERT触发器中执行此操作时,它不会更新 正在插入的行因为该行尚未存在:

UPDATE knowledgebase_messages kbm...

此外,您还不清楚UPDATE的意图是什么,因为 WHERE子句似乎忽略了NEW行,就好像它是隐含的一样 它是目标。

无论如何,要改变正在插入/更新的行,请执行此操作 类似的东西:

-- the SELECT must return 1 row, or in the worst case no row
-- otherwise an error will occur.
NEW.vector = (
  SELECT
    to_tsvector(lang.pg_dictionary_name::regconfig, NEW.message)
  FROM locales as loca JOIN languages as lang
    ON loca.language_id = lang.id 
  WHERE NEW.locale_id = loca.id
);

RETURN NEW;

在BEFORE UPDATE和BEFORE INSERT案例中。

然后您可以删除此IF pg_trigger_depth() <> 1...