4 Stimmen

VS 2010-Datenbankprojekt, das Daten bei Änderung des Spaltennamens löscht

Ich teste gerade die neuen Datenbankprojektfunktionen von Visual Studio 2010 und möchte den Namen einer Spalte in einer Tabelle ändern. Ich änderte den Namen im Erstellungsskript und stellte es für die Datenbank bereit. Das generierte Skript hat die Spalte einfach gelöscht und eine neue Spalte mit dem richtigen Namen hinzugefügt, aber alle Daten gingen verloren.

Gibt es eine Einstellung, bei der die Spaltendaten nicht gelöscht werden?

Ich bin auf der Suche nach der "DataDude"-Lösung für dieses Problem. (Falls es eine gibt)

PRINT N'Altering [dbo].[Users]...';

GO
ALTER TABLE [dbo].[Users] DROP COLUMN [TestX];

GO
ALTER TABLE [dbo].[Users]
    ADD [Testn] NVARCHAR (50) NULL;

GO

Ich danke Ihnen, Keith

7voto

Keith Sirmons Punkte 8083

Verwenden Sie die Schema-Ansicht, indem Sie auf Ansicht -> Datenbankschema-Ansicht klicken.

Erweitern Sie die Tabellen und ihre Spalten.

Klicken Sie mit der rechten Maustaste auf die Spalte und dann auf Refactor -> Rename...

Ändern Sie den Namen im Feld Neuer Name, wobei das Feld Vorschau der Änderungen markiert ist.

Beachten Sie, dass nicht nur der Spaltenname geändert wird, sondern auch die gespeicherten Prozeduren, die möglicherweise auf diese Spalte verweisen.

Innerhalb des Datenbankprojekts wird eine Refactorlog-Datei erstellt, die die Namensänderung anzeigt.

Wenn das neue Schema für die bestehende Datenbank bereitgestellt wird, scheint DataDude die Refactorlog-Datei und die Tabelle dbo._Refactorlog zu prüfen, um festzustellen, welche Refactors für die Datenbank verarbeitet werden müssen.

Hier ist der Code, der mit dieser Prozedur erzeugt wurde, um einen Spaltennamen zu ändern, auf den auch in einer gespeicherten Prozedur verwiesen wurde:

EXECUTE sp_rename @objname = N'[dbo].[Users].[TestF]', @newname = N'TestG', @objtype = N'COLUMN';

GO
PRINT N'Altering [dbo].[ListUsers]...';

GO
ALTER PROCEDURE [dbo].[ListUsers]

AS
    SELECT [ID], [FirstName], [LastName], [TestG]
    FROM Users
RETURN 0
GO

Keith

1voto

MJB Punkte 7569

Wenn die Tabelle klein ist, können Sie eine neue Tabelle mit den richtigen Spalten erstellen und dann von der alten Tabelle in die neue Tabelle einfügen, wobei Sie die Spalten nach und nach ändern.

Wenn die Tabelle groß ist und Sie weder die Zeit noch den Arbeitsspeicher oder den Aufwand aufbringen können, die gesamte Tabelle zu kopieren, können Sie alter table add new_column entonces update table set new_column=old_column entonces alter table drop column old_column .

Die Syntax ist natürlich vereinfacht.

1voto

John Bledsoe Punkte 16242

Die Art und Weise, wie Visual Studio Database Projects Schemaänderungen handhabt, bietet sich für diese Art von Verwirrung an. Es ist sehr schwierig für VS zu erkennen, ob Sie einfach eine Spalte umbenannt haben (und die Daten erhalten bleiben sollten) oder ob Sie die Spalte entfernt und eine andere hinzugefügt haben. Mein Unternehmen hat eine ganze Weile an einem Produkt zur Versionskontrolle von Datenbankschemata gearbeitet, das genau diese Probleme aufwies.

Letztendlich bin ich zu der Überzeugung gelangt, dass der beste Weg zur Handhabung von Schemaänderungen der ist, der von K. Scott Allen (referenziert von Jeff Atwood) . Diese Artikelserie soll Sie auf den Weg zu einer besseren Lösung für die Versionskontrolle von Datenbanken bringen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X