postgresql-具有更新的触发器函数不适用于初始插入
每次在表postgresql-具有更新的触发器函数不适用于初始插入,postgresql,triggers,Postgresql,Triggers,每次在表knowledgebase\u messages上插入或更新记录时,我都希望运行一个触发器,该表将使用消息的区域设置id的联合pg\u语言词典(例如:“法语”)对message列进行矢量化 当前,正在处理行更新的触发器,但不是初始插入。也就是说,如果我插入一行,然后运行查询以获取记录,以任何方式更新该行,或者刷新postgres UI,我就可以在那里正确地看到矢量化的值 触发功能: runMessageVectorTriggerFn = 'CREATE OR REPLACE FUNC
knowledgebase\u messages
上插入或更新记录时,我都希望运行一个触发器,该表将使用消息的区域设置id的联合pg\u语言词典(例如:“法语”)对message
列进行矢量化
当前,正在处理行更新的触发器,但不是初始插入。也就是说,如果我插入一行,然后运行查询以获取记录,以任何方式更新该行,或者刷新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';
在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;
在更新前和插入前案例中
然后,如果pg_trigger_depth()1…那么我的查询结构应该如何在
选择中查看呢?我不知道如何重组上述结构
-- 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;