Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果可以删除数据行,如何签入Firebird?_Sql_Foreign Keys_Firebird_Delete Row - Fatal编程技术网

Sql 如果可以删除数据行,如何签入Firebird?

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中引入的进行检查,然后简单地回滚。

我有一个Firebird数据库,表a包括ID主键。
还有其他几个表,如:表B,包括A.ID的一个_ID外键(在delete NO ACTION上)

现在,我想签入一个存储过程,看看是否可以删除中的一行。
只有在没有错误的情况下才可以删除它

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

我需要的是:

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

  • 如果其他表中有行引用a.ID,则检查a.ID的方法。
    无需手动选择其他表格
  • 有什么方法可以做到这一点吗?

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


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

    正如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;