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 调用它,因为它是一个触发器过程,但是您可以:

  • INSERT,UPDATEDELETE连续some_entity触发触发器;或更明智地

  • 定义一个名为类似log_startup返回的单独过程,void以便可以从 SQL 调用它SELECT 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 回答