web-dev-qa-db-ja.com

制約を無視して、SQL Serverテーブルのリストを削除するにはどうすればよいですか?

データベースから一度に削除したい半ダースのMSSQL2008テーブルのリストがあります。データは完全に新しいテーブルに移行されました。 newテーブルにはoldテーブルへの参照はありません。

問題は、古いテーブルには、ツール(実際にはaspnet_regsql)によって自動生成された内部FK制約が大量に含まれていることです。したがって、すべての制約を手動で削除するのは非常に困難です。

すべての内部制約を無視して古いテーブルを削除するにはどうすればよいですか?

13

テーブルをどのように削除するかによって異なります。テーブルのリストを削除する必要がある場合は、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
6
Naveed Parvez

単純な DROP TABLE dbo.MyTable は、外部キー(子/参照テーブルを最初に削除しない限り)を除いて、すべての制約(およびトリガー)を無視します。外部キーを最初に削除する必要がある場合があります。

編集:コメント後:

自動的な方法はありません。 sys.foreign_keys を繰り返し処理し、いくつかのALTERTABLEステートメントを生成する必要があります。

3
gbn

次のスクリプトを実行して、現在の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 
2

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ではありません。これを行うためのより良い方法があるかもしれませんが、それは私の目的には十分に機能しました。

1
Jonathan Arkell

Jason Presleyから提供されたスクリプト に基づいて最終的に解決策を見つけました。このスクリプトは、DB内のすべての制約を自動的に削除します。 WHERE句を追加して、関係するテーブルのセットにのみ適用されるようにするのは簡単です。その後、すべてのテーブルを削除するのは簡単です。

0