Warum will SQL 2008 plötzlich meine Tabellen löschen, wenn ich den Spaltentyp z. B. von int in real ändere? Meines Wissens ist dies in SQL 2005 nie passiert. Jeder Einblick wäre hilfreich.
Antworten
Zu viele Anzeigen?Ich kann nicht glauben, dass die oberste Antwort schon so lange hier liegt - es ist ein sehr gefährlicher Ratschlag!
Es gibt nur wenige Operationen, die Sie an Ort und Stelle durchführen können, ohne Ihre Tabelle zu löschen:
- Erweitern einer varchar-Spalte https://dba.stackexchange.com/questions/5211/changing-column-width
- Eine Spalte löschbar machen (aber nicht umgekehrt)
- Umbenennen von Spalten mit sp_rename
Wenn Sie sich in einer Situation befinden, in der die Änderung einer Spalte nicht möglich ist, ohne die Tabelle zu löschen, können Sie normalerweise eine SELECT INTO
Abfrage, um Ihre Daten in eine neue Tabelle zu projizieren, dann löschen Sie die alte Tabelle (und deaktivieren vorübergehend die Beschränkungen) und benennen dann die projizierte Tabelle um. In diesem Fall müssen Sie allerdings Ihre Datenbank zur Wartung offline nehmen.
In SQL Server 2008 gehen Sie zu Extras >> Optionen. In dem kleinen Fenster klicken Sie auf "Designer". Deaktivieren Sie das Kontrollkästchen "Speichern von Änderungen verhindern, die ...".
\=====
Bearbeitet am 4. September 2015.
Ich habe diese Antwort hier vor langer, langer Zeit hinzugefügt und beschrieben, wie ich die in der obigen Frage beschriebene Situation lösen würde. Seitdem haben Benutzer in den folgenden Threads verschiedene Bedenken bezüglich der von mir damals empfohlenen Vorgehensweise geäußert. Im Grunde genommen könnte die von mir beschriebene Lösung in einigen Fällen problematisch sein. Ich empfehle Ihnen daher, weiterzulesen, die Kommentare anderer Benutzer zu lesen und die für Sie beste Lösung zu wählen.
Das verwende ich:
-- 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
- Kopieren Sie die Daten in eine neue Spalte.
- Lassen Sie die alte Spalte fallen.
- Benennen Sie die neue Spalte in den Namen der alten Spalte um.
Ich habe das gleiche Problem. Obwohl mein Konto sa-Rechte hat, funktioniert es, wenn ich ein anderes sa-Konto verwende. Es scheint, dass mein Konto irgendwie nicht die Fähigkeit, zu ändern haben. noch untersuchen, aber es ist eine Berechtigung Problem.
aktualisieren:
Ich kann es nicht erklären, aber ich habe Folgendes getan: Es gab zwei Domänengruppen, zu denen mein Konto gehörte. Die eine war eine neue AD-Domänengruppe und die andere war eine NT-Legay-Domänengruppe. Nachdem ich die Legacy-Domänengruppe entfernt hatte, konnte ich die Tabelle erfolgreich ändern. Wohlgemerkt, beide Gruppen hatten "sa"-Privilegien.
Das Verhalten war so, dass die alter-Befehle zum Erfolg führten, sich aber nichts an der Tabelle änderte. Als ich dann versuchte, die Felder manuell über den Designer zu ändern, beschwerte er sich, dass ich keine Änderungen vornehmen dürfe, wenn ich die Tabelle löschen und neu erstellen müsse. Ich fand die Einstellung in den Werkzeugen und konnte sie deaktivieren. Aber diese Tabelle ist riesig und es ist keine gute Idee, dies zu tun. Ich würde anderen davon abraten.
Es war also eine Frage der Genehmigung. Ich kann nicht erklären, wie, aber ich hoffe, es hilft jemand anderem
Eine andere Möglichkeit, ohne die Tabelle vollständig zu löschen, ist
-
Erstellen Sie eine Sicherungskopie der Spaltenwerte.
-
Machen Sie die Spalte nullbar, wenn sie nicht bereits Nullen zulässt. Setzen Sie die Spaltenwerte auf null, indem Sie tun.
update tablename set columnname = null
-
Löschen Sie die Spalte
-
Fügen Sie eine neue Spalte mit demselben Namen wie die gelöschte Spalte und dem gewünschten Typ ein
-
Einfügen der gespeicherten Daten in diese Spalte