【问题标题】:Rails: constraint violation on create but not on updateRails:在创建时违反约束,但在更新时没有
【发布时间】:2010-04-13 19:52:37
【问题描述】:

注意:这是this question 的“railsier”(更简洁)版本,有点长。

我无法在开发服务器上复制生产服务器上的 Rails 行为。除了凭据和缓存设置之外,代码库是相同的,并且两者都由具有相同架构(但数据不同)的 Oracle 10g 数据库提供支持。

我的 Rails 应用程序包含一个用户模型,它有一个注册;通过registration_ownerships 表依次注册has_and_belongs_to_many company_ownerships。注册后,用户填写与所有三个模型相关的数据,包括一系列复选框,指示哪些 registration_ownerships 可能适用于他们的帐户。

在开发服务器上,无论输入什么数据,注册过程都是无缝的。然而,在生产环境中,如果用户在提交注册之前检查了任何公司所有权字段,Oracle 会抱怨 company_ownerships 表的主键(这是基于 company_ownership_id 和registration_id 的双字段键)和用户的主键违反约束获取标准 Rails 500 错误屏幕。在每种情况下,我都验证了生产数据库中不存在这两个字段的冲突记录,所以我不知道为什么违反了约束。

更令人困惑的是,如果用户在没有列出任何所有权的情况下注册,然后返回并修改其帐户以反映所有权数据(通过相同的界面完成),应用程序会很高兴地满足他们的请求,而 Oracle 很好——表现良好(这在生产和开发中都是如此)。

在过去的几天里,我一直在试图找出可能导致此问题的原因,但我已经走到了尽头。任何建议将不胜感激!

2010 年 4 月 15 日更新: 我刚刚注意到一些可能有用的东西。我尝试在开发和生产中注册相同的帐户,并故意将“电话”字段留空,这是一个必填字段。在开发中,我收到了以下消息:

1 个错误禁止保存此注册

以下字段存在问题:

  • 电话不能为空

但是,在生产中,我得到了这个:

2 个错误禁止保存此注册

以下字段存在问题:

  • 电话不能为空
  • 电话不能为空

我的猜测是,这与生产中违反的约束直接相关——也许作为提交的一部分,该字段被插入一次,然后再次插入,但第二次违反了约束,然后回滚整个事务,删除初始插入的所有证据。关于在 Rails 端或 Oracle 端可能导致这种行为的任何想法?

【问题讨论】:

    标签: ruby-on-rails oracle model constraints


    【解决方案1】:

    首先,检查应用程序是否连接到您认为它正在连接的数据库。

    其次,检查数据类型,包括数值精度。例如,在下面的示例中,小数位被静默截断,因此第二次插入因重复键而失败

    create table test_pk (pk_1 number(3,0), pk_2 number(3,0), val varchar2(20));
    alter table test_pk add constraint test_pk_pk primary key (pk_1, pk_2);
    insert into test_pk values (10.1, 10.1, 'test 10.1');
    insert into test_pk values (10.2, 10.2, 'test 10.2');
    

    最坏的情况,禁用约束,尝试操作,然后重新启用约束。这会告诉你是否真的有一些重复的数据进入。连接池和非立即操作可能会发生一些奇怪的竞争条件(例如,在连接 a 中插入,在连接 b 中删除,在连接 b 之前再次插入连接 a已承诺。)

    【讨论】:

      【解决方案2】:

      碰巧的是,目录周围有一个“注册”模型的备用副本;即使它有不同的名称(“registrations_2349871.rb”或类似名称)Rails 运行所有模型功能(保存、验证等)两次,因此违反了键约束!我以前从未见过这样的行为。删除流氓文件解决了这个问题。

      【讨论】:

      • 您应该真正分析该文件是如何进入生产环境的,以及它是如何通过您的审查和部署过程的。错误的代码,是的。错误的代码文件?这有点多。
      • 完全同意。可以说这个特定项目的工作流程有点……啊……非正统(多个开发人员并不总是相互密切沟通),而且这不是我们第一次被咬。希望这将是最后一次......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多