So sichern und Wiederherstellen einer einzelnen Tabelle mit Fremdschlüsseln mit SQL server

Ich habe einen Tisch in einer database:

  • Mein Tisch

Andere haben Fremdschlüsselbeschränkungen für die Id-Spalte von MyTable:

  • MyOtherTable1
  • MyOtherTable2

Ich muss MyTable sichern, wie es ist.

Die Aufgabe, die ich machen werde, ist eine datakonvertierung. Während die dataumwandlung in QA funktioniert, erfordert unsere Änderungssteuerung, dass wir einen Rollbackprozess haben müssen. Ich habe nicht vor, eigentlich den Tisch wiederherzustellen, wie es ist, aber ich muss beweisen, dass ich kann, bevor ich mich ändern kann.

Das System ist ein Live-Order-System. Ich kann die ganze database nicht wiederherstellen, weil viele Aufträge zwischen dem timepunkt der Änderung und dem, wenn ich weiß, ob ich mich wiederherstellen muss, durchlaufen wird.

Ich habe schon herausgefunden, wie man den Tisch sichert.

SELECT * INTO MyTable_Bak FROM MyTable; 

Die Wiederherstellung der Tabelle funktioniert jedoch nicht. Ich kann das nicht tun:

 DELETE FROM MyTable SELECT * INTO MyTable FROM MyTable_Bak; 

Das obige scheitert an Fremdschlüsselbeschränkungen.

Ich bin nicht auf der search nach einem $ oftware. Ich weiß, dass das Rote Tor und andere Werkzeuge das tun können.

Die mir zur Verfügung stehenden Werkzeuge sind:

  • SQL Management Studio
  • Admin-permissions für die database

Zusätzliche Anforderungen

  • Die data in jeder Spalte sind nach der Wiederherstellung identisch. Id, Termine, etc.
  • Der Tisch kann nicht fallen gelassen werden
  • Zeilen in MyOtherTable1 oder MyOtherTable2 können nicht geändert oder gelöscht werden.

Anmerkung: Mit dieser ausführlichen Frage entdeckte ich die kleineren Teile dieses Problems eins nach dem anderen, als ich die Frage schrieb und jedes Problem separat triggerse. Habe ich die Frage und beantworte es selbst oder lösche es? Da ich keine ähnliche Frage und Antwort gefunden habe, werde ich es behalten.

   

Antwort von hier: http://www.rhyous.com/2017/03/14/back-up-and-restore-a-single-table-with-foreign-keys-using-sql-server/

Teil 2 – Wiederherstellen der Tabelle

Schritt 1 – Finden der Fremdschlüssel-Einschränkungen

 SELECT Name, Object_Name(parent_object_id) as [Table] FROM sys.foreign_keys WHERE referenced_object_id = object_id('MyTable') 

Die Ergebnisse waren so:

 Name Table FKDDED6AECAD1D93C0 MyOtherTable1 FK166B6670AD1D93C0 MyOtherTable2 

Schritt 2 – Holen Sie sich den Drop und Erstellen für jeden Fremdschlüssel

In SQL server Management Studio Express ging ich zu jedem Tisch in der obigen list und tat folgendes:

  • searchn Sie den Fremdschlüssel unter database | MyDb | Tische | dbo.MyTable | Schlüssel
  • Klicken Sie mit der rechten Maustaste auf den Fremdschlüssel und wählen Sie Skriptschlüssel als | aus Drop und Create to | Zwischenablage
  • Fügen Sie diese in das Abfragefenster ein.
  • Löschen Sie die USING-MyDb-statement und trennen Sie die DROP-statement aus den beiden ALTER TABLE-statementen.
  • Wiederholen Sie für die nächste Fremdschlüssel-Einschränkung, gruppieren Sie die DROP-statementen und die ALTER TABLE-statementen zusammen.

Schritt 3 – Führen Sie die DROP-statementen aus

Führen Sie die beiden oben beschriebenen DROP-statementen aus.

 ALTER TABLE [dbo].[MyOtherTable1] DROP CONSTRAINT [FKDDED6AECAD1D93C0] ALTER TABLE [dbo].[MyOtherTable2] DROP CONSTRAINT [FK166B6670AD1D93C0] 

Schritt 4 – Wiederherstellen der Tabelle

Ich habe diese Abfrage verwendet, um die Tabelle aus dem Backup wiederherzustellen.

 SELECT * FROM MyTable SET IDENTITY_INSERT dbo.MyTable ON; TRUNCATE TABLE MyTable ; INSERT INTO MyTable (Id, Col1, Col2, Col3) -- Specify all columns here SELECT (Id, Col1, Col2, Col3) -- Specify all columns again here FROM MyTable_Bak 

Schritt 5 – Wiederherstellen der Fremdschlüssel-Einschränkungen

Führen Sie die ALTER TABLE-Skripts aus, die Sie aus Schritt 2 zusammengefasst haben.

 ALTER TABLE [dbo].[MyOtherTable2] WITH CHECK ADD CONSTRAINT [FKDDED6AECAD1D93C0] FOREIGN KEY([MyTableId]) REFERENCES [dbo].[MyTable] ([Id]) ALTER TABLE [dbo].[MyOtherTable2] CHECK CONSTRAINT [FKDDED6AECAD1D93C0] ALTER TABLE [dbo].[MyOtherTable2] WITH CHECK ADD CONSTRAINT [FK166B6670AD1D93C0] FOREIGN KEY([MyTableId]) REFERENCES [dbo].[MyTable] ([Id]) ALTER TABLE [dbo].[MyOtherTable2] CHECK CONSTRAINT [FK166B6670AD1D93C0] 

Ihr Tisch wird wiederhergestellt.

Wenn du von einem besseren path kenne, der nicht wünscht, lass es mich wissen.