La désactivation et l'activation des contraintes de clé étrangère sont-elles prises en charge par SQL Server ? Ou ma seule option est-elle de dépasser
puis de re-créer
les contraintes ?
Si vous voulez désactiver toutes les contraintes dans la base de données, il suffit d'exécuter ce code :
-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
Pour les réactiver, exécutez : (l'impression est facultative bien sûr et ne fait que lister les tables)
-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Je trouve cela utile pour alimenter des données d'une base de données à une autre. C'est une meilleure approche que de supprimer les contraintes. Comme vous l'avez mentionné, c'est pratique lorsque l'on supprime toutes les données de la base et qu'on les réintroduit (par exemple dans un environnement de test).
Si vous supprimez toutes les données, vous pouvez trouver [cette solution][1] utile.
Il est aussi parfois utile de désactiver tous les triggers, vous pouvez voir la solution complète [ici][2].
[1] : https://stackoverflow.com/questions/155246/how-do-you-truncate-all-tables-in-a-database-using-tsql#156813 [2] : https://stackoverflow.com/questions/123558/sql-server-2005-t-sql-to-temporarily-disable-a-trigger#123966
http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
-- Disable all table constraints
ALTER TABLE MyTable NOCHECK CONSTRAINT ALL
-- Enable all table constraints
ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT ALL
-- Disable single constraint
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
-- Enable single constraint
ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint
La norme SQL-92 permet de déclarer une constance comme DEFERRABLE afin qu'elle puisse être différée (implicitement ou explicitement) dans le cadre d'une transaction. Malheureusement, cette fonctionnalité SQL-92 manque encore à SQL Server.
Pour moi, changer une contrainte en NOCHECK revient à modifier la structure de la base de données à la volée - la suppression des contraintes l'est certainement - et c'est quelque chose à éviter (par exemple, les utilisateurs ont besoin de privilèges accrus).