LibreOffice Base的HSQLDB触发器更新

时间:2018-03-06 20:57:12

标签: hsqldb libreoffice-base

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

我按照链接中给出的例子进行了说明 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的语法?

FYI日期和日期在实际表格中没有下划线。

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

2 个答案:

答案 0 :(得分:1)

guide适用于版本2.4。

Base附带1.8内置功能。如果您正在使用它,请按照the documentation for 1.8。看起来1.8没有REFERENCING子句。

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

答案 1 :(得分:0)

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

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

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