Desabilitando e habilitando todas as chaves estrangeiras
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
Primeiro, o cursor ForeignKeyCursor é declarado como a instrução SELECT que reúne a lista de chaves estrangeiras e seus nomes de tabela. Em seguida, o cursor é aberto e a instrução FETCH inicial é executada. Esta instrução FETCH lerá os dados da primeira linha nas variáveis locais @foreignKeyName e @tableName. Ao percorrer um cursor, você pode verificar o @@ FETCH_STATUS para um valor 0, o que indica que a busca foi bem-sucedida. Isso significa que o loop continuará avançando para obter cada chave estrangeira sucessiva do conjunto de linhas. @@ FETCH_STATUS está disponível para todos os cursores na conexão. Portanto, se você estiver percorrendo vários cursores, é importante verificar o valor de @@ FETCH_STATUS na instrução imediatamente após a instrução FETCH. @@ FETCH_STATUS refletirá o status da operação FETCH mais recente na conexão. Os valores válidos para @@ FETCH_STATUS são:
0 = FETCH foi bem-sucedido
-1 = FETCH não teve sucesso
-2 = a linha que foi buscada está ausente
Dentro do loop, o código cria o comando ALTER TABLE de maneira diferente, dependendo se a intenção é desativar ou ativar a restrição de chave estrangeira (usando a palavra-chave CHECK ou NOCHECK). A instrução é impressa como uma mensagem para que seu progresso possa ser observado e, em seguida, a instrução é executada. Finalmente, quando todas as linhas foram iteradas, o procedimento armazenado fecha e desaloca o cursor.
consulte Desativando restrições e disparadores da MSDN Magazine