Disattivazione e attivazione di tutte le chiavi esterne
CREATE PROCEDURE pr_Disable_Triggers_v2
@disable BIT = 1
AS
DECLARE @sql VARCHAR(500)
, @tableName VARCHAR(128)
, @tableSchema VARCHAR(128)
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
Innanzitutto, il cursore foreignKeyCursor viene dichiarato come l'istruzione SELECT che raccoglie l'elenco delle chiavi esterne e dei relativi nomi di tabella. Successivamente, il cursore viene aperto e viene eseguita l'istruzione FETCH iniziale. Questa istruzione FETCH leggerà i dati della prima riga nelle variabili locali @foreignKeyName e @tableName. Quando si scorre un cursore, è possibile controllare @@ FETCH_STATUS per un valore di 0, che indica che il recupero è riuscito. Ciò significa che il ciclo continuerà ad andare avanti in modo che possa ottenere ogni chiave esterna successiva dal set di righe. @@ FETCH_STATUS è disponibile per tutti i cursori sulla connessione. Quindi, se stai scorrendo più cursori, è importante controllare il valore di @@ FETCH_STATUS nell'istruzione immediatamente successiva all'istruzione FETCH. @@ FETCH_STATUS rifletterà lo stato dell'operazione FETCH più recente sulla connessione. I valori validi per @@ FETCH_STATUS sono:
0 = FETCH ha avuto successo
-1 = FETCH non ha avuto successo
-2 = la riga che è stata recuperata è mancante
All'interno del ciclo, il codice crea il comando ALTER TABLE in modo diverso a seconda che si intenda disabilitare o abilitare il vincolo di chiave esterna (utilizzando la parola chiave CHECK o NOCHECK). L'istruzione viene quindi stampata come messaggio in modo che sia possibile osservarne il progresso e quindi viene eseguita l'istruzione. Infine, quando tutte le righe sono state iterate, la stored procedure si chiude e rilascia il cursore.
vedere Disattivazione di vincoli e trigger da MSDN Magazine