Відключення та включення всіх іноземних ключів
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
По-перше, курсор ForeignKeyCursor оголошується як оператор SELECT, який збирає список зовнішніх ключів та назви їх таблиць. Далі курсор відкривається та виконується початковий оператор FETCH. Цей FETCH-вислів буде прочитати дані першого ряду в локальні змінні @foreignKeyName та @tableName. Під час циклу через курсор ви можете перевірити @@ FETCH_STATUS на значення 0, що вказує на те, що завантаження було успішним. Це означає, що цикл продовжуватиметься рухатися вперед, тому він може отримати кожен наступний зовнішній ключ із набору рядків. @@ FETCH_STATUS доступний для всіх курсорів підключення. Отже, якщо ви перебираєте декілька курсорів, важливо перевірити значення @@ FETCH_STATUS в операторі відразу після оператора FETCH. @@ FETCH_STATUS відображатиме стан останньої операції FETCH підключення. Дійсні значення для @@ FETCH_STATUS:
0 = FETCH виявився успішним
-1 = FETCH виявився невдалим
-2 = відсутній рядок, який було отримано
Всередині циклу код будує команду ALTER TABLE по-різному, залежно від того, чи має намір вимкнути або включити обмеження іноземного ключа (використовуючи ключове слово CHECK або NOCHECK). Потім виписка друкується як повідомлення, тому можна спостерігати її хід і потім виконувати операцію. Нарешті, коли всі рядки були переглянуті, збережена процедура закривається та переміщує курсор.
див. Вимкнення обмежень та тригерів з журналу MSDN