すべての外部キーの無効化と有効化
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ステートメントの直後のステートメントで@@ FETCH_STATUSの値を確認することが重要です。@@ FETCH_STATUSは、接続での最新のFETCH操作のステータスを反映します。@@ FETCH_STATUSの有効な値は次のとおりです。
0 = FETCHは成功した
-1 = FETCHは失敗した
-2 =フェッチされた行が欠落している
ループ内で、コードは、(CHECKまたはNOCHECKキーワードを使用して)外部キー制約を無効にするか有効にするかによって、ALTER TABLEコマンドの作成方法が異なります。次に、ステートメントがメッセージとして出力され、その進行状況を確認してからステートメントが実行されます。最後に、すべての行が反復処理されると、ストアドプロシージャはカーソルを閉じて割り当てを解除します。
MSDN Magazineの「制約とトリガーの無効化」を参照してください