【发布时间】:2021-01-28 07:35:49
【问题描述】:
我在 HSQLDB 删除触发器中遇到问题,不知何故它没有按预期工作。
我正在尝试实现数据库中每次更改的日志。
对于示例测试,我执行以下 SQL 语句:
CREATE TABLE msg (
id INTEGER IDENTITY PRIMARY KEY,
name VARCHAR(80)
);
CREATE TABLE log (
id INTEGER IDENTITY PRIMARY KEY,
row_id INTEGER,
op VARCHAR(30),
status VARCHAR(30)
);
insert into msg (id, name) values (0, 'First Test Message');
insert into log (id, row_id, op, status) values (0, 0, 'insert', 'pending');
update log set status = 'done' where id = 0;
现在,我创建一个删除触发器并从msg 表中删除行:
CREATE TRIGGER update_log_delete_msg
AFTER DELETE ON msg REFERENCING OLD ROW AS old_row FOR EACH ROW
BEGIN ATOMIC
INSERT INTO log(row_id, op, status)
SELECT old_row.id, 'delete', CASE status WHEN 'pending' THEN 'cancel' ELSE 'pending' END FROM log
WHERE row_id = old_row.id AND NOT status = 'cancel' ORDER BY id DESC LIMIT 1;
UPDATE log SET status = 'cancel'
WHERE row_id = old_row.id AND op = 'insert' AND status = 'pending';
END
delete from msg where id = 0;
到目前为止,它按预期工作:
insert into msg values (0, 'Test Message Again');
insert into log (row_id, op, status) values (0, 'insert', 'pending');
这个,时间删除会出问题:
delete from msg where id = 0;
日志中状态的预期行为应该是cancel而不是pending,为什么会导致问题?
【问题讨论】:
-
您可以通过检查触发器 hsqldb.org/doc/2.0/guide/… 内的 INSERT 和 UPDATE 语句返回的 ROW_COUNT 来调试它
-
@fredt 我认为,行被更新/插入得很好,只有在插入状态完成之前,删除它才会导致最后一次删除操作出错。
-
我的意思是 CREATE TRIGGER 中的 INSERT 和 UPDATE。
标签: sql triggers subquery hsqldb