我的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级别。
有什么想法吗?
答案 0 :(得分:1)
Create an @Startup @Singleton
EJB,并在调用@PostConstruct
方法时调用所需的过程。您无法直接从SQL调用它,因为它是一个触发器过程,但您可以:
INSERT
,UPDATE
或DELETE
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()}
(未经测试)。
您根本无法直接调用触发器过程,因此无法让在部署时运行 。