PostgreSQL触发器出错

时间:2015-07-25 02:59:25

标签: postgresql plpgsql

我在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() ;

我无法解决此错误。

  

发生了错误:错误:表&#34; c&#34;缺少FROM子句条目   第1行:SELECT C.cantidad&lt; P.canminexp OR P.exportable = FALSE ^   QUERY:SELECT C.cantidad&lt; P.canminexp OR P.exportable = FALSE   语境:PL / pgSQL函数fn_trg_viabilidad_fila()第9行IF

我将非常感谢任何帮助。抱歉我的英文不好

1 个答案:

答案 0 :(得分:1)

您无法访问查询之外的查询列(或您使用查询的块)。您需要将select的结果存储在某处。此外,您不应在触发的表格上运行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;

可以将查询“内联”到IF语句中,但这样可以更好地类似于当前代码的结构。还要注意,我用一个明确且更健壮的JOIN运算符替换了旧的,过时的隐式连接。

分配new.viable假定idpresupuesto是表solicitudpresupuesto中的PK(因为您在WHERE语句的UPDATE子句中使用了它