0

Ich versuche, alle Tabellen in einer Datenbank zu löschen, ohne sie in der richtigen Reihenfolge ausführen zu müssen. Von dem, was ich gelesen habe, verhindert der NOCHECK-Befehl, dass Fremdschlüssel überprüft werden. Aber auch nach dem Ausführen bekomme ich immer noch einen Fehler beim Versuch, die erste Tabelle zu löschen.T-SQL Alle Tabellen löschen

konnte nicht Objekt ‚dbo.TABLENAME‘ fallen, weil es

von eine FOREIGN KEY-Einschränkung verwiesen wird

ich diese Frage vor erfolgreich beantwortet gesehen haben, so verstehe ich nicht, was mit dem, was anders ist Ich mache. Dies wird auf SQL Server 2008 R2 ausgeführt.

BEGIN TRANSACTION 

--get current list of tables 
SELECT QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) as 'Dropped Table' 
FROM sys.tables t 
     JOIN sys.schemas s 
     ON t.[schema_id] = s.[schema_id] 
WHERE t.type = 'U' 


--disable constraint checking in all tables 
DECLARE @sql NVARCHAR(max) 
SET @sql = '' 
SELECT @sql += ' ALTER TABLE ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + ' NOCHECK CONSTRAINT ALL; ' 
FROM sys.tables t 
     JOIN sys.schemas s 
     ON t.[schema_id] = s.[schema_id] 
WHERE t.type = 'U' 
select @sql 
Exec sp_executesql @sql 

--disable all constraints (this also didn't work) 
--EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 


--drop all tables 
SET @sql = '' 
SELECT @sql += ' DROP TABLE ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; ' 
FROM sys.tables t 
     JOIN sys.schemas s 
     ON t.[schema_id] = s.[schema_id] 
WHERE t.type = 'U' 
select @sql 
Exec sp_executesql @sql 


--check current list, should be empty 
SELECT QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) as 'Tables' 
FROM sys.tables t 
     JOIN sys.schemas s 
     ON t.[schema_id] = s.[schema_id] 
WHERE t.type = 'U' 

ROLLBACK TRANSACTION 

Update 1

entfernte ich die Constraint-Code anstelle der Einschränkung fallen Code deaktivieren, aber es gibt und Irrtum.

--drop all constraints 
DECLARE @sql NVARCHAR(max) 
SET @sql = '' 
SELECT @sql += ' ALTER TABLE ' +QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + ' DROP CONSTRAINT ' + ctu.CONSTRAINT_NAME + ';' 
FROM sys.tables t 
    JOIN sys.schemas s 
     ON t.[schema_id] = s.[schema_id] 
    INNER JOIN EOS_DEV.INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as ctu 
     ON ctu.TABLE_SCHEMA = s.name AND ctu.TABLE_NAME = t.name 
WHERE t.type = 'U' 
Exec sp_executesql @sql 

Die Einschränkung '[CONSTRAINT_NAME]' durch die Tabelle verwiesen wird '[TABLE_NAME]', Fremdschlüssel '[FK_NAME]

Wie kann ich diese Abfrage ändern, damit ich nur Ziel-FK-Bedingungen?

+1

Ich würde versuchen, indem Sie alle Einschränkungen zuerst fallen lassen und dann versuchen, Tabellen fallen zu lassen. – Praveen

+0

@Praveen ist nicht die ganze Frage, wie man die Tabellen mit NOCHECK löscht, ohne die Beschränkungen fallen zu lassen? Ich denke der Benutzer ist sich bewusst, dass sie die Einschränkungen zuerst fallen lassen können ... –

+0

Haben Sie es mit nur einem Tisch probiert? Führen Sie 'exec sp_MSforeachtable @ command1 = 'alter table aus? nocheck constraint all'' und lasst einen Tisch fallen. Es sollte funktionieren. –

Antwort

0

Vielen Dank für Ihre Hilfe. Ich habe meine Abfrage aktualisiert und kann nun bestätigen, dass alle Tabellen wahllos gelöscht werden können. Ich fügte auch einen Abschnitt hinzu, um alle gespeicherten Procs für einen kleinen zusätzlichen Geschmack fallenzulassen.

0

Wenn Sie einen FK auf NOCHECK setzen, können Sie Zeilen INSERT, UPDATE oder DELETE einfügen, die die Einschränkung verletzen würden. Sie können die Zieltabelle nicht VERFALLEN oder KÜRZEN. Beispiel:

use tempdb 

create table a(id int primary key) 

create table b(id int primary key, aid int references a) 

alter table b nocheck constraint all 

insert into b(id,aid) values (1,1) --succeeds because of nocheck 

drop table a --fails 
--Msg 3726, Level 16, State 1, Line 11 
--Could not drop object 'a' because it is referenced by a FOREIGN KEY constraint. 
+0

Danke für die Klärung, was falsch läuft, aber das ist keine Lösung. – Swazimodo

+0

Sie haben bereits eine Lösung: Löschen Sie zuerst die Einschränkungen. –

0

Haben Sie das so schwer zu machen? Warum nicht einfach eine leere Datenbank wiederherstellen (oder eine Datenbank, die nur Ihr Schema enthält und welche "Standard" -Zeilen benötigt werden)?

+0

Ich habe keinen Zugriff und möchte keinen formellen Implementierungsplan für DEV schreiben. – Swazimodo

Verwandte Themen