Désactiver temporairement les contraintes (MS SQL)

je cherche un moyen de désactiver temporairement toutes les contraintes de la base de données (par exemple les relations de table).

je dois copier (en utilisant des INSERTs) les tables D'une DB à une autre DB. Je sais que je peux y arriver en exécutant des commandes dans l'ordre approprié (pour ne pas briser les relations).

mais ce serait plus facile si je pouvais désactiver temporairement les contraintes de vérification et les remettre en marche après la fin de l'opération.

est-ce possible?

183
demandé sur Mark Chackerian 2009-04-10 13:04:51

5 réponses

vous pouvez désactiver FK et vérifier les contraintes uniquement en SQL 2005+ . Voir ALTER TABLE 151970920"

ALTER TABLE foo NOCHECK CONSTRAINT ALL

ou

ALTER TABLE foo NOCHECK CONSTRAINT CK_foo_column

les clés primaires et les contraintes uniques ne peuvent pas être désactivées, mais cela devrait être correct si je vous ai compris correctement.

200
répondu gbn 2011-06-22 14:53:52
-- 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'
---------------------------------------------------------
166
répondu Donal 2016-10-09 12:37:59

et, si vous voulez vérifier que vous N'avez pas rompu vos relations et introduit des orphelins, une fois que vous avez réarmé vos chèques, i.e.

ALTER TABLE foo CHECK CONSTRAINT ALL

ou

ALTER TABLE foo CHECK CONSTRAINT FK_something

alors vous pouvez revenir en arrière et faire une mise à jour contre n'importe quelles colonnes vérifiées comme ainsi:

UPDATE myUpdatedTable SET someCol = someCol, fkCol = fkCol, etc = etc

et toute erreur à ce moment-là sera due à l'incapacité de respecter les contraintes.

55
répondu Michael K. Campbell 2011-06-22 14:54:23

vous pouvez en fait désactiver toutes les contraintes de base de données dans une seule commande SQL et les réactiver en appelant une autre commande unique. Voir:

je travaille actuellement avec SQL Server 2005 mais je suis presque sûr que cette approche a fonctionné avec SQL 2000 aussi bien

16
répondu kristof 2017-05-23 12:17:57

désactiver et activer toutes les clés étrangères

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

tout d'abord, le curseur de foreignKeyCursor est déclaré comme la déclaration SELECT qui rassemble la liste des clés étrangères et leurs noms de table. Ensuite, l' curseur est ouvert et l'EXTRACTION initiale instruction est exécutée. Ce FETCH déclaration Lira les données de la première rangée dans le local variables @foreignKeyName et @tableName. En boucle à travers un curseur, vous peut vérifier le @@FETCH_STATUS pour une valeur de 0, qui indique que le fetch a réussi. Cela signifie que la boucle continuer à aller de l'avant de sorte qu'il peut obtenir chaque clé étrangère à partir de l'ensemble de lignes. @@FETCH_STATUS est disponible pour tous les curseurs connexion. Donc, si vous êtes en boucle à travers plusieurs curseurs, il est important de vérifier la valeur de @@FETCH_STATUS dans la déclaration immédiatement après la déclaration FETCH. @@FETCH_STATUS reflètera le statut de la plus récente Opération FETCH sur la connexion. Les valeurs valides pour @@FETCH_STATUS sont:

0 = FETCH a réussi

-1 = FETCH a été infructueux

-2 = la ligne qui a été récupérée est manquante

dans la boucle, le code construit la commande ALTER TABLE différemment selon que l'intention est de désactiver ou d'activer l'étranger contrainte clé (en utilisant le mot-clé CHECK ou NOCHECK). Le l'énoncé est ensuite imprimé comme un message pour que son progrès puisse être observé et puis le instruction est exécutée. Enfin, lorsque toutes les lignes ont été réitéré la procédure stockée ferme et désalloque le curseur.

voir Désactivation des Contraintes et des Déclencheurs à partir de MSDN Magazine

2
répondu 0x49D1 2014-09-24 15:21:04