データベースから一度に削除したい半ダースのMSSQL2008テーブルのリストがあります。データは完全に新しいテーブルに移行されました。 newテーブルにはoldテーブルへの参照はありません。
問題は、古いテーブルには、ツール(実際にはaspnet_regsql)によって自動生成された内部FK制約が大量に含まれていることです。したがって、すべての制約を手動で削除するのは非常に困難です。
すべての内部制約を無視して古いテーブルを削除するにはどうすればよいですか?
テーブルをどのように削除するかによって異なります。テーブルのリストを削除する必要がある場合は、DBの下のテーブルのほぼ20%を超えています。
次に、スクリプトの下でそのDB内のすべての制約を無効にし、テーブルを削除して、同じスクリプトの下で制約を有効にします。
--To Disable a Constraint at DB level
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
--Write the code to DROP tables
DROP TABLE TABLENAME
DROP TABLE TABLENAME
DROP TABLE TABLENAME
--To Enable a Constraint at DB level
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
最後に、制約のステータスを確認するために、このクエリを起動します。
--Checks the Status of Constraints
SELECT (CASE
WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED'
ELSE 'DISABLED'
END) AS STATUS,
OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME,
OBJECT_NAME(FKEYID) AS TABLE_NAME,
COL_NAME(FKEYID, FKEY) AS COLUMN_NAME,
OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME,
COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME
FROM SYSFOREIGNKEYS
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO
データベースレベルで制約を無効にしたくない場合は、削除するテーブルのリストを作成します。
ステップ1:thosテーブルに関連付けられている制約を確認します
SELECT *
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')
ステップ2:これらのテーブルに関連付けられている制約を無効にします。
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
ステップ3:テーブルを削除します
DROP TABLE TABLENAME
単純な DROP TABLE dbo.MyTable
は、外部キー(子/参照テーブルを最初に削除しない限り)を除いて、すべての制約(およびトリガー)を無視します。外部キーを最初に削除する必要がある場合があります。
編集:コメント後:
自動的な方法はありません。 sys.foreign_keys
を繰り返し処理し、いくつかのALTERTABLEステートメントを生成する必要があります。
次のスクリプトを実行して、現在のDBの下にあるすべてのテーブルのすべての制約を削除してから、テーブルの削除ステートメントを実行します。
DECLARE @dropAllConstraints NVARCHAR(MAX) = N'';
SELECT @dropAllConstraints += N'
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
+ '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) +
' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.foreign_keys;
EXEC sp_executesql @dropAllConstraints
SQLにSQLを記述させて制約を削除することにより、それを行うための合理的な(っぽい)方法を見つけました。
select concat("alter table ", table_name, " drop ", constraint_type ," ", constraint_name, ";")
from information_schema.table_constraints
where table_name like 'somefoo_%'
and
constraint_type <> "PRIMARY KEY";
ニーズに合わせてテーブル名を変更するか、他の列/値に対して選択することをお勧めします。
また、これにより、大ハンマーには大きすぎる可能性のある非主キー制約が選択されます。たぶんあなたはそれを=に設定する必要がありますか?
私はDBAではありません。これを行うためのより良い方法があるかもしれませんが、それは私の目的には十分に機能しました。
Jason Presleyから提供されたスクリプト に基づいて最終的に解決策を見つけました。このスクリプトは、DB内のすべての制約を自動的に削除します。 WHERE句を追加して、関係するテーブルのセットにのみ適用されるようにするのは簡単です。その後、すべてのテーブルを削除するのは簡単です。