Postgresql AF​​TER UPDATE 触发器 OLD 没有字段

标签 postgresql postgresql-10

我有一个触发器,就像许多其他触发器一样,在更新后触发并检查 OLD 集的字段。 由于某种原因,此触发器抛出此错误:

ERROR:  record "old" has no field "status"
CONTEXT:  SQL statement "SELECT NOT (OLD.status = NEW.status) AND NEW.status = 'Success'"

这是触发器的主体:

CREATE OR REPLACE FUNCTION tr_online_payment_after_update()
  RETURNS trigger AS
$BODY$
DECLARE
  v_rec RECORD;
BEGIN
  -- If state changed to Success

  IF NOT (OLD.status = NEW.status) AND NEW.status = 'Success' THEN
    -- Find any invoices attached and set them to paid
    FOR v_rec IN
      SELECT invoice_id_fk
        FROM online_payment_invoice
        WHERE online_payment_id_fk = NEW.online_payment_id
    LOOP
      UPDATE invoice
        SET paid_date = CURRENT_DATE,
            updator_id_fk = -2,
            updated = LOCALTIMESTAMP
        WHERE invoice_id = v_rec.invoice_id_fk;
    END LOOP;
  END IF;

  RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
CREATE TRIGGER tr_online_payment_after_update
  AFTER UPDATE
  ON online_payment
  FOR EACH ROW
  EXECUTE PROCEDURE tr_online_payment_after_update();

奇怪的是,它实际上似乎在运行触发器的发票更新部分。

我看不到我在这里遗漏了什么。这没有意义。

这是完整的输出:

   =>UPDATE online_payment SET status = 'Success' WHERE online_payment_id = 18;
    ERROR:  record "old" has no field "status"
    CONTEXT:  SQL statement "SELECT NOT (OLD.status = NEW.status) AND NEW.status = 'Success'"
    PL/pgSQL function tr_online_payment_after_update() line 7 at IF
    SQL statement "UPDATE load_unit
          SET load_hinderance = load_hinderance(load_unit_id)
          WHERE load_consign_match_id_fk = v_lcm_id"
    PL/pgSQL function tr_invoice_after_update() line 50 at SQL statement
    SQL statement "UPDATE invoice
            SET paid_date = CURRENT_DATE,
                updator_id_fk = -2,
                updated = LOCALTIMESTAMP
            WHERE invoice_id = v_rec.invoice_id_fk"
    PL/pgSQL function tr_online_payment_after_update() line 14 at SQL statement

最佳答案

将以下诊断行添加到函数中:

RAISE NOTICE 'Called % % on %',
   TG_WHEN, TG_OP, TG_TABLE_NAME;

然后运行调用触发器的 SQL 语句,看看输出是否符合您的预期。

关于Postgresql AF​​TER UPDATE 触发器 OLD 没有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712884/

相关文章:

arrays - 如何替换 PostgreSQL 中文本列中的字符数组?

SQL 在多个表中计算超过 1 个值

json - Postgres 10,从包含json对象数组的json对象中选择

postgresql - 测量 postgresql 中的复制滞后

postgresql - 不支持的前端协议(protocol) 1234.5680 : server supports 2. 0 到 3.0

PostgreSQL 区间减法

sql - 在 Postgresql 中索引外键

regex - Postgres 的正则表达式

postgresql - postgresql 中 all_tables 和 all_tab_columns 的等价物是什么

postgresql - 在 PostgreSQL 中结合 CTE 和 IN