SQL Server 2005 でデータベース上のテーブルすべてについて制約を一時的に無効にする

MSDN Magazine 2007 Apr 制約およびトリガを無効にする に大体のコードは掲載されているが、以下の2点について改善した。

  • Firuge 1 の内容がキャプションと異なり トリガー を対象にしていたのを修正
  • 制約を有効にした後に、DBCC CHECKCONSTRAINTS によりチェックを実行する

ストアドプロシージャを作成する SQL statements:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pr_Disable_Or_Enable_All_Constraints]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[pr_Disable_Or_Enable_All_Constraints]
GO
CREATE PROCEDURE pr_Disable_Or_Enable_All_Constraints
    @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
    WHERE
	t.TABLE_TYPE='BASE TABLE'
    ORDER BY
        t.TABLE_NAME,
        t.TABLE_SCHEMA 

    OPEN triggerCursor

    FETCH NEXT FROM triggerCursor 
    INTO @tableName, @tableSchema

    WHILE ( @@FETCH_STATUS = 0 )
        BEGIN
            IF @disable = 1 
                SET @sql = 'ALTER TABLE ' + @tableSchema 
                    + '.[' + @tableName + '] NOCHECK CONSTRAINT ALL'
            ELSE 
                SET @sql = 'ALTER TABLE ' + @tableSchema 
                    + '.[' + @tableName + '] CHECK CONSTRAINT ALL'

            PRINT 'Executing Statement - ' + @sql

            EXECUTE ( @sql )
            FETCH NEXT FROM triggerCursor
            INTO @tableName, @tableSchema
        END

    CLOSE triggerCursor
    DEALLOCATE triggerCursor

    IF @disable = 0 DBCC CHECKCONSTRAINTS WITH ALL_CONSTRAINTS
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。