H2 - 如何创建将行更改记录到另一个表的数据库触发器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了H2 - 如何创建将行更改记录到另一个表的数据库触发器?相关的知识,希望对你有一定的参考价值。

如何在H2中创建将行更改记录到另一个表的数据库触发器?

mysql中,这可以很容易地完成:

CREATE TRIGGER `trigger` BEFORE UPDATE ON `table`
  FOR EACH ROW BEGIN
    INSERT INTO `log`
    (
      `field1`
      `field2`,
      ...
    )
    VALUES
    (
      NEW.`field1`,
      NEW.`field2`,
      ...
    ) ;
    END;
答案

声明此触发器:

CREATE TRIGGER my_trigger
BEFORE UPDATE
ON my_table
FOR EACH ROW
CALL "com.example.MyTrigger"

Implementing the trigger with Java/JDBC:

public class MyTrigger implements Trigger {

    @Override
    public void init(Connection conn, String schemaName, 
                     String triggerName, String tableName, boolean before, int type)
    throws SQLException {}

    @Override
    public void fire(Connection conn, Object[] oldRow, Object[] newRow)
    throws SQLException {
        try (PreparedStatement stmt = conn.prepareStatement(
            "INSERT INTO log (field1, field2, ...) " +
            "VALUES (?, ?, ...)")
        ) {
            stmt.setObject(1, newRow[0]);
            stmt.setObject(2, newRow[1]);
            ...

            stmt.executeUpdate();
        }
    }

    @Override
    public void close() throws SQLException {}

    @Override
    public void remove() throws SQLException {}
}

Implementing the trigger with jOOQ:

由于您在问题中添加了jOOQ标记,我怀疑这种替代方案也可能是相关的。你当然可以在H2触发器中使用jOOQ:

    @Override
    public void fire(Connection conn, Object[] oldRow, Object[] newRow)
    throws SQLException {
        DSL.using(conn)
           .insertInto(LOG, LOG.FIELD1, LOG.FIELD2, ...)
           .values(LOG.FIELD1.getDataType().convert(newRow[0]), 
                   LOG.FIELD2.getDataType().convert(newRow[1]), ...)
           .execute();
    }

以上是关于H2 - 如何创建将行更改记录到另一个表的数据库触发器?的主要内容,如果未能解决你的问题,请参考以下文章

将行移动到另一个工作表,其中单元格等于工作表名称

无法从 Hibernate 项目将行插入 H2 数据库

如何将行从一个 MySQL 数据库复制到另一个

将行从一个选项卡复制并删除到另一个选项卡

如何将表的记录从数据库检索到另一个数据库

将行从一个链接表插入到另一个链接表