我希望每次在表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';
答案 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...