Enregistrement des modifications après la modification d'une table dans SQL Server Management Studio

265

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

L'enregistrement des modifications n'est pas autorisé. Les modifications que vous avez apportées nécessitent la suppression et la recréation des tableaux suivants. Vous avez soit apporté des modifications à une table qui ne peut pas être recréée, soit activé l'option Empêcher l'enregistrement des modifications nécessitant la recréation de la table.

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

rem
la source
4
la duplication possible des modifications
Pang
1
@Pang - Cette question est venue en premier, c'est le doublon.
GrandMasterFlush
@Pang - Je ne le savais pas, merci.
GrandMasterFlush

Réponses:

573

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

Cela se produit car il est parfois nécessaire de supprimer et de recréer une table afin de changer 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. Étant donné que SQL Server par défaut ne vous fait pas confiance, vous devez dire «OK, je sais ce que je fais, maintenant laissez-moi faire mon travail».

Pedro
la source
8
Le site de support Microsoft décourage cela, mais si vous n'avez aucune donnée dans le tableau, je ne vois pas le mal. Il est probablement préférable d'utiliser TSQL pour effectuer les modifications.
Jon Smock
6
Je découragerais personnellement l'utilisation du concepteur pour des bases de données importantes. Je l'ai vu commettre des erreurs coûteuses à plusieurs reprises. En outre, il favorise les habitudes de développement paresseux et permet aux gens de modifier la structure de la base de données qui ne sont peut-être pas suffisamment compétents pour le faire s'ils ne peuvent pas gérer la route du code SQL.
Mark W Dickson
5
D'accord, Mark, mais au début du développement, je n'ai pas besoin d'écrire une pile de scripts.
Kristopher
7
Il est choquant que ce soit septembre 2016, et cette incroyable erreur peu conviviale (sans possibilité de demander "Hé, voudriez-vous autoriser les changements de table?") Est toujours en jeu. Non, vous obtenez simplement un bouton Annuler et vous devez recommencer vos modifications. SQL Server est le plus stupide.
Mike Gledhill
2
@Mike Gledhill Salutations de 2019 et c'est toujours le cas LOL
Captain Kenpachi
116

Outils> Options

entrez la description de l'image ici

Décochez l'option ci-dessus

Prasanna
la source
5
Merci pour la capture d'écran. Je cherchais quelque chose comme ça pour m'aider à trouver cette option stupide. La boîte de dialogue devrait avoir une case à cocher pour "faire quand même" quand elle dit que vous ne pouvez pas.
Chris Benard
2
La meilleure pratique Après avoir modifié cette option consiste à cocher l'option supérieure «Générer automatiquement des scripts de changement» afin d'éviter la perte de données
dubi
Merci pour l'image. C'est très utile :)
M A.
72

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

Ce problème se produit lorsque l' option «Empêcher l'enregistrement des modifications qui nécessitent une recréation de table» est activée.

Source: message d'erreur lorsque vous essayez d'enregistrer une table dans SQL Server 2008: «l'enregistrement des modifications n'est pas autorisé»

Daniel Vassallo
la source
12
Ma question est la suivante: pourquoi SQL Server n'utilise-t-il pas les instructions T-SQL requises au lieu de supprimer et de recréer la table pour chaque modification? Je ne peux pas comprendre ce comportement.
Jaime
15

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, faites-le avec un script, de sorte que vous puissiez facilement les porter en production et qu'elles soient sous contrôle de source. Cela facilite également l'actualisation des modifications des tests après que la production a été poussée vers le bas pour permettre aux développeurs de travailler avec des données plus récentes.

HLGEM
la source
2
A) Vous pouvez copier le script généré par SSMS et l'utiliser sur votre environnement de production. B) SSMS est souvent plus facile, plus rapide et plus sûr car SSMS gère tous les détails pour vous.
Trisped
2
C'est toujours une très mauvaise idée. Vous ne voulez pas recréer une table d'enregistrements 10 000 000 sur prod. Ce n'est pas plus rapide. Comment est-ce plus sûr? Les données incorrectes sont des données incorrectes et les contrôles de cohérence fonctionnent si vous utilisez un script que vous avez écrit ainsi que si vous laissez SSMS en écrire un. C'est une pratique PAUVRE dans 100% des cas.
HLGEM
15

Allez à SSMS et essayez ceci

Menu >> Outils >> Options >> Concepteurs >> Décochez “Empêcher l'enregistrement des modifications qui nécessitent une recréation de la table”.

Voici une très bonne explication à ce sujet: http://blog.sqlauthority.com/2009/05/18/sql-server-fix-management-studio-error-saving-changes-in-not-permitted-the-changes -vous-avez-fait-exiger-les-tableaux-suivants-à-être-déposés-et-recréés-vous-avez-soit-soit-apporté-des-modifications-à-un-onglet /

Rolwin Crasta
la source
14

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

Cette opération peut être a) très longue 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.

Cela peut sembler contre-intuitif au premier abord pour empêcher de tels changements - 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 d'empêcher de tels changements deviennent un épargnant de vie potentiel!

marc_s
la source
2
Je suis maintenant sur un serveur de développement, mais sur un serveur de production, je vais certainement le réactiver. Merci encore pour le partage d'expérience
rem
1
Mais, par exemple, changer la taille d'une colonne nvarchar de 100 à 120 est une opération très simple qui pourrait être facilement effectuée avec ALTER TABLE ... alors, pourquoi SQL Server (Management Studio) abandonne-t-il et recrée-t-il la table pour une telle cas?
Jaime
4
@Jaime: que vous devez demander aux développeurs de ce concepteur visuel - personne d'autre ne 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 souhaitez utiliser l'approche simple, c'est à vous de la gérer vous-même en écrivant quelques instructions T-SQL simples et en les exécutant.
marc_s
1
Merci @marc_s C'est exactement la réponse à laquelle je m'attendais, même si j'avais peu confiance en eux pour avoir une raison cachée qui expliquerait tout cela :)
Jaime
1
Cette restriction empêche également l'ID d'objet de changer à votre insu (au cas où vous auriez besoin que cela ne se produise pas).
Trisped