19

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

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

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

4

6 に答える 6

9

テーブルを削除する方法によって異なります。テーブルのリストを削除する必要がある場合、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
于 2013-01-17T12:39:29.357 に答える
4

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

編集:コメントの後:

自動的な方法はありません。sys.foreign_keysいくつかの ALTER TABLE ステートメントを反復して生成する必要があります。

于 2009-11-12T08:35:32.470 に答える
1

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

于 2012-11-28T18:38:25.733 に答える
0

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

于 2009-11-12T09:21:49.337 に答える
-1

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;
于 2009-11-12T08:36:29.710 に答える