2011-12-15 1 views
0

削除することができますので、一時的に制約を使用可能にします。を無効にし、私はこのコードはASPX環境におけるsqldatabaseのDeleteCommandのに入れることにしたいレコードを

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 
    GO 
    DELETE FROM Sales.Individual 
    WHERE CustomerID ='20562' 
    GO 
    exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" 
    GO 

私は、指定を削除して、最初の制約を無効にすることができますこの方法をその後、制約を再確立します。私は何とかそれを働かせることはできません、誰も私はこの問題について行くことができるかについての任意のアイデアを持っていますか?ありがとう!

+6

もし私があなただったら私はしません。 1つの解決策は、関連するすべてのテーブルからデータを削除するストアドプロシージャを作成することです。何らかの理由で関連情報を保持したい場合は、Sales.Individualテーブルに "IsDeleted"と呼ばれるビット列を作成してオフにすることができます。 – dana

+2

これは私が今年見た最悪のアイデアだと熟考しています。 –

答えて

1

あなたは本当にこれを考える必要があります。制約を無効にしてレコードを削除したとします。 元のレコードを削除することを妨げていた関連レコードをすべて削除しないかぎり、制約を戻すことはできません。

あなたのオプションは、関連するすべてのレコードを順番に削除するか、関係をカスケード削除するかのいずれかです。または、レコードを一切削除しないでください。danaのアドバイスを参照してください。私は個人的にはDeleted datetime nullIsDeleted bit nullよりも使用したいと思っています。

+0

興味深いことに、削除された日付をタイムスタンプすることはありませんでした。 30日以上経過した「削除された」レコードを本当に削除したバックグラウンドプロセスが必要な場合は便利です。 – dana

関連する問題