5

継承したRailsサイトのメンテナンス作業を行っています。これはOracleデータベースによって駆動され、サイトの開発インストールと本番インストールの両方にアクセスできます(それぞれに独自のOracle DBがあります)。本番サイトにデータを挿入しようとするとOracleエラーが発生しますが、開発サイトには挿入されません。

ActiveRecord::StatementInvalid (OCIError: ORA-00001: unique constraint (DATABASE_NAME.PK_REGISTRATION_OWNERSHIP) violated: INSERT INTO registration_ownerships (updated_at, company_ownership_id, created_by, updated_by, registration_id, created_at) VALUES ('2006-05-04 16:30:47', 3, NULL, NULL, 2920, '2006-05-04 16:30:47')):
/usr/local/lib/ruby/gems/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:221:in `execute'
app/controllers/vendors_controller.rb:94:in `create'

私が知る限り(私はNavicatをOracleクライアントとして使用しています)、開発サイトのDBスキーマはライブサイトのDBスキーマと同じです。私はOracleの専門家ではありません。誰かが、なぜ私が一方のインストールでエラーが発生し、もう一方のインストールではエラーが発生しないのかを明らかにすることができますか?

ちなみに、devテーブルとproductionregistration_ownershipsテーブルの両方に、country_ownership_id(インデックスPK_REGISTRATION_OWNERSHIPによって駆動される)の重複エントリを含む多くのデータが入力されています。トラブルシューティングのためにさらに情報が必要な場合はお知らせください。まだ申し訳ありませんが、どの詳細が役立つかわかりませんでした。

更新:本番サーバーで制約を削除しようとしましたが、効果がありませんでした。結果がどうなるかわからないので、インデックスも削除したくありませんでした。また、生産の安定性を以前よりも低下させたくありません。

不思議なことに、エラーをスローしていたSQLを手動で実行しようとすると、Oracleは挿入ステートメントを受け入れました(ただし、「ORA-01861:リテラルが一致しませんフォーマット文字列"エラー)。ここで何が起こっているのでしょうか?

4

4 に答える 4

3

制約の名前に基づいて、、PK_REGISTRATION_OWNERSHIP主キー違反があります。registration_ownershipsこれらのデータベースがこのデータをロックステップで維持していない場合、何か/誰かがすでに本番データベースのテーブルにcompany_ownership_id= 2&registration_id=2920のレコードを挿入しています。(名前から詳細を推測しています)

この特定の値のセットが本番データベースに存在する必要がある場合は、

1)挿入しようとしているものがすでに存在するものではないことを確認します。もしそうなら、あなたは完了です。

2)サンプルデータをそのまま挿入する必要がある場合は、既存のデータを変更して再挿入する必要があります(およびすべての依存/参照レコード)。その後、値を挿入できます。

于 2010-04-12T19:45:23.337 に答える
1

テーブルをクエリしても一致する行が見つからない場合は、次のいずれかが原因である可能性があります。

  1. セッションは行を2回挿入しようとしています。
  2. 別のセッションが行を挿入しましたが、まだコミットしていません。

また、一意の制約の状態がdevとprodで同じであることを確認してください。おそらく、dev上のものは検証されていないとマークされています-インデックスがdevに存在し、一意のインデックスであることを確認してください(注:Oracleでは、一意でないインデックスによって一意の制約を検証することができます)。

于 2010-04-13T03:37:32.087 に答える
0

制約の基礎となる一意のインデックスをよく見てください。制約を削除しても何も変更されない理由は、インデックスが残り、一意のインデックスであるためです。以下は、両方の環境のインデックスについて何を示していますか?両方のインデックスは有効ですか?両方とも同じように定義されていますか?それらは両方とも実際にユニークですか?

SELECT ai.table_name, ai.index_name, ai.uniqueness, aic.column_name, ai.status
  FROM all_constraints ac JOIN all_indexes ai ON (ac.index_name = ai.index_name)
                          JOIN all_ind_columns aic ON (ai.index_name = aic.index_name)
 WHERE ac.owner = 'YOUR_USER'
   AND ac.constraint_name = 'PK_REGISTRATION_OWNERSHIP'
 ORDER BY ai.index_name, column_position;
于 2010-04-13T23:15:39.583 に答える
0

たまたま、ディレクトリの周りに「登録」モデルの予備のコピーがありました。名前が異なっていても( "registrations_2349871.rb"など)、Railsはすべてのモデル機能(保存、検証など)を2回実行していたため、キー制約違反になりました。私はこれまでこのような行動を見たことがありません。不正なファイルを削除すると、問題が解決しました。

于 2010-04-20T13:23:05.417 に答える