Apache Derby BEFORE触发器中CURRENT_TIMESTAMP运行时异常求助
Apache Derby触发器时间戳赋值问题解决方案
核心问题
你在触发器中误用了VALUES关键字来修改NEW行的列值,这是导致插入时无赋值、更新时类型转换错误的根本原因。Derby的BEFORE触发器需要使用SET关键字来更新新行(NEW)的列值,而非VALUES。
错误原因解析
- INSERT触发器无赋值:
VALUES NEW.MODIFYTIME = CURRENT_TIMESTAMP的写法不符合Derby语法,Derby无法识别该语句为修改NEW行的操作,因此MODIFYTIME列未被赋值,也无报错(该语句被当作无效的VALUES表达式处理)。 - UPDATE触发器类型转换错误:同样误用
VALUES后,Derby会将NEW.STATUS = 9这类赋值表达式解析为布尔值,再尝试将其转换为对应列的类型(NUMERIC/TIMESTAMP),从而触发尝试从TIMESTAMP类型的数据值获取long类型的数据值的错误。
修正后的触发器代码
插入触发器
CREATE TRIGGER TEST1_BINS_TRG1 NO CASCADE BEFORE INSERT ON TEST1 REFERENCING NEW AS NEW FOR EACH ROW MODE DB2SQL SET NEW.MODIFYTIME = CURRENT_TIMESTAMP;
更新触发器
CREATE TRIGGER TEST1_BUPD_TRG1 NO CASCADE BEFORE UPDATE OF STATUS ON TEST1 REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW MODE DB2SQL WHEN ( NEW.STATUS >= 0 AND OLD.STATUS <> 9 ) SET NEW.STATUS = 9, NEW.MODIFYTIME = CURRENT_TIMESTAMP, NEW.ENDTIME = CURRENT_TIMESTAMP;
验证说明
修正后执行测试语句:
- 插入语句
INSERT INTO DMKASL.TEST1 (UNIQUE_ID) VALUES ('1')会自动为MODIFYTIME赋值当前时间戳; - 更新语句
UPDATE DMKASL.TEST1 SET STATUS=1 WHERE UNIQUE_ID='1'会触发触发器,将STATUS设为9,同时更新MODIFYTIME和ENDTIME为当前时间戳,无类型转换错误。
内容的提问来源于stack exchange,提问作者Steven S.
相关产品推荐
相关产品推荐

