2009-11-12 4 views
12

Ich habe eine Liste von einem halben Dutzend MSSQL 2008 Tabellen, die ich sofort aus meiner Datenbank entfernen möchte. Die Daten wurden vollständig in neue Tabellen migriert. Es gibt keine Referenz in den neuen Tabellen zu den alten Tabellen.So löschen Sie eine Liste von SQL Server-Tabellen und ignorieren Einschränkungen?

Das Problem ist, dass alte Tabellen mit vielen inneren FK-Constraints kommt, die von einem Tool (tatsächlich aspnet_regsql) automatisch generiert wurden. Daher ist es ein echter Schmerz, alle Beschränkungen manuell fallen zu lassen.

Wie kann ich die alten Tabellen ignorieren und alle inneren Einschränkungen ignorieren?

Antwort

3

Eine einfache DROP TABLE dbo.MyTable ignoriert alle Einschränkungen (und Trigger) außer Fremdschlüssel (außer Sie zuerst die untergeordnete/referenzierende Tabelle löschen), wo Sie diese zuerst fallen lassen müssen.

Edit: nach Kommentar:

Es gibt keine automatische Art und Weise. Sie müssen sys.foreign_keys durchlaufen und einige ALTER TABLE-Anweisungen generieren.

+0

Danke, aber mein Problem ist, dass genau dort viele generierte FK sind. –

-1

Ich vermute, dass Sie einen "alter" -Befehl auf den störenden Tabellen vor dem Ablegen tun müssen, um die Forringtasten zu entfernen.

ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders; 
DROP TABLE Orders; 

Natürlich, wenn Sie zuerst die untergeordneten Tabellen löschen, dann haben Sie dieses Problem nicht. (es sei denn, Sie haben eine Beschränkung der Tabelle A auf Tabelle B und Tabelle B auf A, dann müssen Sie eine der Tabellen ändern, z. B. A, um die Einschränkung zu entfernen)

z. Diese WONT-Arbeit, da Orders eine Constraint-Order von Order_Lines

z. dies funktioniert

DROP TABLE Order_lines; 
DROP TABLE Orders; 
+0

Sorry, aber es gibt Tonnen von automatisch generierten Constraints, Constraints können nicht manuell aufgelistet werden. –

+0

Wie werden die Tabellen erstellt? Ich glaube, dass Sie nur manuell ein Skript erstellen müssen, das die Tabellen ohne Einschränkungen löscht und dann die anderen Tabellen vor dem Löschen ändert. Ich weiß, es ist nicht die Antwort, die Sie suchen, aber es ist der beste Ansatz, den ich anbieten kann. Ich habe in meinem Projekt etwas simuliar, eine 40 Zeilen SQL-Anweisung, die Zeilen ändert und dann (in meinem Fall nicht Tabellen) fallen. –

0

ich die Lösung schließlich auf dem script provided by Jason Presley Basis gefunden. Dieses Skript entfernt automatisch alle Einschränkungen in der Datenbank. Es ist einfach, eine WHERE-Klausel hinzuzufügen, sodass sie nur für die betroffenen Tabellen gilt. Danach ist es einfach, alle Tabellen zu löschen.

+5

Link funktioniert nicht mehr und scheint nicht in Google-Cache oder Wayback –

1

fand ich eine vernünftige (ish) Art und Weise, es zu tun SQL schreiben die SQL, indem die Beschränkungen fallen zu lassen:

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"; 

Sie wollen den Tabellennamen ändern, um Ihre Bedürfnisse anzupassen oder möglicherweise wählen gegen andere Spalte/Werte.

Dies würde auch jede Nicht-Primärschlüssel-Beschränkung auswählen, die zu groß für einen Vorschlaghammer sein könnte. Vielleicht musst du es einfach auf = setzen?

Ich bin kein DBA. Es mag bessere Wege geben, dies zu tun, aber es hat gut genug für meine Zwecke funktioniert.

+2

"Concat" ist kein anerkannter integrierter Funktionsname. Es ist 2012+ –

6

Es hängt davon ab, wie Sie die Tabellen löschen möchten. Wenn die Liste der Tabellen eine Abdeckung von fast über 20% der Tabellen in Ihrer Datenbank enthalten muss.

Dann werde ich alle Einschränkungen in dieser DB unter meinem Skript deaktivieren und die Tabellen und aktivieren Sie die Einschränkungen unter dem gleichen Skript.

--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' 

Schließlich, um den Status Ihrer Einschränkungen zu überprüfen, diese Abfrage auslösen.

Wenn Sie die Einschränkungen auf Datenbankebene nicht deaktivieren möchten, erstellen Sie eine Liste der Tabellen, die Sie löschen möchten.

Schritt 1: Die Einschränkungen prüfen im Zusammenhang mit thos Tabellen

SELECT * 
FROM sys.foreign_keys 
WHERE referenced_object_id = object_id('dbo.Tablename') 

Schritt 2: Die Einschränkungen deaktivieren, die mit diesen Tabellen zugeordnet sind.

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint 

Schritt 3: Löschen Sie die Tabellen

DROP TABLE TABLENAME 
1

Führen Sie das folgende Skript alle Einschränkungen in allen Tabellen unter den aktuellen DB zu löschen und dann die Drop-Tabelle Anweisungen ausführen.

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 
Verwandte Themen