代码之家  ›  专栏  ›  技术社区  ›  Faraz

H2中的MySQL分隔符[重复]

  •  0
  • Faraz  · 技术社区  · 7 年前

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

    在MySQL中,这很容易做到:

    CREATE TRIGGER `trigger` BEFORE UPDATE ON `table`
      FOR EACH ROW BEGIN
        INSERT INTO `log`
        (
          `field1`
          `field2`,
          ...
        )
        VALUES
        (
          NEW.`field1`,
          NEW.`field2`,
          ...
        ) ;
        END;
    
    0 回复  |  直到 11 年前
        1
  •  27
  •   krock    8 年前

    声明此触发器:

    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();
        }
    
        2
  •  3
  •   Yonas    6 年前

    Lukas Eder回答的简短版本:

    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
        }
    }