5

2 つの主キーを 1 つにマージし、影響を受けるすべての関係をカスケード更新する方法はありますか? シナリオは次のとおりです。

顧客 (idCustomer int PK、Company varchar(50) など)

CustomerContacts (idCustomerContact int PK、idCustomer int FK、Name varchar(50) など)

CustomerNotes (idCustomerNote int PK、idCustomer int FK、メモ テキストなど)

場合によっては、顧客を 1 つに統合する必要があります。たとえば、ID が 1 の顧客と ID が 2 の別の顧客がいるとします。両方をマージして、2 だったものをすべて 1 にします。影響を受けるすべてのテーブルを 1 つずつ更新するスクリプトを作成できることはわかっています。 1 つですが、カスケード ルールを使用することで、より将来性のあるものにしたいので、新しい関係が追加されるたびにスクリプトを更新する必要はありません。

何か案は?

4

4 に答える 4

3

これを自動的に行う方法はありませんが、いくつかのオプションがあります。手順を手動で記述するか、定期的にマージをコード生成するか、実行時に動的に生成することができます。これを行うには、INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSandINFORMATION_SCHEMA.KEY_COLUMN_USAGEおよびINFORMATION_SCHEMA.TABLE_CONSTRAINTSandを使用INFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLESしてプロシージャを動的に構築します。

操作全体をトランザクションで単純にラップすることもできます (とにかく良い考えです)。最後のステップは、マージされる顧客を削除することです。そのため、追加したことのないテーブルに RI があり、マージを実行しようとすると、依存関係があるためマージされる顧客を削除できないため、マージは失敗します。マージ プロシージャにまだ追加されていないテーブル内のレコード。

于 2008-10-22T00:46:37.260 に答える
0

代わりにトリガーの使用を検討してください。顧客 (idCustomer 列) の更新時に、関連するテーブルに対して必要な変更 (削除、更新など) を行います。

于 2008-10-21T22:58:25.730 に答える
0

これに対する最近の解決策はありますか?

私は同じ問題を抱えており、現時点ではプロシージャを動的に構築するのは複雑すぎるようです。これが理論的にはどのように機能するかですが、そうではないと思いますか?

1 つのトランザクションで: 1) 顧客のプライマリ キー制約を一時的に無効にする 2) Cingular のプライマリ ID を「1」に更新します。これには、子を処理する関係更新カスケード ルールがあります 3) セカンダリ キー フィールドを使用して、(のみ) Cingular 4 を削除します) 顧客の主キー制約を有効にする

将来の T-SQL でこのようなものを楽しみにしています。

DELETE WITH UPDATE idCustomer = 1 FROM Customers WHERE idCustomer = 2;

;-)

于 2010-05-13T06:07:20.850 に答える
0

これらのテーブルごとに、同じ主キーを持つ 2 つのレコードが作成されるようです。これはあなたの意図ですか?

        お客様
    id顧客会社
         1 AT&T
         2 シンギュラー

マージ後は

        お客様
    id顧客会社
         1 AT&T
         1 シンギュラー

いずれにせよ、最も将来性のあるソリューションは、プロシージャを作成することです。両方の顧客に手順を渡すことができ、必要に応じてすべてのテーブルを更新するすべての作業を実行します。

于 2008-10-22T02:52:24.683 に答える