データベースから一度に削除したい 6 個の MSSQL 2008 テーブルのリストがあります。データは完全に新しいテーブルに移行されました。新しいテーブルには古いテーブルへの参照はありません。
問題は、ツール (実際には aspnet_regsql) によって自動生成された内部 FK 制約が古いテーブルに大量に含まれていることです。したがって、すべての制約を手動で削除するのは本当に面倒です。
すべての内部制約を無視して古いテーブルを削除するにはどうすればよいですか?
データベースから一度に削除したい 6 個の MSSQL 2008 テーブルのリストがあります。データは完全に新しいテーブルに移行されました。新しいテーブルには古いテーブルへの参照はありません。
問題は、ツール (実際には 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
データベース レベルで制約を無効にしたくない場合は、削除するテーブルのリストを作成します。
Step1 : これらのテーブルに関連付けられている制約を確認します
SELECT *
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')
ステップ 2 : これらのテーブルに関連付けられている制約を無効にします。
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
Step3 : テーブルを削除する
DROP TABLE TABLENAME
シンプルDROP TABLE dbo.MyTable
は、外部キーを除くすべての制約 (およびトリガー) を無視します (最初に子/参照テーブルを削除しない限り)。これらを最初に削除する必要がある場合があります。
編集:コメントの後:
自動的な方法はありません。sys.foreign_keys
いくつかの ALTER TABLE ステートメントを反復して生成する必要があります。
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 句を追加するのは簡単です。その後、すべてのテーブルを削除するのは簡単です。
forigen キーの制約を削除するには、ドロップする前に、問題のあるテーブルに対して「alter」コマンドを実行する必要があると思います。
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;
DROP TABLE Orders;
もちろん、最初に子テーブルを削除すれば、この問題は発生しません。(テーブル A をテーブル B に制約し、テーブル B をテーブル A に制約しない限り、テーブルの 1 つを変更する必要があります。たとえば、制約を削除するには A)。
たとえば、Orders には Order_Lines からの制約があるため、この WONT は機能しません。
DROP TABLE Orders;
DROP TABLE Order_lines;
たとえば、これは機能します
DROP TABLE Order_lines;
DROP TABLE Orders;