Pin*_*nch 10 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;
Run Code Online (Sandbox Code Playgroud)
Luk*_*der 20
声明此触发器:
CREATE TRIGGER my_trigger
BEFORE UPDATE
ON my_table
FOR EACH ROW
CALL "com.example.MyTrigger"
Run Code Online (Sandbox Code Playgroud)
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 {}
}
Run Code Online (Sandbox Code Playgroud)
由于您在问题中添加了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();
}
Run Code Online (Sandbox Code Playgroud)
卢卡斯·埃德尔的回答的简短版本:
CREATE TRIGGER my_trigger
BEFORE UPDATE
ON my_table
FOR EACH ROW
CALL "com.example.MyTrigger"
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11174 次 |
| 最近记录: |