web-dev-qa-db-fra.com

SQL Server Management Studio - L'ajout/le déplacement de colonnes nécessite une suppression et une recréation?

Pourquoi est-ce que je reçois un message indiquant que la table doit être supprimée et recréée lorsque j'ajoute/déplace des colonnes? Je crois que cela se produit après avoir ajouté des contraintes de clé étrangère.

Que puis-je faire pour ajouter de nouvelles colonnes sans déposer de table?

17
tvr

"Prevent saving changes that require table re-creation"

Si vous souhaitez simplement que SSMS cesse de vous harceler, vous pouvez décocher le paramètre "Empêcher l'enregistrement des modifications qui requièrent une re-création de table" dans Options-> Designers-> Designers de tables et de bases de données. La ou les tables seront toujours supprimées et recréées, mais au moins SSMS ne vous importunera pas autant à ce sujet. 

(Cela suppose que vous travaillez dans un environnement de développement/test ou dans un environnement de production où une brève erreur dans l'existence de la table ne gâche rien.)

24
John Rose

Parce que c'est comme ça que SQL Server Management Studio le fait (parfois)!

Utilisez TSQL's ALTER TABLE à la place:

ALTER TABLE
    ADD myCol int NOT NULL
8
Mitch Wheat

SQL Server (et tout autre SGBDR, en réalité) n'a aucune notion "d'ordre de colonne" - par exemple. Si vous déplacez des colonnes, le seul moyen d'obtenir cette nouvelle structure de table consiste à émettre une nouvelle instruction CREATE TABLE. Vous ne pouvez pas ordonner vos colonnes d'une autre manière - vous ne devriez pas non plus le faire, car dans la théorie relationnelle, l'ordre des colonnes dans un Tuple n'a pas d'importance.

Ainsi, la seule chose que SQL Server Management Studio puisse faire (et qu’elle a faite depuis le début) est la suivante:

  • renommer l'ancienne table
  • créer la nouvelle table dans votre nouvelle mise en page que vous souhaitez avoir
  • copier les données de l'ancien tableau
  • déposer la vieille table

La seule façon de contourner cela est:

  • ne réorganisez aucune colonne - ajoutez seulement de nouvelles colonnes à la fin de votre tableau
  • utilisez les instructions SQL ALTER TABLE au lieu du concepteur de table interactive pour votre travail
1
marc_s

Lorsque vous modifiez une définition de table dans le concepteur, vous dites "voici à quoi ressemblera la table, déterminez maintenant quelles instructions SQL émettre pour que mes souhaits se réalisent". Cela fonctionne bien pour des changements simples, mais le logiciel ne peut pas lire dans vos pensées, et parfois, il essaye de faire les choses de manière plus compliquée pour la sécurité.

Lorsque cela se produit, je suggère que, au lieu de cliquer simplement sur OK, cliquez sur le bouton "Script" en haut de la boîte de dialogue et laissez-le générer les instructions SQL dans une fenêtre de requête. Vous pouvez ensuite éditer et simplifier le code généré avant de l'exécuter.

0
Christian Hayter

Il y a des bogues dans SSMS 2008 R2 (et plus anciens) qu'il est utile de connaître: 

  • lorsque les données de la table sont modifiées, le rendu de ерушк dans SSMS est automatiquement actualisé par SSMS dans ses onglets (fenêtres) déjà ouverts. Il faut appuyer sur Ctrl + R pour actualiser. Les options pour forcer l'actualisation n'apparaissent pas dans l'interface graphique de SSMS - via des boutons, des menus ou des options contextuelles (en cliquant avec le bouton droit de la souris) 
  • lorsqu'un schéma (table ou base de données) est modifié, par exemple l'ajout/la suppression/la suppression d'une colonne dans une table, SSMS ne reflète pas ces modifications dans les onglets (fenêtres) déjà ouverts, même avec Ctrl + R, il convient de fermer et de rouvrir les onglets (windows ) 

Je l'ai signalé il y a quelques années dans les commentaires de Microsoft Connect, mais les bogues ont été fermés car ils sont "de par leur conception". 

Mettre à jour:
C’est étrange et irritant de voir un produit de bureau développé au cours de deux décennies, alors que cela (rafraîchissement automatique) est effectué par la plupart des applications Web dans n’importe quel navigateur.