16

Pourquoi ai-je reçu 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 l'ajout de contraintes de clé étrangère.SQL Server Management Studio - Ajouter/déplacer des colonnes nécessite de supprimer et de recréer?

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

+6

je ne partage pas l'opinion commune que l'ordre n'a pas d'importance. La lisibilité et l'organisation comptent toujours lors de la programmation. Par exemple, j'aime toujours que mes PK soient groupés, pas entrecoupés sur une table de 50 colonnes. Pour un autre exemple, un obfuscator n'a pas d'importance pour la fonctionnalité d'un programme, mais il fait (délibérément) le code dans un désordre terrible. IMO le désir de commander vos colonnes est tout à fait naturel. – Tekito

Répondre

21

"Prevent saving changes that require table re-creation"

Si vous êtes plus intéressé simplement obtenir SSMS pour arrêter lancinante, vous pouvez décocher « Empêcher d'enregistrer les modifications qui nécessitent la table re-création "réglage dans Options-> Designers-> Table et concepteurs de base de données. Les tables seront toujours supprimées et recréées, mais au moins SSMS ne vous en dérangera pas autant.

(Cela suppose que vous travaillez dans un environnement de dev/test ou dans un environnement de production où un bref laps de l'existence de la table ne vis rien vers le haut)

+1

Merci! Cela devrait fonctionner pour le moment mais un peu dangereux :) – tvr

+1

Content de l'entendre! En passant, SSMS déplacera également vos données vers la nouvelle table. Je n'ai jamais perdu de données ou j'ai eu d'autres problèmes de cette façon. Bien que je fasse toujours une sauvegarde bien sûr! –

+0

Ceci est un conseil très dangereux!Ne décochez jamais ce champ ou vous risquez de perdre accidentellement toutes vos données sur les changements structurels. Oubliez l'interface utilisateur et utilisez TSQL pour modifier votre table comme décrit dans l'une des autres réponses. – Jan

7

Parce que c'est ainsi que SQL Server Management Studio le fait (parfois)!

Utilisez ALTER TABLE de TSQL à la place:

ALTER TABLE 
    ADD myCol int NOT NULL 
+0

Qu'en est-il de re-commander? :) – tvr

+1

@tvrsubs: L'ordre n'a pas d'importance. [Voir ceci] (http://en.wikipedia.org/wiki/Obsessive_compulsive_disorder) – gbn

+2

Merci pour le lien. Oui, je suis obsessionnel et vous devriez probablement voir cela http://www.answers.com/topic/cleanliness-is-next-to-godliness :) – tvr

0

Lorsque vous modifiez une définition de table dans le concepteur, vous dites « voici ce que je veux la table pour ressembler à, maintenant travailler ce que les instructions SQL à émettre pour faire mes voeux se réalisent ". Cela fonctionne très bien pour des changements simples, mais le logiciel ne peut pas lire dans votre esprit, et parfois il va essayer de faire les choses d'une manière plus compliquée pour la sécurité. Dans ce cas, 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

Désolé où puis-je trouver le bouton "Script"? Est-ce la même chose que le menu "Script Table as"? – tvr

1

SQL Server (et tout autre RDBMS, en fait) n'a aucune notion de "ordre de colonne" - par ex. Si vous déplacez des colonnes, la seule façon d'obtenir cette nouvelle structure de table est d'émettre une nouvelle instruction CREATE TABLE. Vous ne pouvez pas ordonner vos colonnes d'une autre manière - et vous ne devriez pas, vraiment, puisque dans la théorie relationnelle, l'ordre des colonnes dans un tuple n'est pas pertinent.

La seule chose SQL Server Management Studio peut faire (et a fait tout le long) est:

  • renommer l'ancienne table
  • créer la nouvelle table dans votre nouvelle mise en page que vous souhaitez avoir
  • copier les données au-dessus de l'ancienne table
  • tomber l'ancienne table

la seule façon de contourner cela est:

  • ne réorganisant les colonnes - seulement ajouter de nouvelles colonnes à la fin de votre table
  • utilisation ALTER TABLE instructions SQL au lieu du concepteur de table interactive pour votre travail
+4

Mysql n'a pas de problème avec cela .. – tvr

0

Il y a des bugs dans SSMS 2008 R2 (et plus) qui sont utiles à savoir:

  • lorsque les données de table est modifiée, ерушк rendu dans SSMS est autorefreshed par SSMS dans ses onglets déjà ouverts (fenêtres) - un shou ld appuyez sur Ctrl + R pour actualiser.Les options pour forcer l'actualisation n'apparaissent pas dans l'interface graphique SSMS - via les boutons, menus ou options contextuelles (avec un clic droit)
  • lorsqu'un schéma (table ou base de données) est modifié, comme ajouter/supprimer/supprimer une colonne une table, SSMS ne reflète pas ces changements dans les onglets déjà ouverts (fenêtres), même par Ctrl + R, on doit fermer et rouvrir les onglets (fenêtres)

je l'ai signalé il y a quelques années par Microsoft Connect commentaires, mais les bugs ont été fermés en raison de c'est "par conception"

Mise à jour:
Ceci est étrange et irritant à voir dans le produit de bureau développé pendant 2 deca des, alors que ce (autorefreshing) est fait par la plupart des applications web dans un navigateur

+0

Je devrais dire, ceux-ci ont un sens puisque cela nécessite un surcoût supplémentaire (bien sûr, ils devraient probablement vérifier les horodatages ou quelque chose de similaire) – tvr

+0

Quel est le sens? - celui-ci n'est ni autorefresh ni actualisé en forçant l'actualisation manuelle des métadonnées sans fermer et rouvrir une fenêtre? Quel est le sens? Ce n'est pas un surcoût, c'est-à-dire pas de retard, on ne peut pas obtenir la représentation graphique du schéma modifié (métadonnées) dans SSMS du tout dans la fenêtre déjà ouverte (avant modification) indépendamment du temps –