Ich habe ein SQL Server Data Tools (VS2012) -Projekt, das während des Erstellungsprozesses automatisch veröffentlicht wird. Eine Spalte wurde kürzlich von einem int
auf aktualisiert decimal(18,4)
. Infolge dieser Änderung schlägt die Veröffentlichung mit dem Fehler fehl
(49,1): SQL72014: .Net SqlClient-Datenprovider: Nachricht 50000, Ebene 16, Status 127, Zeile 6 Zeilen wurden erkannt. Die Schemaaktualisierung wird beendet, da möglicherweise Daten verloren gehen. (44,0): SQL72045: Skriptausführungsfehler. Das ausgeführte Skript: / * Der Typ für die Spalte QuantityReceived in Tabelle [dbo]. [Reconciliation_Receiving] ist derzeit INT NOT NULL, wird jedoch in DECIMAL (18, 4) NOT NULL geändert. Datenverlust kann auftreten. * /
WENN EXISTIERT (wählen Sie die oberste 1 1 aus [dbo]. [Reconciliation_Receiving]) RAISERROR (N'Rows wurden erkannt. Die Schemaaktualisierung wird beendet, da möglicherweise Daten verloren gehen. ', 16, 127) WITH NOWAIT Während des Batches ist ein Fehler aufgetreten ausgeführt werden.
Ich verstehe, warum ich diesen Fehler erhalte, und ich weiß, dass er durch Deaktivieren des Flags "Inkrementelle Bereitstellung blockieren, wenn Datenverlust auftreten kann" behoben werden kann. Es gibt jedoch einen starken Widerstand gegen die Deaktivierung dieser Funktion, sodass dies keine akzeptable Lösung sein wird.
Die einzige andere Lösung, die ich mir vorstellen kann, ist Folgendes:
- Erstellen Sie eine temporäre Tabelle und kopieren Sie den Inhalt der vorhandenen Tabelle in die temporäre Tabelle
- Schneiden Sie die vorhandene Tabelle ab
- Lassen Sie SSDT den Datentyp aktualisieren
- Füllen Sie die Daten aus der temporären Tabelle wieder aus
Das scheint jedoch schrecklich klobig und ineffizient.
Gibt es eine bessere Alternative?
quelle
Antworten:
Ich war versucht, diese Flagge auch zu umgehen, bin aber auf die Seite Ihrer Mitarbeiter geraten und versuche nun, diese Probleme "richtig" zu behandeln. Die (geringfügig) weniger umständliche Route besteht darin, Skripts vor und nach der Bereitstellung zu verwenden, um die Arbeit mit einer Umbenennung zu erledigen.
Abhängig von der Art des Ziels müssen Sie möglicherweise darauf achten, dass Fremdschlüsseleinschränkungen gelöscht und neu erstellt werden.
quelle
In meinem Fall habe ich eine Spalte aus einer Tabelle entfernt.
Die in dieser Antwort angegebene Lösung hat bei mir nicht funktioniert, sondern zu einem
invalid object name
Fehler bei der Veröffentlichung geführt.Ich fand, dass es notwendig war, die Zeilen aus der Tabelle zu kopieren, die Einschränkungsprüfung zu deaktivieren und die Zeilen in einem Skript vor der Bereitstellung zu löschen und die Zeilen dann wieder in die Tabelle zu kopieren, wobei die Identitätseinfügung im Skript nach der Bereitstellung aktiviert war.
In Script.PreDeployment.sql:
In Script.PostDeployment.sql
quelle