我希望每次在表knowledgebase_messages
上插入或更新记录时运行触发器,这将使用该消息的pg_language_dictionary的联接locale_id (例如:“message
”)向量化法语列。
目前,触发器在行update上工作,但在initial上不起作用。这意味着,如果我插入一行,然后运行查询来获取记录,以任何方式更新该行,或者刷新postgres UI,我就会正确地看到矢量化值。
触发器功能:
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';
触发器:
runMessageVectorTrigger = 'CREATE TRIGGER run_message_vector AFTER INSERT OR UPDATE ON knowledgebase_messages ' +
'FOR EACH ROW EXECUTE PROCEDURE run_message_vector()';
发布于 2017-02-03 16:24:37
在BEFORE INSERT触发器中执行此操作时,它不会更新正在插入的行,因为该行尚不存在:
UPDATE knowledgebase_messages kbm...
此外,还不清楚更新的目的是什么,因为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;
在UPDATE之前和INSERT之前的情况下。
然后,您可以删除此IF pg_trigger_depth() <> 1...
https://stackoverflow.com/questions/42028506
复制相似问题