2017-02-06 4 views
3

Ich habe eine Pipeline und zwei verknüpfte Dienste erstellt, um Daten von einer zentralen Instanz von SQL Server in eine Azure Sql-Instanz zu verschieben. Das Problem, auf das ich gestoßen bin, ist, dass wir eine Tabelle "Tabelle-1" in unserem On-Prem mit einer Identity (1,1) -Spalte haben, der eine sequentielle ID fehlt (zB die Werte sind 1, 2, 3, 4) , 6). Wenn die Pipeline ausgeführt wird, versucht sie, die Zeilen mit den IDs 1, 2, 3, 4, 5 einzufügen, was ein großes Problem darstellt, da ID 6 ein Fremdschlüssel in einer anderen Tabelle "Tabelle-2" ist und jetzt nicht existiert , so dass die Bewegung von Daten zu Tabelle 2 mit SQL Error 547 fehlschlägt (Insert-Anweisung, die mit der Fremdschlüsseleinschränkung in Konflikt steht).Azure Data Factory Identitätsspalte mit Lücken kopieren

Die richtige Sache in meinem Kopf wäre, diese Spalte keine Identität zu machen, aber das ist jetzt keine Option für mich, da der App-Code, der Datensätze erstellt, erwartet, dass Spalte automatisch generiert wird.

Gibt es einen anderen Weg, als Data Factory nicht zu verwenden? Ich würde gerne sehen, dass es identity_insert für Tabellen mit einer Identity-Spalte automatisch ein- und ausschaltet, und obwohl ich weiß, dass diese Tabellen einzeln verarbeitet werden müssten, wäre die Option nett und würde meine Beziehungen nicht zerstören.

Edit: Per wBob Vorschlag, Ich habe auch eine Feature-Anfrage (wenn Sie darüber abstimmen Pflege) hier: https://feedback.azure.com/forums/270578-data-factory/suggestions/17996950-add-support-for-maintaining-identity-column-values

+0

Ich glaube, ich in der Lage sein, kann nur ein Skript zu schreiben, für jede Tabelle der Tabellendaten über als Teil der Pipeline-Definition für diese Tabellen mit einer Identitätsspalte zu bewegen ... –

Antwort

1

Azure Daten Fabrik nativ unterstützt nicht die Identität Eigentum von Tabellen Ein- oder Ausschalten, sondern zwei Problemumgehungen fallen mir ein.

  1. Verwenden Sie Data Fabrik, die Daten in einem Staging-Tabelle zu laden (wo Identität Eigenschaft nicht festgelegt), dann verwenden Sie eine Stored Proc Aufgabe, eine gespeicherte Prozedur aufzurufen, wo Sie viel strengere Kontrolle haben, einschließlich der Fähigkeit, die Identität Eigenschaft festlegen an oder aus.
  2. Wenn Sie die Azure SQL-Datenbank (oder SQL Server auf einer VM) verwenden, können Sie Tabellenwerte verwenden und Ihre Daten so in die gespeicherte Prozedur übergeben, dass die Staging-Tabelle übersprungen wird. Diese Technik funktioniert nicht mit Azure SQL Data Warehouse. Ich würde das wahrscheinlich nicht für hohe Lautstärke empfehlen. Diese example zeigt, wie:

https://github.com/Microsoft/azure-docs/blob/master/includes/data-factory-sql-invoke-stored-procedure.md

Ich habe nicht in der Lage gewesen, diese zu testen, aber glaube, dass sie funktionieren würden. Lassen Sie es mich wissen, wenn Sie Probleme haben.

+0

Welchen Ansatz haben Sie gewählt? – wBob

1

Ich akzeptierte die Antwort von wBob, wollte aber ein bisschen mehr ins Detail bringen, was ich getan habe.

Ich hatte wahrscheinlich 100 Tabellen mit allen möglichen Abhängigkeiten und Identitäten. Also hier sind die Schritte, die ich durchgeführt, um die Daten in azur zu erhalten:

  1. eine Pipeline erstellen, um alle Tabellen ohne Identität rücken und sich keine Abhängigkeiten, durch Abfragen sys.tables gefunden:

    select * 
    from sys.tables t 
    where not exists (
        select * 
        from sys.columns c 
        where c.object_id = t.object_id 
        and is_identity = 1 
    ) 
    

    und stieß die Ergebnisse hier gegen die Ergebnisse von sp_msdependencies mit dem oType = 8. Ich nahm dann alle Tabellen in dieser Ergebnismenge, wo oSequence = 1 (keine Abhängigkeiten) und legte diese Tabellen in die Pipeline und führte es aus.

  2. Ich erstellte ein Staging-Schema und neu erstellt alle Tabellen mit einer Identitätsspalte (gefunden durch Entfernen der 'nicht' in der Abfrage in (1.), und es gab über 60 von ihnen) und entfernt die Identitätsspezifikation, wenn sie erstellt werden.

  3. Ich habe dann eine andere Daten Factory-Pipeline erstellt, um die Daten in diese Staging-Tabellen zu verschieben.

  4. Es gab eine Reihe von 'into into'-Anweisungen, um die Daten von den Staging-Tabellen in ihre identitätsbeladenen Gegenstücke zu verschieben, wobei identity_insert jedes Mal ein- und ausgeschaltet wurde. HINWEIS: Hier musste ich auch das sp_msdependencies-Ergebnis beachten, um keine fremden Fehler zu erhalten

  5. Erstellt eine Data Factory-Pipeline, um die verbleibenden Tabellen zu verschieben.

Puh ...

+0

Danke für das Update. Klingt so, als ob Sie einen anstrengenden Tag hatten:) Ziehen Sie in Erwägung, eine Feedback-Anfrage [hier] (https://feedback.azure.com/forums/270578-data-factory) für die Identitätsunterstützung in Data Factory zu machen. – wBob

+0

Danke wBob, nur die Idee dort hinzugefügt –

Verwandte Themen