web-dev-qa-db-fra.com

Comment désactiver les contraintes pour toutes les tables et l'activer?

J'ai 60 tables. Je veux déposer 10 tables où ces 10 tables sont des contraintes (PK, FK) dans 20 autres tables. Lors de la suppression de ces 10 tables, je dois tronquer ou supprimer des données des 20 autres tables. Enfin, je veux désactiver les 60 contraintes de table (FK, PK), puis activer les 60 contraintes de table après avoir terminé mon travail d'ajout/suppression de tables. Est-ce possible?

Quand je laisse tomber une table, il demande FK. Lorsque je tronque ces dépendances FK, cela montre toujours la même chose. Je ne veux pas jouer avec tous ces FK, PK.

Je veux connaître une méthode plus intelligente.

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

Vous pouvez également le faire:

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

Pour les activer ensuite

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

Modifier:
Si la désactivation des contraintes ne suffit pas, vous devrez supprimer les contraintes.

Si vous supprimez et recréez les tables, vous devrez recréer les contraintes de clé étrangère par la suite.

Si vous avez juste besoin de supprimer les contraintes, cela peut vous être utile:
contrainte de clé étrangère SQL DROP TABLE

Si vous avez besoin d'écrire un script pour supprimer et créer les contraintes, vous pourriez trouver mon article ici plus utile:
SQL Server: Comment obtenir une référence de clé étrangère à partir de information_schema?

49
Stefan Steiger

Pour désactiver, vous pouvez appliquer ceci:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Autoriser:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
25
SrividhyaShama
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;
7
Alexey

Essayez d'utiliser cette commande

ALTER TABLE table_Name NOCHECK CONSTRAINT all

pour désactiver toutes les contraintes pour vos tables, et faites-le pour toutes vos 10 tables, mais avant cela, vérifiez si vous n'avez pas mis Delete_Cascade sur vos tables car l'erreur qui est affichée peut-être aussi à cause des dépendances de sub_tables. si cela ne fonctionne pas, essayez de désactiver une contrainte spécifique par cette commande, cela peut être deux ou trois dépendances supplémentaires.

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName
5
Maryam Arshi