如果可以删除数据行,如何检查Firebird?

时间:2013-08-29 07:53:19

标签: sql foreign-keys firebird delete-row

我有一个带有表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的方法 不手动选择其他每个表。
    2. 有办法做到这一点吗?

2 个答案:

答案 0 :(得分:0)

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

问问自己:为什么这么麻烦。如果无法删除,只需尝试删除并向用户发送消息。

答案 1 :(得分:0)

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

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