3

Hibernateを使用するアプリケーションがあり、テーブル内で変更または削除されたすべての行を履歴テーブルにコピーするトリガーを含める必要があります。PostgreSQLトリガーを含めた後、アプリケーションは正しく機能せず、次のエラーが発生します。

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException:バッチ更新が更新[0]から予期しない行数を返しました。実際の行数:0; 予想:1; ネストされた例外はorg.hibernate.StaleStateExceptionです:バッチ更新は更新[0]から予期しない行数を返しました。実際の行数:0; 予想:1

しばらくグーグルした後、Hibernateがsql updateによって影響を受ける行をチェックし、トリガーも更新を行ったために返された行が予期されたものではないため、このエラーが発生することを発見しました。これは、トリガーの行数をオフにすることで修正できることを確認しました。しかし、PostgreSQLには「setnocounton」の代替手段がないようです。

以下に示すような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

「NEWを返す;」DELETEで疑わしいです。行数を混乱させる可能性があります(NULL ==ゼロ?) http://developer.postgresql.org/pgdocs/postgres/plpgsql-trigger.html(非常に一般的です;あなたを侮辱することを意図していません...)TG_OPのスイッチはおそらく何ですか必要です。

于 2011-11-15T11:20:02.373 に答える