gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:45:13 24 4
gpt4 key购买 nike

如何创建一个数据库触发器,将行更改记录到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com