我有一个带有表A的Firebird数据库,包括ID主键 和其他几个表一样:表B,包括A.ID的A_ID外键(删除NO ACTION)。
现在我想检查存储过程是否可以删除A中的行 实际上并没有删除它,只要它可以没有错误。
但我不想检查每个具有A的外键的表。
我需要的是:
safepoint X;
delete from A where ID = 1;
when any do
begin
return = 'false';
end
rollback to X;
但存储过程中不允许使用保存点。
或
有办法做到这一点吗?
答案 0 :(得分:0)
您可以尝试使用Firebird 2.5中引入的autonomous transactions进行检查,然后再回滚。但是,这可能会引入死锁问题,因为该行将由与父事务不同的事务“修改”。
问问自己:为什么这么麻烦。如果无法删除,只需尝试删除并向用户发送消息。
答案 1 :(得分:0)
正如马克所说,你可以在IN AUTONOMOUS TRANSACTION
中运行它。它会自动提交,但你可以在那里抛出异常作为最后一个命令,在这种情况下它会被回滚。
但是对于你的情况,我会首先尝试删除和回滚(无论如何)。如果您收到错误,则无法完成。否则,您可以继续执行您描述的其他操作。这比摆弄存储过程和autonomous transaction
便宜。