Ich versuche, den SQL Server-Import- und -Export-Assistenten zu verwenden, um Daten von meiner Produktionsdatenbank auf meine Entwicklungsdatenbank zu kopieren, aber wenn ich dies tue, schlägt der Fehler "Die INSERT-Anweisung ist mit der FOREIGN KEY-Einschränkung in Konflikt" fehl. Ich habe über 40 Tabellen mit Lots Gibt es eine einfache Möglichkeit, mit FK-Einschränkungen umzugehen, ohne ein Drop-Einschränkungs- / Add-Constrat-Skript schreiben zu müssen?
Bearbeiten: Ich habe gerade herausgefunden, dass in der Web-Edition von SQL Server, die ich ausführe, DTS nicht zulässt, dass Sie Pakete speichern.
sp_msforeachtable
(undsp_MSForEachDb
) ist undokumentiert und wird nicht unterstützt. Sie sollten es nicht / vermeiden. Es könnte die Tabellen überspringen !! Siehe diesen Beitrag von @AaronBertrand -> sqlblog.com/blogs/aaron_bertrand/archive/2010/12/29/… und dieses Verbindungselement - (MS zeigt an, dass es nicht behoben werdenIch habe auf meinem Computer eine exakte Kopie einer Datenbank von einem Server erstellt, den ich nicht kontrollierte.
Ich bin ein Trottel , aber das habe ich getan:
Erstellt die Datenbank aus meinem Skript, das sich in der Quellcodeverwaltung befand (Hinweis, Hinweis!). Wenn Sie das Skript nicht haben, können Sie es immer aus der vorhandenen Datenbank über die
Tasks
Option generieren .Wenn bei der Erstellung automatisch Daten in YourDB eingefügt wurden , führen Sie a
DELETE FROM YourDB.dbo.tblYourTable
.DELETE
.Führen Sie dies auf Ihrem Zielserver aus:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all';
Klicken Sie mit der rechten Maustaste auf YourDB in
Object Explorer
. Klicken Sie aufTasks
->Import Data...
Die ersten Bildschirme des Assistenten sind selbsterklärend.
Aktivieren Sie auf dem
Select Source Table and Views
Bildschirm des Assistenten das Kontrollkästchen neben jeder Tabelle, die Sie kopieren möchten.Klicken Sie für jede Zeile (Tabelle) auf diesem Bildschirm darauf, damit sie hervorgehoben wird, und klicken Sie dann auf
Edit Mappings
.Klicken Sie für jede Zeile (Tabelle) auf / Häkchen
Append rows to the destination table
undEnable identity insert
.Delete rows in destination table
, schlägt dies fehl, da keinDELETE
Befehl ausgegeben wird. Es wird ein BefehlTRUNCATE
ausgegeben, der immer noch mit unseren Fremdschlüsseln in Konflikt steht, da erTRUNCATE
nicht von denNOCHECK CONSTRAINT
früheren gesteuert wird .Klicken Sie sich durch den Rest des Assistenten und klicken Sie auf
Finish
.Achten Sie auf Fehler . Warnungen können wahrscheinlich ignoriert werden.
Report
Schaltfläche und zeigen Sie den Bericht an. Versuchen Sie, und abtasten , was warSuccess
,Error
undStopped
. Möglicherweise müssen Sie die Ursache des Fehlers beheben, der in diesem Bericht enthalten ist. Dann müssen Sie wahrscheinlich eineDELETE FROM YourDB.dbo.theErrorTable
. Klicken Sie nun im Import-Assistenten auf die Schaltfläche "Zurück" und deaktivieren Sie alle Tabellen, bei denen es sich um a handelteSuccess
. Wiederholen Sie ad infinitum.Führen Sie dies auf Ihrem Zielserver aus:
USE YourDB; EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all';
Yay! :)
Vielen Dank an alle, die diese und ähnliche Fragen im SE-Netzwerk beantwortet haben, die mir dabei geholfen haben, dies herauszufinden.
quelle
Im Importassistenten können Sie zuerst die Zeilen löschen. Wenn Sie über Identitätsfelder verfügen, können Sie das Einfügen von Identitäten wie folgt aktivieren
Wenn Sie die Prüfungseinschränkung deaktivieren möchten, speichern Sie das Paket, wenn Sie vom Assistenten aufgefordert werden, es zu speichern, und bearbeiten Sie den Verbindungsmanager wie folgt:
Hinweis: Sie können die Tabelle nicht TRUNCATE, wenn Fremdschlüssel definiert sind.
quelle
Lass die Einschränkungen nicht fallen.
Speichern Sie das vom Assistenten erstellte SSIS-Paket und bearbeiten Sie es in BIDS / SSDT. Wenn Sie das Paket bearbeiten, können Sie die Reihenfolge steuern, in der die Tabellen verarbeitet werden, sodass Sie die übergeordneten Tabellen verarbeiten können. Anschließend können Sie die untergeordneten Tabellen verarbeiten, wenn alle übergeordneten Tabellen fertig sind.
quelle
Probleme wie dieses zeigen uns, dass die Leute, die SQL Server herstellen, ihr Produkt noch nie benutzt haben. Dies ist eine so krasse Lücke, dass man sich fragen muss, was sie einfach vergessen haben, um es richtig zu machen (ich habe eine Liste von ungefähr 30 anderen verrückten Problemen wie diesen, die ich überwinden musste, um diese Arbeit so zu machen, wie andere DBs es tun) der Box, einschließlich der Tatsache, dass wir einen miesen Assistenten benötigen, um dies zu tun [wenn ich die Zeit hatte, die ich darauf gewartet habe, dass dieser Assistent jedes Mal die gleichen Tabellen für dieselbe DB verbindet und auflistet, zurück ... Ich hätte Zeit für einen schönen Urlaub]).
Ich bin sehr faul und möchte nicht tippen
EXEC sp_msforeachtable ...
zweimal jedes Mal, wenn ich das tue. Meine Aufgabe bestand darin, die Einschränkungen auf dem Produktionsserver zu belassen und sie vom Entwicklungsserver zu entfernen. Dies verhindert den Fehler, aber diese Methode hat einige SEHR GROSSE Nebenwirkungen. Erstens können Sie nicht mehr nur eine vollständige Sicherung auf Ihrem Entwicklungsserver wiederherstellen (es sei denn, Sie sind in der Lage, sie alle wieder zu entfernen). Zweitens funktioniert dies am besten, wenn Sie sicher sind, dass die Konsumenten Ihrer Daten diese Einschränkungen auch durchsetzen (oder sich nicht darum kümmern). In meinem Fall haben wir nur einen Verbraucher (unsere Website), daher haben wir diese Einschränkungen auch in den Site-Code integriert (dh bevor wir einen Benutzerdatensatz löschen, löschen wir zuerst alle Telefondatensätze für diesen Benutzer). Ja, Dies macht Einschränkungen in erster Linie überflüssig und verdoppelt die Arbeit, die ich zu erledigen habe, gibt mir aber auch die Möglichkeit zu überprüfen, ob mein Code mit oder ohne DBMS-basierte Einschränkungen funktioniert (Tatsache ist, dass sie sich noch auf dem Produkt befinden) Server nur als Notfallplan). Sie könnten dies als einen Fehler in meinem Design bezeichnen, aber ich würde es lieber als Problemumgehung für ein fehlerhaftes DBMS bezeichnen. In jedem Fall ist dies immer noch schneller und einfacher als in MSSQL, da es nicht in der Lage ist, mit seinem eigenen Design fertig zu werden.quelle
Ich denke, Sie können keine Sicherung und Wiederherstellung vom Produktionsserver durchführen, da es sich um wichtige Daten handelt. Nun, ohne die richtigen Rechte wird es wirklich komplizierter. Aber wenn Sie db backup n restore richtig haben, können Sie es ausführen.
Eine Möglichkeit, die ich jedoch empfehlen würde, besteht darin, alle Ihre Einschränkungen und Indizes zu löschen und sie dann erneut hinzuzufügen, sobald die Daten importiert oder exportiert wurden.
Keine genaue Antwort, wird aber schnell verarbeitet.
quelle
Lies einfach dieses Thema. Es ist ein alter Beitrag, aber hier ist, was ich getan habe, um zukünftigen Leuten beim Lesen zu helfen.
In meinem Fall wollte ich in eine leere identische Tabelle importieren. Beim Bearbeiten des Mappings wähle ich
<ignore>
als Primärschlüssel. Alle meine Inhalte werden automatisch hinzugefügt.Hoffe es hilft jemandem
quelle