Werden das Deaktivieren und Aktivieren von Fremdschlüsseleinschränkungen in SQL Server unterstützt? Oder ist meine einzige Option, drop
und dann re-create
die Zwänge?
sql-server
tsql
foreign-keys
constraints
Strahl
quelle
quelle
Antworten:
Wenn Sie alle Einschränkungen in der Datenbank deaktivieren möchten, führen Sie einfach diesen Code aus:
Um sie wieder einzuschalten, führen Sie Folgendes aus: (Der Druck ist natürlich optional und listet nur die Tabellen auf.)
Ich finde es nützlich, wenn Daten von einer Datenbank in eine andere gefüllt werden. Es ist ein viel besserer Ansatz als das Löschen von Einschränkungen. Wie Sie bereits erwähnt haben, ist es praktisch, wenn Sie alle Daten in der Datenbank ablegen und neu füllen (z. B. in einer Testumgebung).
Wenn Sie alle Daten löschen, ist diese Lösung möglicherweise hilfreich.
Manchmal ist es auch praktisch, alle Trigger zu deaktivieren. Die vollständige Lösung finden Sie hier .
quelle
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Sollte es dort nur einen "CHECK" geben?http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
quelle
Um die Einschränkung zu deaktivieren, haben Sie
ALTER
die Tabelle mit NOCHECKSo können Sie double CHECK verwenden :
Wenn Sie den Status nach Abschluss überprüfen müssen, verwenden Sie dieses Skript, um den Einschränkungsstatus aufzulisten. Wird sehr hilfreich sein:
quelle
sys.sysforeignkeys
msdn.microsoft.com/en-us/library/ms177604.aspxAm besten lassen Sie Fremdschlüsseleinschränkungen fallen und erstellen sie.
Ich habe in diesem Beitrag keine Beispiele gefunden, die für mich "wie sie sind" funktionieren würden. Eines würde nicht funktionieren, wenn Fremdschlüssel auf andere Schemas verweisen, das andere würde nicht funktionieren, wenn Fremdschlüssel auf mehrere Spalten verweisen. Dieses Skript berücksichtigt sowohl mehrere Schemas als auch mehrere Spalten pro Fremdschlüssel.
Hier ist das Skript, das "ADD CONSTRAINT" -Anweisungen generiert. Bei mehreren Spalten werden diese durch Komma getrennt ( speichern Sie diese Ausgabe unbedingt, bevor Sie DROP-Anweisungen ausführen ):
Hier ist das Skript, das "DROP CONSTRAINT" -Anweisungen generiert:
quelle
Der SQL-92-Standard ermöglicht es, eine Konstante als DEFERRABLE zu deklarieren, damit sie im Rahmen einer Transaktion (implizit oder explizit) zurückgestellt werden kann. Leider fehlt SQL Server diese SQL-92-Funktionalität immer noch.
Für mich ist das Ändern einer Einschränkung in NOCHECK mit dem Ändern der Datenbankstruktur im laufenden Betrieb vergleichbar - das Löschen von Einschränkungen ist sicherlich - und etwas, das vermieden werden sollte (z. B. Benutzer benötigen erhöhte Berechtigungen).
quelle
Ich stimme dir zu, Hamlin. Wenn Sie Daten mit SSIS übertragen oder Daten replizieren möchten, müssen Sie die Fremdschlüsseleinschränkungen vorübergehend deaktivieren oder löschen und sie dann erneut aktivieren oder neu erstellen. In diesen Fällen ist die referenzielle Integrität kein Problem, da sie bereits in der Quellendatenbank verwaltet wird. Daher können Sie sich in dieser Angelegenheit sicher sein.
quelle
quelle
WITH CHECK CHECK
ist mit ziemlicher Sicherheit erforderlich!Dieser Punkt wurde in einigen Antworten und Kommentaren angesprochen, aber ich halte es für wichtig genug, ihn erneut hervorzuheben.
Das erneute Aktivieren einer Einschränkung mit dem folgenden Befehl (nein
WITH CHECK
) weist einige schwerwiegende Nachteile auf .Hinweis: WITH NOCHECK ist die Standardeinstellung zum erneuten Aktivieren von Einschränkungen. Ich muss mich fragen warum ...
Die Systemansicht sys.foreign_keys bietet einen Einblick in das Problem. Beachten Sie, dass es sowohl eine
is_disabled
als auch eineis_not_trusted
Spalte hat.is_disabled
Gibt an, ob zukünftige Datenmanipulationsvorgänge anhand der Einschränkung validiert werden.is_not_trusted
Gibt an, ob alle aktuell in der Tabelle enthaltenen Daten anhand der Einschränkung überprüft wurden.Sind Ihre Einschränkungen vertrauenswürdig? Rausfinden...
quelle
Erster Beitrag :)
Für das OP funktioniert die Lösung von kristof, es sei denn, es gibt Probleme mit massiven Daten- und Transaktionsprotokoll-Ballons bei großen Löschvorgängen. Selbst wenn tlog-Speicherplatz zur Verfügung steht, kann der Vorgang für Tabellen mit Hunderten von Millionen Zeilen SEHR lange dauern, da das Schreiben in das tlog gelöscht wird.
Ich verwende eine Reihe von Cursorn, um große Kopien einer unserer riesigen Produktionsdatenbanken häufig abzuschneiden und neu zu laden. Die von der Lösung entwickelten Konten berücksichtigen mehrere Schemas, mehrere Fremdschlüsselspalten und können am besten für die Verwendung in SSIS ausgesondert werden.
Dabei werden drei Staging-Tabellen (echte Tabellen) für die DRK-, CREATE- und CHECK-FK-Skripte erstellt, diese Skripte erstellt und in die Tabellen eingefügt und anschließend die Tabellen durchlaufen und ausgeführt. Das angehängte Skript besteht aus vier Teilen: 1.) Erstellen und Speichern der Skripte in den drei (realen) Staging-Tabellen, 2.) Ausführen der Drop-FK-Skripte über einen Cursor nacheinander, 3.) Verwenden von sp_MSforeachtable zum Abschneiden aller andere Tabellen in der Datenbank als unsere drei Staging-Tabellen und 4.) Ausführung der FK-Erstellung und Überprüfung der FK-Skripte am Ende Ihres ETL-SSIS-Pakets.
Führen Sie den Skripterstellungsteil in einer Task "SQL ausführen" in SSIS aus. Führen Sie den Teil "FK-Skripte ausführen" in einer zweiten SQL-Task ausführen aus. Fügen Sie das Kürzungsskript in eine dritte Execute SQL-Aufgabe ein und führen Sie dann alle anderen ETL-Prozesse aus, die Sie ausführen müssen, bevor Sie die CREATE- und CHECK-Skripte in eine letzte Execute SQL-Aufgabe (oder zwei, falls gewünscht) am Ende Ihres Kontrollflusses einfügen.
Das Speichern der Skripte in realen Tabellen hat sich als von unschätzbarem Wert erwiesen, wenn die erneute Anwendung der Fremdschlüssel fehlschlägt, da Sie * aus sync_CreateFK auswählen, in Ihr Abfragefenster kopieren / einfügen, einzeln ausführen und die Datenprobleme beheben können, sobald Sie dies tun Finden Sie diejenigen, die fehlgeschlagen sind / sich immer noch nicht erneut bewerben.
Führen Sie das Skript nicht erneut aus, wenn es fehlschlägt, ohne sicherzustellen, dass Sie zuvor alle Fremdschlüssel / Überprüfungen erneut angewendet haben. Andernfalls verlieren Sie höchstwahrscheinlich die Erstellung und Überprüfung der fk-Skripterstellung, wenn unsere Staging-Tabellen gelöscht werden und vor der Erstellung der auszuführenden Skripte neu erstellt.
quelle
Finden Sie die Einschränkung
Führen Sie die von dieser SQL generierte SQL aus
Safeway.
Hinweis: Es wurde eine Lösung zum Löschen der Einschränkung hinzugefügt, sodass die Tabelle ohne Einschränkungsfehler gelöscht oder geändert werden kann.
quelle
Klicken Sie mit der rechten Maustaste auf das Tabellendesign, gehen Sie zu Beziehungen und wählen Sie den Fremdschlüssel im linken Bereich aus. Setzen Sie im rechten Bereich die Option Fremdschlüsseleinschränkung erzwingen auf 'Ja' (um Fremdschlüsseleinschränkungen zu aktivieren) oder 'Nein' (auf deaktiviere es).
quelle
Die mit '905' gekennzeichnete Antwort sieht gut aus, funktioniert aber nicht.
Das Folgende hat bei mir funktioniert. Einschränkungen für Primärschlüssel, eindeutige Schlüssel oder Standardeinstellungen können NICHT deaktiviert werden. Wenn 'sp_helpconstraint' in status_enabled 'n / a' anzeigt, bedeutet dies, dass es NICHT aktiviert / deaktiviert werden kann.
- Um ein Skript für DISABLE zu generieren
- Um ein Skript für ENABLE zu generieren
quelle
Sie sollten in der Lage sein, Fremdschlüsseleinschränkungen auf dieselbe Weise zu deaktivieren, wie Sie andere Einschränkungen vorübergehend deaktivieren:
Stellen Sie einfach sicher, dass Sie die Einschränkung für die erste Tabelle deaktivieren, die im Namen der Einschränkung aufgeführt ist. Wenn meine Fremdschlüsseleinschränkung beispielsweise FK_LocationsEmployeesLocationIdEmployeeId war, möchte ich Folgendes verwenden:
Auch wenn ein Verstoß gegen diese Einschränkung zu einem Fehler führt, der diese Tabelle nicht unbedingt als Quelle des Konflikts angibt.
quelle
Ein Skript, das sie alle regiert: Dies kombiniert Befehle zum Abschneiden und Löschen mit sp_MSforeachtable, damit Sie das Löschen und Neuerstellen von Einschränkungen vermeiden können. Geben Sie einfach die Tabellen an, die gelöscht und nicht abgeschnitten werden müssen, und für meine Zwecke habe ich einen zusätzlichen Schemafilter hinzugefügt Maßnahme (getestet in 2008r2)
quelle
Sie können Einschränkungen für Ihre Tabellen vorübergehend deaktivieren, arbeiten und sie dann neu erstellen.
Hier ist eine einfache Möglichkeit, dies zu tun ...
Deaktivieren Sie alle Indizes, einschließlich der Primärschlüssel, wodurch alle Fremdschlüssel deaktiviert werden, und aktivieren Sie dann nur die Primärschlüssel erneut, damit Sie mit ihnen arbeiten können ...
[Mach etwas wie das Laden von Daten]
Aktivieren Sie dann die Indizes erneut und erstellen Sie sie neu ...
quelle
@sql
immer abgeschnitten. :(Ich habe eine nützlichere Version, wenn Sie interessiert sind. Ich habe ein bisschen Code von hier auf eine Website gehoben, auf der der Link nicht mehr aktiv ist. Ich habe es geändert, um ein Array von Tabellen in der gespeicherten Prozedur zuzulassen, und es füllt die Anweisungen zum Ablegen, Abschneiden und Hinzufügen, bevor alle ausgeführt werden. Auf diese Weise können Sie steuern, welche Tabellen abgeschnitten werden müssen.
quelle