LibreOffice Base 的 HSQLDB 触发器更新

Posted

技术标签:

【中文标题】LibreOffice Base 的 HSQLDB 触发器更新【英文标题】:HSQLDB Trigger update for LibreOffice Base 【发布时间】:2018-03-06 20:57:11 【问题描述】:

我正在尝试创建一个 BEFORE UPDATE 触发器来停止 HSQLDB 更新并抛出异常,如果用户输入的日期左输入早于 date in。

我按照链接中给出的示例进行操作http://hsqldb.org/doc/guide/triggers-chapt.html 但错误显示:

15: Unexpected end of command: REFERENCING in statement [CREATE TRIGGER checkValidDate BEFORE UPDATE ON "tblVehicles"
   REFERENCING]

这是我的触发语句:

CREATE TRIGGER checkValidDate BEFORE UPDATE ON "tblVehicles"
   REFERENCING NEW AS newrow
FOR EACH ROW 
   BEGIN ATOMIC
     IF ((newrow.Hidden IS NOT NULL) AND (newrow.Date_Left < newrow.Date_In)) THEN
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'INVALID DATE ENTERED';
     END IF;
   END

如何修改此声明?那么 MESSAGE_TEXT 是 tblVehicles 数据库表中的字段还是只是 SQLSTATE 的语法? 仅供参考,实际表格中的日期和剩余日期没有下划线。 2018 年 3 月 18 日更新: 我已经按照建议安装了最新版本的 HSQLDB。这是修改后的触发器语句:

CREATE TRIGGER "checkValidDateTime" BEFORE UPDATE ON "tblVehicles"
   REFERENCING NEW AS newrow OLD AS oldrow
FOR EACH ROW 
   BEGIN ATOMIC
        IF (newrow."Date Left" IS NULL) THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'DATE LEFT NOT ENTERED';

        ELSEIF (newrow."Time Left" IS NULL)  THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'TIME LEFT NOT ENTERED';

        ELSEIF ((newrow."Hidden" IS NOT NULL) AND (newrow."Date Left" < newrow."Date In")) THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'INVALID DATE ENTERED';
        ELSEIF ((newrow."Hidden" IS NOT NULL) AND (newrow."Date Left" = newrow."Date In") AND (newrow."Time Left" < newrow."Time In")) THEN
            SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'INVALID TIME ENTERED';   
        ELSE
            UPDATE "tblVehicles" set oldrow."Hidden"='' WHERE oldrow."Id"=newrow."Id";
        END IF;
   END

我不确定如何为 ELSE 部分编写 UPDATE 命令。 (触发器在没有 ELSE 语句的情况下工作正常)。如何将值从 LibreOffice Base 前端传递到此触发器,例如传递唯一的 Id 值? 错误代码:

java.sql.SQLSyntaxErrorException: wrong or missing data impact clause in declaration: MODIFIES SQL / Error Code: -5608 / State: 42608

【问题讨论】:

【参考方案1】:

guide 适用于 2.4 版。

Base 内置 1.8。如果这是您正在使用的,请关注the documentation for 1.8。看起来 1.8 没有 REFERENCING 子句。

请注意,嵌入式设置为not recommended,测试除外。因此,您的问题的首选解决方案是安装 2.4 版,然后在创建新的 Base 文件时连接到现有数据库

【讨论】:

【参考方案2】:

遵循 Jim 的建议和How do I setup support for 'split' HSQL databases in Base? 下链接的常见问题解答中的说明。

然后检查您的列名,如果它们在数据库中大小写混合,请使用双引号,就像您对表名所做的那样。名称必须与实际表中的名称完全相同。您的 TRIGGER 语句应该可以使用正确的名称正常工作。

MESSAGE_TEXT 是抛出异常时返回的消息。

【讨论】:

以上是关于LibreOffice Base 的 HSQLDB 触发器更新的主要内容,如果未能解决你的问题,请参考以下文章

LibreOffice Base 数据库的 Node.js 连接库?

带有 LEFT JOIN 和 MAX 的 LibreOffice HSQLDB WHERE 子句?

从 Base (Libreoffice) 中的宏中获取按钮

使用 hsqldb 的情况?如何?

使用 OpenOffice Base 或 LibreOffice Base 将 .odb 文件转换为 .db

Hsqldb 重命名具有相同父项的重复项