【问题标题】:postgresql - trigger function with update not working with initial insertpostgresql - 更新的触发功能不适用于初始插入
【发布时间】:2017-06-21 01:49:48
【问题描述】:

每次在表 knowledgebase_messages 上插入或更新记录时,我都想运行一个触发器,这将使用该消息的 locale_id 连接的 pg_language_dictionary(例如:“French”)向量化 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';

触发器:

  runMessageVectorTrigger = 'CREATE TRIGGER run_message_vector AFTER INSERT OR UPDATE ON knowledgebase_messages ' +
    'FOR EACH ROW EXECUTE PROCEDURE run_message_vector()';

【问题讨论】:

    标签: postgresql triggers


    【解决方案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() &lt;&gt; 1...

    【讨论】:

    • 那么我的查询结构在SELECT 中应该是怎样的?我不确定如何重组上述内容
    猜你喜欢
    • 2013-01-24
    • 2021-07-31
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多