当前位置: 首页 > 面试题库 >

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

丌官晨
2023-03-14
问题内容

如何创建数据库触发器以将行更改记录到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();
    }


 类似资料:
  • 问题内容: 我正在寻找一种记录SQL Server 2005数据库中一组特定表上发生的更改的好方法。我相信,做到这一点的最佳方法是通过对更新和删除执行触发器。无论如何,有没有要抓住正在运行的实际语句?一旦有了该语句,我就可以轻松地将其记录在其他地方(其他数据库表)。但是,我还没有找到一种简单的方法(如果可能)来获取正在运行的SQL语句。 问题答案: 触发器不好,我会远离触发器。 如果您尝试对某些问

  • 问题内容: 我有两个桌子和。我需要一些行插入从,它被插入之后。我知道这个问题,但我无法解决。请帮忙。 我为触发器编写了以下代码: 现在,当我插入行时,将添加到,但不添加到。它引发以下错误: _消息515,级别16,状态2,过程trigger_UpdateItemDetails,行11 无法将值NULL插入表’dbStockHandling.dbo.tbl_ItemDetails’的列’Purcha

  • 我正在使用基于Laravel的OctoberCMS。 我使用的服务器与Debian,PHP7,PHP-FPM和APCu。 我已安装NTP并将服务器时间设置为UTC。 在我已经设置了日期。时区=“UTC”。 我有一个画廊,你可以上传文件。 它将记录保存到数据库,并设置上传到列的时间。 使用在日期/时间创建的

  • 问题内容: 我在不同的主机上有2个mysql数据库,想在将数据插入到另一个数据库后将触发器插入到另一个数据库中。我是mysql的新手,在sql server中我可以创建链接服务器并完成它。但是如何在mysql中做呢?两个数据库都有相似的表 问题答案: 为了能够继续进行此操作,必须首先确保两个服务器具有相同的配置。为了完成您想做的事情,可以在两个服务器上结合使用FEDERATED存储引擎和触发器,以

  • 问题内容: 我有一个与MySQL数据库的Java程序连接,如何在同一连接上将当前数据库更改为另一个数据库? 我这样连接到MySQL: 经过一些操作后,我想在同一连接上连接到另一个mysql数据库。我怎样才能做到这一点? 我尝试使用: 但这不会更改要使用的数据库。 问题答案: 如MySQL文档中所述,您需要用于切换到另一个数据库。这也明确地说,你应该 不 执行切换。 发出此警告的原因是JDBC是数据

  • 我在另一个表(如ac)中有大约88k条记录。我想将表ac的一列更新到主表(如tbl)中。Eg-Table tbl示例记录,如 col1 col2 col3 col4 表ac中的样本记录如下 col1 col3` 如何从ac表更新tbl值。使记录看起来像 col1 col2 col3 col4