webentwicklung-frage-antwort-db.com.de

So ändern Sie eine Spalte, ohne eine Tabelle in SQL 2008 zu löschen

Warum möchte SQL 2008 plötzlich meine Tabellen löschen, wenn ich den Spaltentyp von beispielsweise int in real ändern möchte? Dies ist meines Wissens in SQL 2005 nicht der Fall. Einsicht wäre bitte hilfreich.

39
Middletone

Wechseln Sie in SQL Server 2008 zu Extras >> Optionen. Klicken Sie in dem kleinen Fenster auf "Designer". Deaktivieren Sie "Verhindern, dass Änderungen gespeichert werden, ..."

=====

Bearbeitet am 4. September 2015.

Ich habe diese Antwort vor langer, langer Zeit hier hinzugefügt und beschrieben, wie ich die in der obigen Frage beschriebene Situation lösen würde. Seitdem haben Benutzer in den folgenden Threads einige Bedenken geäußert, wie sie zu dem Zeitpunkt empfohlen wurden, wie ich es damals empfohlen habe. Grundsätzlich könnte die von mir beschriebene Lösung in einigen Szenarien problematisch sein. Ich empfehle Ihnen dann, weiterzulesen, um die Kommentare anderer Benutzer zu überprüfen und die beste Lösung für Sie auszuwählen.

35
Marcos Buarque

Ich kann nicht glauben, dass die beste Antwort schon so lange hier ist - es ist ein sehr gefährlicher Ratschlag! 

Es gibt wenige Vorgänge, die Sie inplace ausführen können, ohne Ihre Tabelle zu löschen:

Wenn Sie sich in einer Situation befinden, in der das Ändern einer Spalte nicht möglich ist, ohne die Tabelle zu löschen, können Sie normalerweise eine SELECT INTO-Abfrage verwenden, um Ihre Daten in eine neue Tabelle zu projizieren, dann die alte Tabelle zu löschen (temporäre Einschränkungen zu deaktivieren) und die projektierte dann umzubenennen Tabelle. In diesem Fall müssen Sie jedoch Ihre Datenbank zur Wartung offline schalten.

44

Ich verwende Folgendes:

-- 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. Kopieren Sie die Daten in eine neue Spalte.
  2. Lass die alte Spalte fallen.
  3. Benennen Sie die neue Spalte in den Namen der alten Spalte um.
32
user2173353

Ich habe das gleiche Problem. Obwohl mein Konto sa-Rechte hat, wenn ich versuche, ein anderes sa-Konto zu verwenden, funktioniert es. Es scheint, dass mein Konto irgendwie nicht die Fähigkeit hat, sich zu ändern. Es wird immer noch untersucht, aber es handelt sich um eine Erlaubnisfrage.

aktualisieren:

Ich kann es nicht weitergeben. aber das habe ich getan. Dort gehörten zwei Domain-Gruppen, zu denen mein Konto gehörte. Eine war eine neue AD-Domänengruppe und die andere war eine NT-Legay-Domänengruppe. Nachdem ich die alte Domänengruppe entfernt hatte, konnte ich die Tabelle erfolgreich ändern. Wohlgemerkt, beide Gruppen hatten "sa" Privilegien.

Das Verhalten war, dass die alter-Befehle zum Erfolg führen würden, aber an der Tabelle nichts geändert hat. Als ich dann manuell versuchte, die Felder über den Designer zu ändern, beklagte es sich, dass ich keine Änderungen vornehmen darf, wenn die Tabelle gelöscht und neu erstellt werden muss. Ich habe die Einstellung in Tools gefunden und konnte sie abschalten. Aber dieser Tisch ist riesig und keine gute Idee, dies zu tun. Ich würde andere davon abraten. 

es war also eine Erlaubnisfrage. Ich kann nicht erklären wie, aber ich hoffe es hilft jemand anderem

0
Roberto Torrres

Ein anderer Weg, um den Tisch nicht völlig fallen zu lassen, ist

  1. Sichern Sie die Spaltenwerte.
  2. Machen Sie die Spalte nullfähig, wenn sie noch keine Nullwerte zulässt. Setzen Sie die Spaltenwerte mit Doing auf null 

    update tablename set columnname = null 
    
  3. Löschen Sie die Spalte
  4. Fügen Sie eine neue Spalte mit demselben Namen wie die gelöschte Spalte und dem gewünschten Typ ein
  5. Fügen Sie die gespeicherten Daten in diese Spalte ein