在启动时导入PostgreSQL触发器。过冬

时间:2012-09-26 06:46:07

标签: sql hibernate postgresql

我的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级别。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Create an @Startup @Singleton EJB,并在调用@PostConstruct方法时调用所需的过程。您无法直接从SQL调用它,因为它是一个触发器过程,但您可以:

    {li>

    INSERTUPDATEDELETE some_entity中的一行导致触发器触发;或者更明智地

  • 定义一个名为log_startup的单独过程,返回void,以便可以从SQL调用SELECT log_startup(),并具有:{/ p>

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

    或其他什么。

您可以使用log_startup等本机查询调用SELECT log_startup(),也可以使用JDBC或HQL存储过程调用语法{call log_startup()}(未经测试)。

您根本无法直接调用触发器过程,因此无法在部署时运行