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_triggerBEFORE UPDATE
ON my_table
FOR EACH ROW
CALL "com.example.MyTrigger"
使用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 {}
}
用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-如何创建将行更改记录到另一个表的数据库触发器? 的全部内容, 来源链接: utcz.com/qa/404024.html



