Deshabilitar y habilitar todas las claves foráneas
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
Primero, el cursor foreignKeyCursor se declara como la instrucción SELECT que recopila la lista de claves foráneas y sus nombres de tabla. A continuación, se abre el cursor y se ejecuta la instrucción FETCH inicial. Esta instrucción FETCH leerá los datos de la primera fila en las variables locales @foreignKeyName y @tableName. Al recorrer un cursor, puede verificar @@ FETCH_STATUS para un valor de 0, lo que indica que la recuperación fue exitosa. Esto significa que el bucle continuará avanzando para que pueda obtener cada clave externa sucesiva del conjunto de filas. @@ FETCH_STATUS está disponible para todos los cursores en la conexión. Entonces, si está recorriendo varios cursores, es importante verificar el valor de @@ FETCH_STATUS en la declaración que sigue inmediatamente a la declaración FETCH. @@ FETCH_STATUS reflejará el estado de la operación FETCH más reciente en la conexión. Los valores válidos para @@ FETCH_STATUS son:
0 = FETCH fue exitoso
-1 = FETCH no fue exitoso
-2 = falta la fila que fue recuperada
Dentro del bucle, el código crea el comando ALTER TABLE de manera diferente dependiendo de si la intención es deshabilitar o habilitar la restricción de clave externa (usando la palabra clave CHECK o NOCHECK). La declaración se imprime como un mensaje para que se pueda observar su progreso y luego se ejecuta la declaración. Finalmente, cuando se han iterado todas las filas, el procedimiento almacenado cierra y desasigna el cursor.
ver Deshabilitar restricciones y disparadores de la revista MSDN