273 votes

"Empêcher l'enregistrement des modifications qui nécessitent la recréation de la table" effets négatifs

Préambule

J'ai modifié une colonne dans SQL Server 2008 aujourd'hui, en changeant le type de données de quelque chose comme currency(18,0) à (19,2).

J'ai reçu l'erreur "Les changements que vous avez effectués nécessitent que les tables suivantes soient abandonnées et recréées" de SQL Server.

Avant de vous précipiter pour répondre, veuillez lire ce qui suit :

Je sais déjà qu'il existe une option dans Outils Options Designer Concepteurs de tables et de bases de données Décochez la case "Empêcher l'enregistrement des modifications qui nécessitent la recréation d'une table". Prevent saving changes that require table re-creation in five clicks ...donc ne pas répondez avec ça !

Question réelle

Ma question porte en fait sur autre chose, comme suit :

Y a-t-il des effets négatifs / des inconvénients possibles à faire cela ?

La table est-elle réellement supprimée et recréée automatiquement lorsque cette case n'est pas cochée ?

Si oui, la copie de la table est-elle une réplique exacte à 100% de la table source ?

1 votes

Jetez également un coup d'œil à stackoverflow.com/questions/9870968/

2 votes

Et si vous êtes avec MS SQL Server 2014 -> Extras>Options>Designer à partir du menu supérieur.

253voto

Antoine Meltzheim Points 733

Outils --> Options --> Nœud concepteur --> Décocher " Empêcher l'enregistrement des modifications qui nécessitent la recréation d'une table ".

4 votes

Lisez la question - c'est EXACTEMENT ce dont le PO a dit de ne pas s'occuper, parce qu'il le sait déjà.

96voto

Aaron Bertrand Points 116343

La table n'est supprimée et recréée que dans les cas où c'est la seule façon dont le Management Studio de SQL Server a été programmé pour savoir comment procéder.

Il y a certainement des cas où il le fera quand ce n'est pas nécessaire, mais il y aura aussi des cas où les modifications que vous ferez dans Management Studio seront no laisser tomber et recréer parce qu'il n'a pas à le faire.

Le problème est qu'il sera fastidieux d'énumérer tous les cas et de déterminer de quel côté de la ligne ils se situent.

C'est pourquoi j'aime utiliser ALTER TABLE dans une fenêtre de requête, au lieu de concepteurs visuels qui cachent ce qu'ils font (et qui, franchement, présentent des bogues) - je sais exactement ce qui va se passer, et je peux me préparer à des cas où la seule possibilité est d'abandonner et de recréer la table (ce qui est un nombre inférieur à la fréquence à laquelle SSMS vous le fera).

Y a-t-il des effets négatifs / des inconvénients possibles à faire cela ?

Bien sûr. Si vous pouvez script le changement vous-même sans reconstruire la table entière, c'est mieux - considérez le cas où la table est 10TB, et la base de données est fortement enregistrée (pensez à AG sync, suivi des changements, réplication, triggers mal écrits), et la table est fortement accédée - c'est une recette potentielle pour le désastre. Si votre changement est quelque chose où vous pouvez appliquer un indice ONLINE ou ajouter une colonne et copier les données par lots au lieu du tout ou rien que l'interface graphique peut faire, c'est mieux.

La table est-elle réellement supprimée et recréée automatiquement lorsque cette case n'est pas cochée ?

Il pourrait . Il existe une longue liste de scénarios et le résultat dépend de la version de SSMS, de la version de SQL Server et parfois de l'édition. Vous pouvez vérifier en cochant la case et en essayant d'appliquer la modification. sur une copie insignifiante de la base de données d'abord mais l'utilisation de ALTER TABLE scripts au lieu de l'interface graphique est la meilleure solution.

Si oui, la copie de la table est-elle une réplique exacte à 100% de la table source ?

Oui, si SSMS doit reconstruire la table, elle sera une réplique exacte à 100% une fois que ce sera fait (sauf pour le changement bien sûr), mais cela pourrait être mercredi prochain. Le processus crée une nouvelle version de la table, y copie toutes les données, puis supprime l'ancienne table et renomme la nouvelle.

5 votes

Bien qu'il s'agisse d'une très bonne réponse, je pense qu'elle ne répond pas à toutes les questions soulevées par le PO, et ce sont ces questions qui m'intéressent, en fait. En particulier Y a-t-il des effets négatifs / des inconvénients possibles à faire cela ? y Si oui, la copie de la table est-elle une réplique exacte à 100% de la table source ? . Avez-vous des informations concernant ces questions ?

0 votes

@tfrascaroli Y a-t-il des inconvénients à laisser SSMS reconstruire la table pour vous ? Bien sûr. Si vous pouvez script le changement vous-même sans reconstruire la table entière, c'est mieux - considérez le cas où la table est 10TB, et la base de données est fortement enregistrée (pensez à AG sync, suivi des changements, réplication), et la table est fortement accédée - c'est une recette potentielle pour un désastre. La table sera une réplique exacte à 100% une fois le projet terminé, mais cela pourrait être mercredi prochain.

12voto

RGI Points 817

Référence - La désactivation de cette option peut vous éviter de recréer une table, mais elle peut aussi entraîner la perte des modifications. Par exemple, supposons que vous ayez activé la fonction de suivi des modifications dans SQL Server 2008 pour suivre les modifications apportées à la table. Lorsque vous effectuez une opération qui entraîne la recréation de la table, vous recevez le message d'erreur mentionné dans la section "Symptômes". Toutefois, si vous désactivez cette option, les informations de suivi des modifications existantes sont supprimées lorsque la table est recréée. Par conséquent, Microsoft vous recommande de ne pas contourner ce problème en désactivant cette option.

12voto

Carol Baker West Points 149

SQL Server supprime et recrée les tables uniquement si vous :

  • Ajouter une nouvelle colonne
  • Modifier le paramètre "Autoriser les nuls" pour une colonne
  • Modifier l'ordre des colonnes dans le tableau
  • Modifier le type de données de la colonne

L'utilisation de ALTER est plus sûre, car si les métadonnées sont perdues lors de la recréation de la table, vos données seront perdues.

9 votes

Votre liste n'est pas exhaustive. Ajoutez/supprimez le IDENTITY sur une colonne, par exemple.

2 votes

L'ajout d'une nouvelle colonne à la fin des champs qui est NULLABLE ne nécessite pas la reconstruction de la table.

3voto

Raed Alsaleh Points 315

Suivez le lien pour obtenir la solution du support MS pour ce problème :

http://support.microsoft.com/kb/956176

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X