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"

使用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

回到顶部