Sql 如果可以删除数据行,如何签入Firebird?
我有一个Firebird数据库,表a包括ID主键。Sql 如果可以删除数据行,如何签入Firebird?,sql,foreign-keys,firebird,delete-row,Sql,Foreign Keys,Firebird,Delete Row,我有一个Firebird数据库,表a包括ID主键。 还有其他几个表,如:表B,包括A.ID的一个_ID外键(在delete NO ACTION上) 现在,我想签入一个存储过程,看看是否可以删除中的一行。 只有在没有错误的情况下才可以删除它 但我不想检查所有其他具有a外键的表 我需要的是: 但是存储过程中不允许保存点 或 如果其他表中有行引用a.ID,则检查a.ID的方法。 无需手动选择其他表格 有什么方法可以做到这一点吗?您可以尝试使用Firebird 2.5中引入的进行检查,然后简单地回滚。
还有其他几个表,如:表B,包括A.ID的一个_ID外键(在delete NO ACTION上) 现在,我想签入一个存储过程,看看是否可以删除中的一行。
只有在没有错误的情况下才可以删除它 但我不想检查所有其他具有a外键的表 我需要的是:
无需手动选择其他表格
扪心自问:为什么这么麻烦。如果无法删除,请尝试删除并向用户发送消息。正如Mark所说,您可以在中运行它。它是自动提交的,但您可以将exception作为最后一个命令抛出,在这种情况下,它将回滚
但对于您的情况,我会首先尝试删除并回滚(在任何情况下)。如果出现错误,则无法完成。否则,您可以继续执行所描述的其他操作。这比摆弄存储过程和
自治事务要便宜,为什么要这么做?这有一个直接的问题。返回结果后,其他事务可能会修改数据库,结果将不正确。仅由用户触发创建引用A.ID的行。在我的例子中,我可以假设,当我检查A是否可以删除时,一分钟后它也可以删除。但是是的,你的观点是正确的。当我真的删除它时,我必须再次检查外键。但是在我的例子中,在我检查了A之后,有新的引用是非常不可能的。我希望这个检查只给用户一个消息,有引用。我的问题是:1。用户按下按钮时,只有当可以删除某个事件时,才会启动一系列事件。否则它将显示一条消息。2.在事件结束时,用户正在使用的其他程序应该删除a。该程序可以记录删除错误。但是用户不会看到它。这个链应该只有在可以删除的情况下才能启动。那么我想没有其他选项可以发现所有外键引用并检查它们thx,因为它可以进行自治事务。谢谢你的回答。不幸的是,在用户的程序中,我无法回滚事务。那么您可能需要使用自治事务
来实现这一神奇功能。
safepoint X;
delete from A where ID = 1;
when any do
begin
return = 'false';
end
rollback to X;