In meinem SSDT-Projekt gibt es einige Datenmigrationsskripts.Fehler "Ungültiger Spaltenname" bei Verwendung von Datenmigrationsskripten
Zuerst speichert man Daten aus einer Tabelle in einer anderen temporären Tabelle:
IF EXISTS
(
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = N'DocumentEvent'
AND column_name = N'Thumbprint'
)
BEGIN
IF NOT EXISTS
(
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'tmp_DocumentEventCertificates'
)
BEGIN
CREATE TABLE tmp_DocumentEventCertificates
(
[EventId] UNIQUEIDENTIFIER NOT NULL,
[Thumbprint] nvarchar(100)
)
END
INSERT INTO
tmp_DocumentEventCertificates
SELECT
[EventId],
[Thumbprint]
FROM
[DocumentEvent]
WHERE
[Thumbprint] IS NOT NULL
END
Zweite einer überträgt Datum von temporärer Tabelle zu einer anderen Tabelle:
IF EXISTS
(
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N'tmp_DocumentEventCertificates'
)
BEGIN
UPDATE
[DocumentAttachment]
SET
[DocumentAttachment].[Certificate_Thumbprint] = tmp.[Thumbprint]
FROM
tmp_DocumentEventCertificates AS tmp
WHERE
([DocumentAttachment].[EventId] = tmp.[EventId]) AND
([DocumentAttachment].[ParentDocumentAttachmentId] IS NOT NULL)
DROP TABLE tmp_DocumentEventCertificates
END
Spalte [Thumbprint]
aus [DocumentEvent]
Tabelle entfernt wird.
Spalte [Certificate_Thumbprint]
wird zu [DocumentAttachment]
Tabelle hinzugefügt. Die Daten müssen von [DocumentEvent].[Thumbprint]
zu [DocumentAttachment].[Certificate_Thumbprint]
übertragen werden.
Diese Skripte wie erwartet funktioniert, wenn Datenbank in dem Zustand befindet, der von oben Migration erfordert, das heißt, [DocumentEvent].[Thumbprint]
existiert, und [DocumentAttachment].[Certificate_Thumbprint]
nicht existieren.
Wenn jedoch die Datenbank migriert wird, schlagen alle Versuche zur Bereitstellung von dacpac fehl, da Fehler "Ungültiger Spaltenname 'Thumbprint'" ist.
Ich bin mir fast sicher, dass dies passiert, weil SQLCMD versucht, Deploy-Skript im Ganzen zu kompilieren, und dies konnte nur erfolgreich durchgeführt werden, wenn [DocumentEvent].[Thumbprint]
existiert.
Aber was ist die Problemumgehung?
Sieht aus wie IF EXISTS
im ersten Skript kann nicht helfen.
Vielen Dank! Das funktioniert für mich. – Dennis