26

Ho 60 tavoli. Voglio eliminare 10 tabelle in cui queste 10 tabelle sono vincoli (PK, FK) ad altre 20 tabelle. Mentre si rilasciano queste 10 tabelle, ho bisogno di troncare o eliminare i dati dalle altre 20 tabelle. Infine, voglio disabilitare tutti i 60 vincoli di tabella (FK, PK) e quindi abilitare tutti i 60 vincoli di tabella dopo aver finito con il mio lavoro di aggiunta/eliminazione di tabelle. È possibile?Come disabilitare i vincoli per tutte le tabelle e attivarlo?

Quando faccio cadere un tavolo, chiede FK. Quando ho troncato queste dipendenze FK, mostra anche la stessa cosa. Non voglio scherzare con tutti quegli FK, PK.

Voglio sapere il metodo più intelligente.

risposta

46
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL" 
GO 

Si consiglia inoltre di fare questo:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL" 
GO 

Per consentire loro dopo

EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL" 
GO 

-- SQL enable all constraints - enable all constraints sql server 
-- sp_MSforeachtable is an undocumented system stored procedure 
EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL" 
GO 

Edit:
Se la disattivazione dei vincoli non è sufficiente, si dovrà abbandonare i vincoli.

Se si stanno rilasciando e ricreando le tabelle, sarà necessario ricreare i vincoli di chiave esterna in seguito.

Se avete solo bisogno di abbandonare i vincoli, si potrebbe trovare questo utile:
SQL DROP TABLE foreign key constraint

Se è necessario scrivere uno script per eliminare e creare i vincoli, si potrebbe trovare il mio post qui più utile:
SQL Server: Howto get foreign key reference from information_schema?

+0

Ho provato a disattivare e Drop Table, ma quel tavolo non è sempre caduto e dicendo referenziato dal vincolo FK .., – Out

+0

@Pink hai provato l'istruzione 'DROP' prima di riabilitare il' CONSTRAINT's? –

+0

Ho disabilitato il vincolo e la tabella DROP, quando disabilitato deve cadere senza errori ma mostra nuovamente "Impossibile rilasciare l'oggetto 'DropTable' perché è referenziato da un vincolo FOREIGN KEY." – Out

5

Provate a usare questo comando

ALTER TABLE table_Name NOCHECK CONSTRAINT all 

per disabilitare tutte vincolo per yo le tue tabelle, e fallo per tutte le tue 10 tabelle, ma prima controlla se non hai messo nessun Delete_Cascade sulle tue tabelle perché l'errore che viene mostrato è forse dovuto anche alle dipendenze dei sub_tables. se non funziona prova a disabilitare il vincolo specifico con questo comando, forse due o tre dipendenze extra.

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName 
7
declare @tname varchar(128), @tschema varchar(128); 

declare tables cursor for 
select TABLE_SCHEMA, TABLE_NAME 
from INFORMATION_SCHEMA.TABLES; 

open tables; 

fetch next from tables 
    into @tschema, @tname; 

while @@FETCH_STATUS = 0 
begin 
    execute ('alter table [' + @tschema + '].[' + @tname + '] nocheck constraint all'); 
    fetch next from tables 
     into @tschema, @tname; 
end; 

close tables; 

deallocate tables; 
+1

Basta cambiare "nocheck constraint all" in "check constraint all" per abilitare i vincoli per tutte le tabelle. – Alexey

+0

Quando ho eseguito queste query ha avuto successo, ma ancora quando ho provato a rilasciare la tabella non poteva cadere a causa del vincolo FK. Il mio obiettivo è di eliminare alcune tabelle senza errori FK, basta disabilitare FK e rilasciare la tabella – Out

+0

Aggiungo "where schemaTables.TABLE_TYPE = 'BASE TABLE'" alla query per ottenere solo la tabella e funziona per me. – jboo

21

Per disattivare è possibile applicare questo:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

Per attivare:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"