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?

War es hilfreich?

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 fehlt

     

Innerhalb 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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top