1

我有一个带有表 A 的 Firebird 数据库,包括 ID 主键。
以及其他几个表,如:表 B,包括 A_ID 到 A.ID 的外键(在删除 NO ACTION 时)。

现在我想检查一个存储过程是否可以删除 A 中的一行。
仅在可能没有错误的情况下才实际删除它。

但我不想检查所有其他具有 A 外键的表。

我需要的是这样的:

  1.  

    safepoint X;  
    delete from A where ID = 1;  
    when any do  
    begin  
      return = 'false';  
    end  
    rollback to X;  
    

    但是存储过程中不允许保存点。

或者

  1. 一种检查 A.ID 的方法,如果其他表中有行引用它。
    无需手动选择所有其他表。

有没有办法做到这一点?

4

2 回答 2

0

您可以尝试使用 Firebird 2.5 中引入的自主事务来进行检查,然后简单地回滚。但是,这可能会引入死锁问题,因为该行将被与父事务不同的事务“修改”。

问问自己:为什么要打扰。如果无法删除,请尝试删除并向用户发送消息。

于 2013-08-29T09:10:23.400 回答
0

正如马克所说,你可以在IN AUTONOMOUS TRANSACTION. 它是自动提交的,但是您可以将异常作为最后一个命令在那里抛出,在这种情况下它会回滚。

但是对于您的情况,我会首先尝试删除和回滚(无论如何)。如果出现错误,则无法完成。否则,您可以继续执行您描述的其他操作。这将比摆弄存储过程和autonomous transaction.

于 2013-08-29T09:29:48.020 回答