约束在程序中对PL / SQL进行双重检查

时间:2012-02-25 01:31:32

标签: database oracle plsql

我需要一些关于我正在工作的数据库的建议。

我有DB,现在我正在处理程序,函数和触发器(PL / SQL)。有三个实体,其中两个继承自第三个实体(根据概念数据模型),因此这意味着有两个表引用第三个实体。我必须同时在“父”表和“子”表中插入数据,所以我想要创建一个插入父表的过程,另一个插入子表中的过程,可以调用前一个。

我的问题是,如果我尝试插入父表,然后插入到子表中会发生什么,并且由于某种原因我在子表中插入不满足约束的数据?换句话说,尽管存在限制,我仍然必须验证函数中的输入数据吗?你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

取决于。

假设子表和父表之间存在外键约束,如果尝试使用父表中不存在的键在子表中插入行,INSERT将抛出表示违反约束的异常。如果您只是希望INSERT操作因约束违例异常而失败,则无需检查任何内容。

另一方面,您可能希望对验证进行编码,以便为调用者提供更好的例外。例如,一个表将具有引用各种其他表的多个外键是相对常见的。检查参数是否有效可能是有益的,这样您就可以更具体地告诉调用者哪个参数无效。

如果您要问如何确保插入父表和插入子表中的插入成功或两者都失败,那么您正在讨论如何建立正确的事务边界。你会做像

这样的事情
BEGIN
  insert_into_parent( <<list of parameters>> );
  insert_into_child(  <<list of parameters>> );
  commit;
EXCEPTION
  WHEN others 
  THEN
    rollback;
    RAISE;
END;

请注意,您的PL / SQL应用程序始终必须显式提交或回滚。那些事务控制语句应尽可能处于最高级别。例如,您不希望在insert_into_parent过程中拥有事务控制语句,因为如果您想要更广泛的事务范围,则永远不能使用该过程。