在2个表上的WITHUPDATE ..UPDATE上的PostgreSQL TRIGGER

问题描述

我有这样的SQL查询

    WITH whatever1 AS (
        UPDATE
            table1
        SET
            field1 = <some number>
        WHERE
            id = <id>
        RETURNING id,field1
    )
    UPDATE
        table2
    SET
        field2 = (whatever1.field1 * 100000000::BIGINT)::BIGINT
    FROM
        whatever1
    WHERE
        field3 = whatever1.id
    RETURNING
        field3 AS whatever2

并且我有一个不允许我执行上述UPDATE的触发器:

CREATE FUNCTION public.function1()
RETURNS TRIGGER LANGUAGE plpgsql AS
$function$
BEGIN

    IF NEW.field1 != OLD.field1 THEN

        IF (NEW.field1 * 100000000::BIGINT)::BIGINT != (SELECT "field2" FROM table2 WHERE NEW.id = field3) THEN
            RAISE EXCEPTION 'Help me with this trigger so this exception is not raised.';
        END IF;

    END IF;

    RETURN NEW;
END;
$function$;

CREATE TRIGGER trigger1 BEFORE
    INSERT OR UPDATE ON public.table1
    FOR EACH ROW EXECUTE PROCEDURE function1();

请注意比较部分应该可以,因为 select 428872 = (0.00428872 * 100000000::BIGINT)::BIGINT返回true

我想问题是链接UPDATE不能一次更新两个表。 将BEFORE替换为AFTER会有所帮助,但我不理解所有的含义...

我实际上了解了CONSTRAINT TRIGGERDEFERRABLEINITIALLY DEFERREDREFERENCING,但我仍然一无所知,但大多数(如果不是全部的话)都使用AFTER TRIGGER ,而不是BEFORE,甚至很难测试所有可能的组合。

如何更新触发器,以使最上面的SQL查询通过?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)