PostgreSQL 触发器错误

Error in PostgreSQL trigger

我在 postgreSQL 中编写这个触发器

CREATE OR REPLACE FUNCTION fn_trg_viabilidad_fila()
RETURNS trigger AS
$BODY$
BEGIN
PERFORM S.* 
FROM MontoMinimo M, SolicitudPresupuesto S, Cantidad C, Producto P
WHERE P.idProducto=C.idProducto
and C.idPresupuesto=S.idPresupuesto
and M.idMonto=S.idMonto;
IF (C.cantidad < P.canMinExp OR P.exportable = FALSE)
THEN 
UPDATE SolicitudPresupuesto
SET viable = FALSE
WHERE idPresupuesto = OLD.idPresupuesto;
RETURN NEW;
END IF;
END
$BODY$
LANGUAGE plpgsql

CREATE TRIGGER trg_viabilidad_fila BEFORE INSERT
OR UPDATE ON SolicitudPresupuesto
FOR EACH ROW EXECUTE PROCEDURE
fn_trg_viabilidad_fila() ;

我无法解决这个错误..

An error has occurred: ERROR: missing FROM-clause entry for table "c" LINE 1: SELECT C.cantidad < P.canminexp OR P.exportable = FALSE ^ QUERY: SELECT C.cantidad < P.canminexp OR P.exportable = FALSE CONTEXT: PL/pgSQL function fn_trg_viabilidad_fila() line 9 at IF

如果有任何帮助,我将不胜感激。抱歉我的英语不好

您无法访问查询之外的查询列(或您使用查询的块)。您需要将 select 的结果存储在某处。此外,您不应该 运行 在触发的 table 上设置 UPDATE,您需要将值分配给 NEW 记录。

CREATE OR REPLACE FUNCTION fn_trg_viabilidad_fila()
  RETURNS trigger AS
$BODY$
DECLARE
  l_result boolean;
BEGIN

  SELECT (c.cantidad < p.canMinExp OR p.exportable = FALSE)
    INTO l_result
  FROM MontoMinimo M
    JOIN SolicitudPresupuesto s ON m.idMonto = s.idMonto
    JOIN Cantidad c ON c.idPresupuesto = s.idPresupuesto
    JOIN Producto p ON p.idProducto = c.idProducto;

  IF l_result THEN
    new.viable := false; 
  END IF;

  RETURN NEW;
END
$BODY$
LANGUAGE plpgsql;

可以将查询 "inline" 放入 IF 语句中,但这样它更类似于您当前代码的结构。另请注意,我用显式且更强大的 JOIN 运算符替换了旧的、过时的隐式连接。

分配 new.viable 假定 idpresupuesto 是 table solicitudpresupuesto 中的 PK(因为您在 WHERE 子句中使用了 [= =11=]语句)