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