Отключение и включение всех внешних ключей
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