Sql 更新后的触发器不工作

Sql 更新后的触发器不工作,sql,postgresql,triggers,sql-update,Sql,Postgresql,Triggers,Sql Update,我正在努力让我的“更新后”触发器正常工作 从我的简单查询中可以看出,生产工作的总和与订单元素的总和相匹配 # select ident,ud,dp,swrv,sh,jmsw,sw,prrv,mhsw,bmsw,mp,pr,st,completed from orders; ident | ud | dp | swrv | sh | jmsw | sw | prrv | mhsw | bmsw | mp | pr | st | completed -------+----+----+-----

我正在努力让我的“更新后”触发器正常工作

从我的简单查询中可以看出,生产工作的总和与订单元素的总和相匹配

# select ident,ud,dp,swrv,sh,jmsw,sw,prrv,mhsw,bmsw,mp,pr,st,completed from orders;
 ident | ud | dp | swrv | sh | jmsw | sw | prrv | mhsw | bmsw | mp | pr | st | completed 
-------+----+----+------+----+------+----+------+------+------+----+----+----+-----------
     2 |  1 |  1 |    0 |  0 |    0 |  0 |    0 |    0 |    0 |  0 |  0 |  0 | f
(1 row)

# select * from production_work;
 ident | order_id | producer_id |    day     | ud | dp | swrv | sh | jmsw | sw | prrv | mhsw | bmsw | mp | pr | st 
-------+----------+-------------+------------+----+----+------+----+------+----+------+------+------+----+----+----
     5 |        2 |           1 | 2013-08-09 |  1 |  0 |    0 |  0 |    0 |  0 |    0 |    0 |    0 |  0 |  0 |  0
     6 |        2 |           2 | 2013-08-09 |  0 |  1 |    0 |  0 |    0 |  0 |    0 |    0 |    0 |  0 |  0 |  0
(2 rows)
如果工作元素的总和与订单元素匹配,我尝试使用以下触发器将“completed”设置为true:

CREATE OR REPLACE FUNCTION update_order_completion_status() RETURNS trigger AS
$BODY$
BEGIN
    WITH w AS (
            SELECT SUM(ud) AS ud, SUM(dp) AS dp, SUM(swrv) AS swrv, SUM(sh) AS sh, SUM(jmsw) AS jmsw, SUM(sw) AS sw, SUM(prrv) AS prrv,
                    SUM(mhsw) AS mhsw, SUM(bmsw) AS bmsw, SUM(mp) AS mp, SUM(pr) AS pr, SUM(st) AS st
            FROM production_work
            WHERE order_id = OLD.order_id
    ), o AS (
            SELECT ud, dp, swrv, sh, jmsw, sw, prrv, mhsw, bmsw, mp, pr, st
            FROM orders
            WHERE ident = OLD.order_id
    )
    UPDATE orders
    SET completed = (w.ud = o.ud AND w.dp = o.dp AND w.swrv = o.swrv AND w.sh = o.sh AND w.jmsw = o.jmsw AND w.sw = o.sw AND
                    w.prrv = o.prrv AND w.mhsw = o.mhsw AND w.bmsw = o.bmsw AND w.mp = o.mp AND w.pr = o.pr AND w.st = o.st)
    WHERE ident = OLD.order_id;
END;
$BODY$ LANGUAGE plpgsql ;

CREATE TRIGGER update_order_completion_status_trigger
AFTER UPDATE OF ud, dp, swrv, sh, jmsw, sw, prrv, mhsw, bmsw, mp, pr, st
ON production_work
FOR EACH ROW EXECUTE PROCEDURE update_order_completion_status();

在更新生产工作表时,我没有收到任何错误消息,但正如您所看到的,已完成的列没有设置为true。

触发器函数中的SQL查询不必要地复杂而且不正确(在
更新
中的
子句中缺少
)。简化、正确的版本应为:

UPDATE orders o
SET    completed = (w.ud = o.ud AND w.dp = o.dp AND ...)
FROM (
    SELECT SUM(ud) AS ud, SUM(dp) AS dp, ...
    FROM   production_work
    WHERE  order_id = NEW.order_id
    ) w
WHERE  o.ident = NEW.order_id
AND    o.completed <> (w.ud = o.ud AND w.dp = o.dp AND ...);

假设
ident主键

缺失:表定义(
\d
在psql中),Postgres版本。非常感谢。很明显,我将不得不回头再看一次更新语法。我喜欢你关于扩展视图的想法,并以此作为我的解决方案。
CREATE VIEW order_plus AS
SELECT o.*, (SUM(w.ud) = o.ud AND SUM(w.dp) = o.dp AND ...) AS completed
FROM   orders o
JOIN   production_work w ON o.ident = w.ident
GROUP  BY o.ident;