web-dev-qa-db-fra.com

Comment modifier une colonne sans supprimer une table dans SQL 2008

Pourquoi SQL 2008 veut-il soudainement supprimer mes tables lorsque je change le type de colonne de say int à real À ma connaissance, cela n’est jamais arrivé dans SQL 2005. Toute idée serait utile s'il vous plaît.

39
Middletone

Dans SQL Server 2008, accédez à Outils >> Options. Dans la petite fenêtre, cliquez sur "Designer". Décochez la case "Empêcher l'enregistrement des modifications nécessitant ...".

=====

Edité le 4 septembre 2015.

J'ai ajouté cette réponse ici il y a très très longtemps, décrivant comment je résoudrais la situation décrite dans la question ci-dessus. Depuis lors, les utilisateurs figurant dans les discussions ci-dessous ont fait part de plusieurs préoccupations quant à la manière de procéder que j'ai recommandée à l'époque. Fondamentalement, la solution que j'ai décrite pourrait être problématique sur certains scénarios. Je vous suggère ensuite de continuer à lire pour vérifier les commentaires des autres utilisateurs et choisir la meilleure solution pour vous.

35
Marcos Buarque

Je ne peux pas croire que la meilleure réponse soit restée assise ici pendant si longtemps - c'est un conseil très dangereux! 

Il y a peu d'opérations que vous pouvez faire sur place sans laisser tomber votre table:

Si vous vous trouvez dans une situation où il est impossible de modifier une colonne sans supprimer la table, vous pouvez généralement utiliser une requête SELECT INTO pour projeter vos données dans une nouvelle table, puis supprimer l'ancienne table (désactivation temporaire des contraintes), puis renommer le projet table. Cependant, dans ce cas, vous devrez déconnecter votre base de données pour la maintenance.

44
Johannes Rudolph

Voici ce que j'utilise:

-- Add new column
ALTER TABLE MyTable
ADD Description2 VARCHAR(MAX)
GO

-- Copy data to new column (probably with modifications)
Update MyTable
SET Description2 = Description
GO

-- Drop old column
ALTER TABLE MyTable
DROP COLUMN Description
GO

-- Rename new column to the original column's name.
sp_RENAME 'MyTable.Description2' , 'Description', 'COLUMN'
GO
  1. Copiez les données dans une nouvelle colonne.
  2. Déposez l'ancienne colonne.
  3. Renommez la nouvelle colonne avec le nom de l'ancienne colonne.
32
user2173353

J'ai le même problème. Bien que mon compte ait des droits si j'essaie d'utiliser un autre compte, cela fonctionne. Il semble que mon compte n’a pas la capacité de changer. toujours en cours d’enquête, mais c’est une question de permission.

mettre à jour:

Je ne peux pas l'expirer. mais c'est ce que j'ai fait. Mon groupe a appartenu à deux groupes de domaine. L'un était un nouveau groupe de domaine AD et l'autre était un groupe de domaine NT Legay. Une fois que j'ai supprimé le groupe de domaine hérité, j'ai pu modifier la table avec succès. Remarquez que les deux groupes avaient des privilèges "sa".

Le comportement était que les commandes alter aboutiraient, mais rien n'a changé sur la table. Ensuite, lorsque j'ai essayé manuellement de modifier les champs via le concepteur, il s'est plaint de mon impossibilité d'effectuer des modifications si nécessaire pour supprimer et recréer la table. J'ai trouvé le réglage dans les outils et j'ai pu l'éteindre. Mais cette table est énorme et ce n’est pas une bonne idée de le faire. Je déconseillerais aux autres de le faire. 

donc c'était un problème de permission. Je ne peux pas expliquer comment, mais j'espère que cela aidera quelqu'un d'autre

0
Roberto Torrres

Une autre façon de le faire sans perdre totalement la table est

  1. Effectuez une sauvegarde des valeurs de colonne.
  2. Rendre la colonne nullable si elle n'autorise pas déjà les valeurs null. Définissez les valeurs de colonne sur null par

    update tablename set columnname = null 
    
  3. Supprimer la colonne
  4. Insérer une nouvelle colonne avec le même nom que la colonne supprimée et le type que vous souhaitez
  5. Insérer les données sauvegardées dans cette colonne