1

このアプリケーションは、いくつかの主キーがエンドユーザーに公開されているOracle10gデータベースを使用しています。製品コードなど。残念ながら、これを使って何かをするのは遅れています。私たちが制御できないレポートやカスタムスクリプトがたくさんあるからです。主キーを再定義したり、データベース構造を台無しにすることはできません。

現在、一部の顧客は主キー値の一部を変更したいと考えています。彼らが最初にP23A1と呼びたかったものは、今ではCAT23MOD1と呼ばれるはずです(実際の例ではありませんが、私の意味はわかります)。

これを行う簡単な方法はありますか?他のテーブルやキーに合うようにパラメータ化できる、ある種のスクリプトが好きですが、他の方法が存在しない場合は、外部ツールを使用できます。

4

3 に答える 3

4

問題はおそらく、PKを参照する外部キーにあります。このTomKyteの記事で説明されているように、外部キーを「最初は延期可能」として定義する必要があります。http ://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html これにより...

  1. 制約を延期する
  2. 親の値を変更する
  3. 子の値を変更する
  4. 変更をコミットする

単純。

于 2009-12-05T09:39:33.687 に答える
0

おっと。少しグーグルすると、不可解なことに、OracleはON UPDATE CASCADEを実装せず、ONDELETECASCADEのみを実装しているように見えます。 回避策を見つけるには、Google ORACLE ONUPDATECASCADEを使用してください。Oracleでのカスケード更新テーブルセットの作成に関するリンクは次のとおりです。

元の答え:

私が正しく理解していれば、キー自体の実際の制約名ではなく、主キー列のデータの値を変更する必要があります。

これが当てはまる場合、影響を受ける主キー制約を参照するすべての外部キーをとして再定義することが最も簡単に実行できますON UPDATE CASCADE。これは、主キーの値を変更すると、エンジンが外部キーテーブルの関連するすべての値を自動的に更新することを意味します。

これにより多くの変更が行われる場合、本番システムでは法外な費用がかかる可能性があることに注意してください。

于 2009-12-04T20:04:57.000 に答える
0

関連するテーブルにDDLを変更せずにライブシステムでこれを行う必要がある場合、唯一の選択肢は(変更する必要のあるPKの値ごとに)次のことだと思います。

  1. PK値が置き換えられた行のコピーを親テーブルに挿入します
  2. 子テーブルごとに、FK値を新しいPK値に更新します
  3. 古いPK値を持つ親テーブルの行を削除します

親テーブルのリストと名前を変更するPK値がある場合、これを行うプロシージャを作成するのはそれほど難しくありません。USER_CONSTRAINTSの情報を使用して、特定の親テーブルのFK関連のテーブルを取得できます。 。

于 2009-12-04T20:27:12.037 に答える