如何解决在启动时导入PostgreSQL触发器hibernate
创建一个@Startup@Singleton
EJB,并在调用该@PostConstruct
方法的方法时调用所需的过程。您不能直接从SQL调用它,因为它是一个触发过程,但是您可以:
-
INSERT
,UPDATE
或DELETE
连续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()}
(未经测试)。
你根本无法直接调用触发程序,所以 没有办法 有 ,准确的功能 上部署运行。
解决方法
我在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级别。
有任何想法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。