1

PostgreSQL にいくつかのストアド関数とトリガーがあります。例:

CREATE OR REPLACE FUNCTION log_function() RETURNS TRIGGER AS $logger$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        INSERT INTO logger SELECT 'D', now(), user, OLD.*;
        RETURN OLD;
    END IF;
    RETURN NULL; 
END;
$logger$ LANGUAGE plpgsql;

そしてトリガー:

CREATE TRIGGER logging_trigger
AFTER INSERT OR UPDATE OR DELETE ON some_entity
    FOR EACH ROW EXECUTE PROCEDURE log_function();

そして、デプロイするたびにこのコードをインポートしたいと思います。(私は持っています<property name="hibernate.hbm2ddl.auto" value="create-drop"/>)

plpgsqlなので関数は無理だと思いますが、トリガーならいいと思います。import.sql にトリガーを追加しようとしましたが、org.postgresql.util.PSQLException: ERROR: syntax error at end of input

そして、このコードを Java レベルに移動したくありません。

何か案は?

4

1 に答える 1

1

@Startup @SingletonEJBを作成し、その@PostConstructメソッドが呼び出されたときに目的のプロシージャを呼び出すようにします。これはトリガー プロシージャであるため、SQL から直接呼び出すことはできませんが、次のことが可能です。

  • INSERTUPDATEまたはトリガーを起動させるDELETE行。some_entityまたはより賢明に

  • SQL から as として呼び出せるように、 return のような名前の別のプロシージャを定義し、次のようlog_startupにします。voidSELECT log_startup()

      INSERT INTO logger SELECT 'S', now(), user, NULL;
    

    または何でも。

log_startupのようなネイティブ クエリを使用して呼び出すことができます。SELECT log_startup()また、JDBC または HQL ストアド プロシージャ呼び出し構文{call log_startup()}(未テスト) も使用できるはずです。

トリガー プロシージャを直接呼び出すことはできないため、デプロイ時にその正確な関数を実行する方法ありません。

于 2012-09-26T12:01:24.547 に答える