HSQLDB CREATE TRIGGER 抛出异常:声明中错误或缺少数据影响子句:MODIFIES SQL

Posted

技术标签:

【中文标题】HSQLDB CREATE TRIGGER 抛出异常:声明中错误或缺少数据影响子句:MODIFIES SQL【英文标题】:HSQLDB CREATE TRIGGER throws exception: wrong or missing data impact clause in declaration: MODIFIES SQL 【发布时间】:2014-02-13 11:44:19 【问题描述】:

我想为一个表创建一个触发器,该触发器在插入新行时将一行插入另一个表。

CREATE TABLE S.A (
    ID NUMERIC(18) NOT NULL,
    OTHERID NUMERIC(18) NOT NULL,
);

CREATE TABLE S.B
(
    ...
    AID NUMERIC(18) NOT NULL,
    ...
);

CREATE TRIGGER mytrigger BEFORE INSERT ON S.B
     REFERENCING NEW AS newrow FOR EACH ROW
     INSERT INTO S.A (ID, OTHERID) VALUES (newrow.AID, newrow.AID);

但是我得到了触发器语句的异常:

Caused by: org.hsqldb.HsqlException: wrong or missing data impact clause in declaration: MODIFIES SQL
    at org.hsqldb.error.Error.error(Unknown Source)
    ...

文档没有说明必须在此语句中使用 MODIFIES SQL。谁能告诉我如何正确编写这个触发器?

【问题讨论】:

MODIFIES SQL DATA 仅用于更改其他表中数据的过程。由于触发器只能是AFTER触发器,错误提示这个BEFORE触发器修改了数据,不适合。 【参考方案1】:

我认为这是相关的,来自here

BEFORE 触发器不能修改数据库的其他表。所有 BEFORE 触发器都可以通过抛出异常来否决操作。

AFTER 触发器还可以执行额外的数据更改,例如将额外的行插入到不同的表中以进行数据审计。

即如果要插入另一个表,则需要将策略更改为 AFTERINSTEAD OF 触发器。

【讨论】:

以上是关于HSQLDB CREATE TRIGGER 抛出异常:声明中错误或缺少数据影响子句:MODIFIES SQL的主要内容,如果未能解决你的问题,请参考以下文章

RazorSQL 导致 HSQLDB 抛出 org.hsqldb.HsqlException:需要大于 '2.1.0.0' 的客户端驱动程序版本。 HSQLDB 服务器版本是 '2.3.4'

HSQLDB 在 Windows 上运行,但在 Linux 上抛出异常

为啥在读取数据库 hsqldb 中的 blob 时抛出 java.lang.IndexOutOfBoundsException

UcanaccessDriver 抛出 ExceptionInInitializerError 原因:java.lang.RuntimeException: org.hsqldb.jdbc.JDBCD

通过 SQL 工具运行的 HSQLDB 存储过程抛出扫描仪错误

HSQLDB SqlTool 抛出用户缺少权限或找不到对象