如何在触发器中使用光标在 Firebird 中删除?

How to use cursor in a trigger for delete in Firebird?

我尝试在 Firebird 中编写触发器,以便在我从 table 中删除记录时自动删除其他 table 中的记录。就像级联删除一样。由于某些原因,有些 table 没有主键。

触发器是这样的:

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 数据库时,我得到了这样的错误:

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