Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql-具有更新的触发器函数不适用于初始插入_Postgresql_Triggers - Fatal编程技术网

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;