3

我有一个使用 Hibernate 的应用程序,我必须包含一个触发器以将表中所有修改或删除的行复制到历史表中。包含 PostgreSQL 触发器后,应用程序无法正常工作并给出此错误:

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException:批量更新从更新[0]返回了意外的行数;实际行数:0;预期:1;嵌套异常是 org.hibernate.StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1

谷歌搜索了一段时间后,我发现出现此错误是因为 Hibernate 通过 sql 更新检查了受影响的行,并且返回的行不是预期的行,因为触发器也进行了更新。我已经看到这可以通过关闭触发器上的行数来解决。但是 PostgreSQL 似乎没有“set nocount on”的替代方案。

如何解决 PostgreSQL 触发器中的问题,如下所示?

谢谢

CREATE OR REPLACE FUNCTION my_trigger_fnc() RETURNS TRIGGER AS $my_trigger_fnc$
    DECLARE
        nowDate timestamp := now();
    BEGIN

        INSERT INTO historial_table (
                id,
                date_now,
                id_mytable,
                --some other fields
                ...
                ) 
        VALUES (              
                nextVal('historial_table_seq'),
                nowDate,
                OLD.id_mytable
                --some other fields
                ...
               );
        RETURN NEW;
    END;
$my_trigger_fnc$ LANGUAGE plpgsql;

CREATE TRIGGER my_trigger BEFORE UPDATE OR DELETE 
    ON my_table FOR EACH ROW 
    EXECUTE PROCEDURE my_trigger_fnc();

更新:表是这样的:

CREATE TABLE historial_table(
    id integer,
    date_now timestamp NOT NULL,
    id_mytable integer NOT NULL,
    nserie character varying(255),
    idstore integer,
    idmodel integer,
    automatic boolean,
    broken boolean,
    idAlb integer,
    idInc integer,
    id_item integer,
    date_assign timestamp,
    PRIMARY KEY (id)  
);

CREATE TABLE my_table(
    id_mytable integer NOT NULL,
    nserie character varying(255),
    idstore integer,
    idmodel integer,
    automatic boolean,
    broken boolean,
    idAlb integer,
    idInc integer,
    id_item integer,
    date_assign timestamp,
    PRIMARY KEY (id_mytable)  
);
4

1 回答 1

5

“返回新”;在 DELETE 上是可疑的。可能会混淆行数(NULL==零?) http://developer.postgresql.org/pgdocs/postgres/plpgsql-trigger.html(非常通用;无意侮辱你......) TG_OP 上的开关可能是什么你需要。

于 2011-11-15T11:20:02.373 回答