2017-10-12 5 views
1

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.

Antwort

2

Ja, Sie haben Recht, es ist Kompilierungsfehler. Wenn die Spalte nicht existiert, kann Ihr Skript nicht kompiliert werden. IF Exists und andere Datenflusskonstruktionen werden nicht analysiert.

Sie sollten Ihren Code produzieren Kompilierungsfehler in EXEC wickeln:

exec(
'INSERT INTO 
     tmp_DocumentEventCertificates 
    SELECT 
     [EventId], 
     [Thumbprint] 
    FROM 
     [DocumentEvent] 
    WHERE 
     [Thumbprint] IS NOT NULL') 
+0

Vielen Dank! Das funktioniert für mich. – Dennis

Verwandte Themen