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

标签 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`,
      ...
    ) ;
    END;

最佳答案

声明这个触发器:

CREATE TRIGGER my_trigger
BEFORE 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();
    }

关于java - H2 - 如何创建将行更改记录到另一个表的数据库触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29993308/

相关文章:

java - 串流安卓屏幕

java - Android 应用程序中的 PorterStemmer 错误

java - 通过Charset确定特殊字符

angularjs - 如何在 AngularJS 中通过 ng-show 触发 Bootstrap 弹出窗口

sql-server - 在触发器内执行动态sql "alter database"

java - 二维数组未正确遵循行和列尺寸 - Java

mysql - 为什么这个 mysql 查询返回不正确的行

php - 更新先前使用 MYSQL 和 PHP 选择的一组行

mysql - 在表中创建字段时出错

sql-server - 将触发器复制行插入另一个重复表 SQL Server 2008