287 votes

Enregistrement des modifications après l'édition d'une table dans SQL Server Management Studio

Si je veux enregistrer des modifications dans une table, précédemment enregistrée dans SQL Server Management Studio (aucune donnée présente dans la table), j'obtiens un message d'erreur :

La sauvegarde des modifications n'est pas autorisée. Les modifications que vous avez apportées exigent que les les tables suivantes soient abandonnées et recréées. Vous avez soit apporté modifications à une table qui ne peut pas être recréée ou vous avez activé l'option Empêcher l'enregistrement des modifications qui nécessitent la recréation de la table.

Qu'est-ce qui peut empêcher le tableau d'être facilement édité ? Ou, est-ce la façon habituelle pour SQL Server Management Studio d'exiger la recréation de la table pour l'édition ? Qu'est-ce que c'est - ce "option Empêcher la sauvegarde des modifications" ?

4 votes

2 votes

@Pang - Cette question est venue en premier, ceci est le duplicata.

1 votes

627voto

Pedro Points 3713

Allez dans Outils -> Options -> Concepteurs-> Décochez "Empêcher l'enregistrement des modifications qui nécessitent la recréation d'une table". Voilà.

Cela se produit parce qu'il est parfois nécessaire de supprimer et de recréer une table afin de modifier quelque chose. Cela peut prendre un certain temps, car toutes les données doivent être copiées dans une table temporaire, puis réinsérées dans la nouvelle table. Comme SQL Server ne vous fait pas confiance par défaut, vous devez dire "OK, je sais ce que je fais, maintenant laissez-moi faire mon travail".

1 votes

Merci, Pedro. Il semble que Daniel ait été le premier à répondre, mais +1 pour la réponse claire et brève.

10 votes

Le site d'assistance de Microsoft déconseille cette méthode, mais si vous n'avez pas de données dans le tableau, je n'en vois pas l'inconvénient. Il est probablement préférable d'utiliser TSQL pour effectuer les modifications.

6 votes

Je déconseille personnellement l'utilisation du concepteur pour les bases de données importantes. Je l'ai vu faire des erreurs coûteuses à de nombreuses reprises. En outre, il favorise des habitudes de développement paresseuses et permet à des personnes de modifier la structure de la base de données alors qu'elles ne sont peut-être pas assez compétentes pour le faire si elles ne peuvent pas gérer la voie du code SQL.

123voto

Prasanna Points 1683

Outils | Options | Concepteurs | Concepteurs de tableaux et de bases de données

Décochez l'option "Empêcher l'enregistrement des modifications qui nécessitent la recréation d'une table".

6 votes

Merci pour la capture d'écran. Je cherchais quelque chose comme ça pour m'aider à trouver cette stupide option. La boîte de dialogue devrait avoir une case à cocher pour "le faire quand même" quand elle dit que vous ne pouvez pas.

2 votes

La meilleure pratique après avoir changé cette option est de cocher l'option supérieure 'Générer automatiquement des scripts de changement' afin d'éviter la perte de données.

0 votes

Merci pour l'image. C'est très utile :)

71voto

Daniel Vassallo Points 142049

Pour contourner ce problème, utilisez des instructions SQL pour apporter des modifications à la structure des métadonnées d'une table.

Ce problème se produit lorsque "Empêcher l'enregistrement des modifications qui nécessitent la recréation d'une table" est activée.

Fuente: Message d'erreur lorsque vous essayez d'enregistrer une table dans SQL Server 2008 : "L'enregistrement des modifications n'est pas autorisé"

14 votes

Ma question est la suivante : pourquoi le serveur SQL n'utilise-t-il pas les instructions T-SQL requises au lieu de supprimer et de recréer la table à chaque modification ? Je ne comprends pas ce comportement.

16voto

HLGEM Points 54641

Plutôt que de décocher la case (une mauvaise solution), vous devriez ARRÊTER de modifier les données de cette façon. Si les données doivent être modifiées, alors faites-le avec un script, de sorte que vous puissiez facilement le porter en production et qu'il soit sous contrôle de source. Cela permet également de rafraîchir plus facilement les changements de test après que la production ait été poussée vers le dev pour permettre aux développeurs de travailler sur des données plus fraîches.

2 votes

A) Vous pouvez copier le script que SSMS génère et l'utiliser dans votre environnement de production. B) SSMS est souvent plus facile, plus rapide et plus sûr parce que SSMS gère tous les détails pour vous.

2 votes

Itg est toujours une très mauvaise idée. Vous ne voulez pas recréer une table de 10 000 000 d'enregistrements sur prod. Ce n'est pas plus rapide. En quoi est-ce plus sûr ? Les mauvaises données sont de mauvaises données et les contrôles de cohérence fonctionnent si vous utilisez un script que vous avez écrit aussi bien que si vous laissez SSMS en écrire un. C'est une MAUVAISE pratique dans 100% des cas.

0 votes

Je dirais que, dans n'importe quel contexte où vous êtes déjà dans la prod et où il y a des données, alors oui, c'est probablement vrai. D'un autre côté, dans un cas où j'étais encore en développement et où j'avais une TABLE COMPLÈTEMENT BLANCHE que je voulais modifier... Je dirais que c'est moins vrai. :p

14voto

marc_s Points 321990

De nombreuses modifications que vous pouvez effectuer très facilement et visuellement dans l'éditeur de table de SQL Server Management Studio nécessitent en fait que SSMS abandonne la table en arrière-plan et la recrée à partir de zéro. Même les choses simples comme la réorganisation des colonnes ne peuvent pas être exprimées dans une déclaration SQL DDL standard - tout ce que SSMS peut faire est de déposer et de recréer la table.

Cette opération peut a) prendre beaucoup de temps sur une grande table, ou b) peut même échouer pour diverses raisons (comme les contraintes FK et autres). Par conséquent, SSMS dans SQL Server 2008 a introduit cette nouvelle option que les autres réponses ont déjà identifiée.

Il peut sembler contre-intuitif au premier abord d'empêcher de telles modifications - et c'est certainement une nuisance sur un serveur de développement. Mais sur un serveur de production, cette option et sa valeur par défaut, qui consiste à empêcher de telles modifications, peuvent vous sauver la vie !

2 votes

Je suis maintenant sur un serveur de développement, mais sur un serveur de production, je vais certainement le réactiver. Merci encore de partager votre expérience

1 votes

Mais, par exemple, changer la taille d'une colonne nvarchar de 100 à 120 est une opération très simple qui pourrait être facilement réalisée avec ALTER TABLE... alors, pourquoi SQL Server (Management Studio) abandonne et recrée la table dans de tels cas ?

4 votes

@Jaime : vous devez demander aux développeurs de ce concepteur visuel - personne d'autre ne le sait. C'est juste un fait - avec le concepteur visuel, de nombreux changements simples seront toujours effectués en recréant la table et en copiant autour. Si vous voulez utiliser l'approche directe, c'est jusqu'à vous de le faire vous-même en écrivant quelques instructions T-SQL simples et en les exécutant.

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