Question

Existe-t-il un moyen simple de supprimer un groupe de tables interdépendantes dans SQL Server ?Idéalement, j'aimerais éviter d'avoir à me soucier de l'ordre dans lequel ils seront déposés, car je sais que tout le groupe aura disparu à la fin du processus.

Était-ce utile?

La solution

Au risque de paraître stupide, je ne pense pas que SQL Server prenne en charge la syntaxe delete/cascade.Je pense que vous pouvez configurer une règle de suppression pour effectuer des suppressions en cascade (http://msdn.microsoft.com/en-us/library/ms152507.aspx), mais pour autant que je sache, l'astuce avec SQL Server consiste simplement à exécuter votre requête de suppression une fois pour chaque table que vous supprimez, puis à vérifier que cela a fonctionné.

Autres conseils

Une approche différente pourrait être :débarrassez-vous d’abord des contraintes, puis supprimez les tables d’un seul coup.

Autrement dit, un DROP CONSTRAINT pour chaque contrainte, puis un DROP TABLE pour chaque table ;à ce stade, l'ordre d'exécution ne devrait pas être un problème.

Cela nécessite le sp___drop___contraintes script que vous pouvez trouver sur Journal de base de données:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

NOTE ceci - évidemment - si vous vouliez supprimer TOUTES les tables de votre base de données, alors soyez prudent

Je n'ai pas accès à SQL Server pour tester cela, mais que diriez-vous :

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

Je ne sais pas si l'approche de Derek fonctionne.Vous ne l'avez pas encore marqué comme meilleure réponse.

Sinon:avec SQL Server 2005, cela devrait être possible, je suppose.
Là, ils ont introduit des exceptions (que je n'ai pas encore utilisées).Alors supprimez la table, interceptez l'exception, si elle se produit et essayez la table suivante jusqu'à ce qu'elles disparaissent toutes.
Vous pouvez stocker la liste des tables dans une table temporaire et utiliser un curseur pour la parcourir, si vous le souhaitez.

J'ai fini par utiliser Apache ddutils pour effectuer le drop pour moi, ce qui a réglé le problème dans mon cas, même si une solution qui ne fonctionnait que sur le serveur SQL serait un peu plus simple.

@Derek Park, je ne savais pas que l'on pouvait y séparer les tables par des virgules, donc c'est pratique, mais cela ne semble pas fonctionner comme prévu.Ni IF EXISTS ni CASCADE ne sont reconnus par le serveur SQL, semble-t-il, et en cours d'exécution drop table X, Y, Z semble fonctionner uniquement s'ils doivent être supprimés dans l'ordre indiqué.

Voir également http://msdn.microsoft.com/en-us/library/ms173790.aspx, qui décrit la syntaxe de la table de suppression.

Ce qui vous empêche de supprimer les tables dans n'importe quel ordre, ce sont les dépendances de clé étrangère entre les tables.Alors débarrassez-vous des FK avant de commencer.

  1. À l'aide des vues système INFORMATION_SCHEMA, récupérez une liste de toutes les clés étrangères liées à l'une de ces tables
  2. Supprimez chacune de ces clés étrangères
  3. Vous devriez maintenant pouvoir supprimer toutes les tables, dans l’ordre de votre choix.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top