我正在尝试创建一个 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 的语法?
仅供参考,实际表格中的日期和剩余日期没有下划线。
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