2011-08-08 18 views
0

SQLタスクでテーブルからレコードを削除する必要があるSSISパッケージを作成しています。このレコードは一部のテーブルにリンクされており、これらの関連テーブルは他のテーブルと関連している可能性があります。だから私はレコードを削除しようとすると、私は他のテーブルの最初のすべての参照を削除する必要があります。SQL Server 2005で手動カスケード削除

これを実現するには、カスケード削除の設定が最適なオプションであることがわかります。ただし、この変更が許可されていない従来のデータベースです。さらに、アプリケーションからの偶発的な削除を避けるべきトランザクションデータベースです。

SQL Serverがこのようなカスケード削除クエリをフレームする方法はありますか?または手動で削除のリストを書くことは唯一の選択肢ですか?

+0

明らかに、「ON delete Cascade」を使用しないことをお勧めします。 –

+0

「ハード」の削除ではなく、「削除された」というマークを付けることができますか? –

+0

@Mitch ...(私にとにかく)十分に明らかではありません。削除カスケードを避けるべき理由は...誤って削除した行の意図しない結果に過ぎないのでしょうか、それとも避けようとする他の理由がありますか?私はそれが非常に役に立つと思う。 –

答えて

1

SQL Serverがカスケード削除をフレームする方法は、使用できないと言ったON DELETE CASCADEを使用することです。

他のテーブルで影響を受けるレコードのリストを取得するためにメタデータにクエリを実行することはできますが、削除前に制約(したがってメタデータ参照)を削除する必要があるため複雑になります。

  • クエリメタデータ、影響を受けたテーブルのリストを取得するには:

    あなたは、単一のトランザクションでする必要があります。 これは再帰的である必要があるため、第1層の影響を受けたテーブル、次に第1層の影響を受けるテーブルの影響を受けるテーブルなどを取得できます。

  • 制約を削除します。 これはまた、上記の理由と同じ理由で再帰的にする必要があります。

誰かがよりエレガントな解決策を持っているかもしれませんが、私はこれはおそらくそれだと思う制約を再度有効にし、影響を受けるすべてのテーブル内のレコード(複数可)を削除します。

SQL Management Objectsを使用して.NETで簡単に行うこともできます(オプションの場合)。

問題の可能性が非常に高いので、私はこれを支持していないことを明確にすべきです。

あなたの最も安全な行動は、手動で削除を書き出すことです。

+0

再帰的な削除を行っている場合は、制約を削除して再作成する必要があります。制約を削除することは、制約の権利によって設定されたルールをオーバーライドすることです。あなたの提案では、私たちはリーフからルートに来て、制約を尊重しています。 – SaravananArumugam

+0

しかし、あなたが提供した情報は私を助けてくれます。回答いただきありがとうございます。 – SaravananArumugam

+0

@Sarav - 制約を残す場合は、その再帰的なクエリで逆の順序を使用する必要があります。制約を落とすと、順序は関係ありません。 – JNK