Schalten Sie Einschränkungen vorübergehend (MS SQL)
-
09-09-2019 - |
Frage
Ich bin für einen Weg suchen, vorübergehend alle DB Einschränkungen (zB Tabellenbeziehungen) auszuschalten.
Ich brauche eine DB-Tabellen auf einem anderen DB kopieren (einschleifen). Ich weiß, ich kann das erreichen, indem er Befehle in der richtigen Reihenfolge (um nicht zu brechen Beziehungen) ausgeführt wird.
Aber es wäre einfacher, wenn ich ausschalten könnte es prüft Einschränkungen vorübergehend und wieder einschalten, nachdem der Betrieb des Ende.
Ist das möglich?
Lösung
Sie können FK deaktivieren und CHECK-Einschränkungen nur in SQL 2005 + . Siehe TABLE ALTER
ALTER TABLE foo NOCHECK CONSTRAINT ALL
oder
ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column
Primärschlüssel und eindeutige Einschränkungen können nicht deaktiviert werden, aber das sollte in Ordnung sein, wenn ich Dich richtig verstanden habe.
Andere Tipps
-- Disable the constraints on a table called tableName:
ALTER TABLE tableName NOCHECK CONSTRAINT ALL
-- Re-enable the constraints on a table called tableName:
ALTER TABLE tableName WITH CHECK CHECK CONSTRAINT ALL
---------------------------------------------------------
-- Disable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
-- Re-enable constraints for all tables:
EXEC sp_msforeachtable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'
---------------------------------------------------------
Und wenn Sie überprüfen möchten, dass Sie Ihre Beziehungen nicht gebrochen haben und eingeführt Waisen, sobald Sie Ihre Schecks neu bewaffnet, d.
ALTER TABLE foo CHECK CONSTRAINT ALL
oder
ALTER TABLE foo CHECK CONSTRAINT FK_something
, dann können Sie wieder in ausführen und ein Update tun gegen jede Spalten geprüft etwa so:
UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc
Und Fehler an diesem Punkt wird wegen des Ausfalls sein Einschränkungen gerecht zu werden.
Sie können tatsächlich alle Datenbankbeschränkungen in einer einzigen SQL-Befehl deaktivieren und die Wieder ermöglichen ihnen einen anderen einzigen Befehl aufrufen. Siehe auch:
Zur Zeit arbeite ich mit SQL Server 2005, aber ich bin mir fast sicher, dass dieser Ansatz mit SQL 2000 und arbeitete
Deaktivieren und Aktivieren aller Fremdschlüssel
CREATE PROCEDURE pr_Disable_Triggers_v2
@disable BIT = 1
AS
DECLARE @sql VARCHAR(500)
, @tableName VARCHAR(128)
, @tableSchema VARCHAR(128)
-- List of all tables
DECLARE triggerCursor CURSOR FOR
SELECT t.TABLE_NAME AS TableName
, t.TABLE_SCHEMA AS TableSchema
FROM INFORMATION_SCHEMA.TABLES t
ORDER BY t.TABLE_NAME, t.TABLE_SCHEMA
OPEN triggerCursor
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @sql = 'ALTER TABLE ' + @tableSchema + '.[' + @tableName + '] '
IF @disable = 1
SET @sql = @sql + ' DISABLE TRIGGER ALL'
ELSE
SET @sql = @sql + ' ENABLE TRIGGER ALL'
PRINT 'Executing Statement - ' + @sql
EXECUTE ( @sql )
FETCH NEXT FROM triggerCursor INTO @tableName, @tableSchema
END
CLOSE triggerCursor
DEALLOCATE triggerCursor
Als erstes wird der foreignKeyCursor Cursor als die SELECT-Anweisung deklariert dass sammelt die Liste der Fremdschlüssel und deren Tabellennamen. Als nächstes wird die Cursor wird geöffnet, und die anfängliche FETCH Anweisung ausgeführt wird. Diese FETCH-Anweisung wird die erste Zeile der Daten in das lokale lesen Variablen @foreignKeyName und @tableName. Beim Durchschleifen eines Cursor können Sie die @@ FETCH_STATUS für einen Wert von 0, überprüfen Sie die zeigt an, dass der Abruf erfolgreich war. Dies bedeutet, wird die Schleife weiter nach vorne bewegen, so kann jeden folgenden Fremdschlüssel erhalten aus dem Rowset. @@ ist FETCH_STATUS für alle Cursor auf dem zur Verfügung stehenden Verbindung. Also, wenn Sie über mehrere Cursor werden Looping, es ist wichtig, den Wert von @@ FETCH_STATUS in der Mitteilung zu überprüfen im Anschluss an die unmittelbar FETCH-Anweisung. @@ FETCH_STATUS reflektiert der Status für die letzten FETCH-Operation auf der Verbindung. Gültige Werte für @@ FETCH_STATUS sind:
0 = FETCH erfolgreich war
-1 = FETCH war nicht erfolgreich
-2 = die Zeile, die abgerufen wurde fehltInnerhalb der Schleife baut der Code den ALTEN TABLE-Befehl anders Je nachdem, ob die Absicht ist es, die ausländischen zu deaktivieren oder aktivieren Schlüsselbedingung (die CHECK oder NOCHECK Schlüsselwort). Die Aussage ist dann als Meldung gedruckt, so seinen Fortschritt zu beobachten ist und anschließend die Anweisung ausgeführt wird. Schließlich, wenn alle Zeilen wiederholt worden durch die gespeicherte Prozedur schließt und freigibt den Cursor.
finden Sie unter Deaktivieren Einschränkungen und Triggern von MSDN Magazine