我尝试在Firebird中编写一个触发器,以便当我从表中删除记录时自动从其他表中删除记录。就像级联删除一样。由于某些原因,有些表没有主键。
触发器就像这样:
CREATE TRIGGER TRG1_DEL_STEP_INFO FOR STEP_INFO
ACTIVE AFTER DELETE
AS
DECLARE VARIABLE del_ID_IMAGE_INFO bigint;
DECLARE VARIABLE del_ID_FRAME_INFO bigint;
DECLARE del_cursor CURSOR FOR (SELECT ID_IMAGE_INFO, ID_FRAME_INFO FROM OLD);
BEGIN
OPEN del_cursor;
WHILE (ROW_COUNT > 0) DO
BEGIN
FETCH del_cursor INTO del_ID_IMAGE_INFO, del_ID_FRAME_INFO;
DELETE FROM FRAME_POLYGON WHERE ID_FRAME_INFO = :del_ID_FRAME_INFO;
DELETE FROM FRAME_INFO WHERE RECID = :del_ID_FRAME_INFO;
DELETE FROM IMAGE_INFO WHERE RECID = :del_ID_IMAGE_INFO;
DELETE FROM IMAGE_FILE_INFO WHERE ID_IMAGE_INFO = :del_ID_IMAGE_INFO;
END
CLOSE del_cursor;
END
但是当我尝试通过 isql 将其放入我的 Firebird DB 时,我收到了如下错误:
Statement failed, SQLSTATE = 42S02
Dynamic SQL Error
-SQL error code = -204
-Table unknown
-OLD
-At line 6, column 73
您能告诉我如何解决这个问题吗?
最佳答案
您不能为此使用游标,也不需要游标。 Firebird 中的触发器是按行触发的,而不是按语句触发的。
所以你应该这样做:
CREATE TRIGGER TRG1_DEL_STEP_INFO FOR STEP_INFO
ACTIVE AFTER DELETE
AS
BEGIN
DELETE FROM FRAME_POLYGON WHERE ID_FRAME_INFO = OLD.ID_FRAME_INFO;
DELETE FROM FRAME_INFO WHERE RECID = OLD.ID_FRAME_INFO;
DELETE FROM IMAGE_INFO WHERE RECID = OLD.ID_IMAGE_INFO;
DELETE FROM IMAGE_FILE_INFO WHERE ID_IMAGE_INFO = OLD.ID_IMAGE_INFO
END
关于sql - 如何在Firebird中使用触发器中的光标进行删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960286/