SQL Serverで相互に関連するテーブルのグループを削除する簡単な方法はありますか?理想的には、プロセスの終わりまでにグループ全体がなくなることを知っているので、それらがどの順序でドロップされるかについて心配する必要はありません。
7 に答える
ばかげているように聞こえるリスクがありますが、SQLServerが削除/カスケード構文をサポートしているとは思いません。カスケード削除を実行するように削除ルールを構成できると思いますが(http://msdn.microsoft.com/en-us/library/ms152507.aspx)、SQL Serverの秘訣は、実行することだけです。ドロップするテーブルごとに1回ドロップクエリを実行し、それが機能することを確認します。
さまざまなアプローチが考えられます。最初に制約を取り除き、次にテーブルを1回のショットで削除します。
つまり、すべての制約に対してDROP CONSTRAINTを実行し、次に各テーブルに対してDROPTABLEを実行します。この時点では、実行の順序は問題になりません。
これには、データベース ジャーナルにあるsp___drop___constraintsスクリプトが必要です。
sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO
これに注意してください-明らかに-データベース内のすべてのテーブルを削除するつもりだった場合は、注意してください
これをテストするためのSQLServerにアクセスできませんが、次の点について説明します。
DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
最終的にApacheのddlutilsを使用してドロップを実行し、私の場合はそれを整理しましたが、SQLサーバー内でのみ機能するソリューションの方がかなり簡単です。
@Derek Park、テーブルをコンマで区切ることができるとは知らなかったので便利ですが、期待どおりに機能していないようです。EXISTSもCASCADEもSQLServerによって認識されないようであり、実行drop table X, Y, Z
は、指定された順序で削除する必要がある場合にのみ機能するようです。
ドロップテーブルの構文について説明しているhttp://msdn.microsoft.com/en-us/library/ms173790.aspxも参照してください。
テーブルを任意の順序で削除できないのは、テーブル間の外部キーの依存関係です。したがって、開始する前にFKを削除してください。
- INFORMATION_SCHEMAシステムビューを使用して、これらのテーブルのいずれかに関連するすべての外部キーのリストを取得します。
- これらの外部キーをそれぞれドロップします
- これで、任意の順序を使用して、すべてのテーブルを削除できるようになります。
I'm not sure, if Derek's approach works. You haven't mark it as best answer yet.
If not: with SQL Server 2005 it should be possible, I guess.
There they introduced exceptions (which I've not used yet). So drop the table, catch the exception, if one occurs and try the next table till they are all gone.
You can store the list of tables in a temp-table and use a cursor to traverse it, if you want to.