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

Java H2-如何创建将行更改记录到另一个表的数据库触发器?,java,sql,triggers,h2,jooq,Java,Sql,Triggers,H2,Jooq,如何创建将行更改记录到H2中另一个表的数据库触发器 在MySQL中,这很容易做到: CREATE TRIGGER `trigger` BEFORE UPDATE ON `table` FOR EACH ROW BEGIN INSERT INTO `log` ( `field1` `field2`, ... ) VALUES ( NEW.`field1`, NEW.`field2`,

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

在MySQL中,这很容易做到:

CREATE TRIGGER `trigger` BEFORE UPDATE ON `table`
  FOR EACH ROW BEGIN
    INSERT INTO `log`
    (
      `field1`
      `field2`,
      ...
    )
    VALUES
    (
      NEW.`field1`,
      NEW.`field2`,
      ...
    ) ;
    END;
声明此触发器:

创建触发器我的触发器
更新前
在我的桌子上
每行
调用“com.example.MyTrigger”
使用Java/JDBC实现触发器:
公共类MyTrigger实现触发器{
@凌驾
public void init(连接连接、字符串模式名、,
字符串触发器名称、字符串表名称、布尔值前置、int类型)
抛出SQLException{}
@凌驾
公共无效火灾(连接连接,对象[]旧行,对象[]新行)
抛出SQLException{
try(PreparedStatement stmt=conn.prepareStatement(
插入日志(字段1,字段2,…)+
“值(?,,…)”)
) {
stmt.setObject(1,新行[0]);
stmt.setObject(2,newRow[1]);
...
stmt.executeUpdate();
}
}
@凌驾
public void close()引发SQLException{}
@凌驾
public void remove()引发SQLException{}
}
使用jOOQ实现触发器: 由于您在问题中添加了jOOQ标记,我怀疑这个替代方案也可能相关。当然,您可以在H2触发器中使用jOOQ:

@覆盖
公共无效火灾(连接连接,对象[]旧行,对象[]新行)
抛出SQLException{
DSL.使用(康涅狄格州)
.insertInto(LOG、LOG.FIELD1、LOG.FIELD2等)
.values(LOG.FIELD1.getDataType().convert(newRow[0]),
LOG.FIELD2.getDataType().convert(newRow[1]),…)
.execute();
}

卢卡斯·埃德尔回答的简短版本:


不错,但是没有办法参考表格。
CREATE TRIGGER my_trigger
BEFORE UPDATE
ON my_table
FOR EACH ROW
CALL "com.example.MyTrigger"
public class MyTrigger extends TriggerAdapter {

    @Override
    public void fire(Connection conn, ResultSet oldRow, ResultSet newRow) throws SQLException {
        // mannipulate the rows here by using the methods on the oldRow and newRow objects
    }
}