H2 - 如何创建将行更改记录到另一个表的数据库触发器? [英] H2 - How to create a database trigger that log a row change to another table?
本文介绍了H2 - 如何创建将行更改记录到另一个表的数据库触发器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何创建一个数据库触发器来记录 H2 中对另一个表的行更改?
How to create a database trigger that log a row change to another table in H2?
在 MySQL 中,这很容易做到:
In MySQL, this can be done easily:
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:
Implementing the trigger with jOOQ:
Since you added the jOOQ tag to the question, I suspect this alternative might be relevant, too. You can of course use jOOQ inside of an H2 trigger:
@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 - 如何创建将行更改记录到另一个表的数据库触发器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文