Firebird存储过程中的“select..into”

时间:2011-07-25 03:00:29

标签: sql select triggers firebird

我使用的是Firebird 2.5 64bit版本。我有两个表Master(A)和Detail(B),我为B设置了级联更新和删除,所以如果我删除了master中的记录,那么详细信息中的任何相关记录都将被删除

我为表B设置了一个 After Delete 触发器,执行并将参数传递给存储过程

该存储过程具有此SQL:

  select STATUS from A
  where A.PK_id = :PK_id
  INTO :var_status;

问题是我总是得NULL变量var_status虽然我在SQL编辑器中检查了它并得到1这是正确的值,我也检查过(使用IBexpert调试器)传递的参数:PK_id,它也是正确的!

为什么我在此变量中存储了错误的值。

1 个答案:

答案 0 :(得分:4)

可能的问题是你正在使用AFTER DELETE并且记录不再存在。这是行动的顺序:

  • 记录从A
  • 中删除
  • 从A级删除到B
  • 删除
  • B中的AFTER DELETE触发器被调用。
  • 在触发器内,您尝试访问的数据不是来自B,而是来自A.它不再存在了。

请记住,触发器在事务中运行。因此,可能在运行相同的SELECT时,您可以访问该值,因为您处于另一个事务中并且尚未提交原始事务。

实际上这并非如此微不足道。以下是一些解决您问题的方法:

  • 检查您的业务规则是否可以更改,以便您可以运行不在B中的触发器中的那部分代码,但在A中,状态将可用。毕竟,由于A而不是B,你需要做的事情。
  • 最终,您可以删除cascade delete并从A中的AFTER DELETE触发器中处理B的删除。这样,所有内容都将位于相同的代码块中。