MSDE FunClub 現在までのアクセスカウント数 最終更新日 : 2000/07/22
Microsoft Data Engine FunClub
Since 2000.07.22
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻)
【第2章198p 〜 200p掲載】

-- [DDL系SQL文の基礎(例題14)EX3-12.SQL]
--             SQLServer7.0  Transact-SQL言語
--             日本技術ソフト開発  堀川 明
--            http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
--   指定されたテーブルの指定された列のCHECK制約を設定します

-- これから操作する既定のデータベースを MySampleTest にします
    USE MySampleTest
GO

-- ( 件処理されました)のメッセージの表示を抑止します
    SET NOCOUNT ON
GO

-- ******************************************************
--     チェック制約を行なうストアドプロシージャの登録
-- ******************************************************
   IF( (object_id('SetCheckConstraint') IS NOT NULL) AND
            OBJECTPROPERTY( object_id('SetCheckConstraint' ) , 'IsProcedure' ) = 1 )
        BEGIN
               DROP PROCEDURE SetCheckConstraint
        END
GO

    CREATE PROCEDURE SetCheckConstraint
            @TblName   sysname     ,    -- 対象となるテーブル
            @ColName   sysname     ,    -- 対象となる列の名前
            @Check     varchar(256) ,   -- 設定を行なう制約式の値
            @DelFlag   int              -- 0:削除を行なう
                                        -- 1:削除と登録を行なう
    AS
        SET NOCOUNT ON
        DECLARE @Tbl_id   int           -- テーブルのオブジェクトID値
        DECLARE @Def      varchar(80)
        DECLARE @cmd      varchar(256)  -- 動的SQL文
        DECLARE @Check_nm sysname       -- CHECK制約の名前
        DECLARE @Check_id int           -- CHECK制約のID
        DECLARE @Check_info smallint    -- CHECK制約が付けられた列番号
        DECLARE @Check_old varchar(100) -- 削除前のCHECK制約式

        --テーブル名に対応するオブジェクトIDを求める
        SELECT @tbl_id = object_id( @TblName )

        -- 【このテーブルに設定されているCHECK制約すべてをカーソルで取得】
        --     (1)xtype = 'D 'とすると、DEFALUT値制約が取得できる
        --     (2)parent_objに、テーブルIDが記憶されている
        --     (3)sysobjectsのinfo列は、内部使用で説明がないが、sp_helpconstraintの
        --        プログラムを読むと、テーブルの列順序番号が入っていることがわかる

        DECLARE Check_CUR INSENSITIVE CURSOR
        FOR SELECT name , Id , info  FROM sysobjects
            WHERE( ( parent_obj = @tbl_id ) AND (xtype = 'C ' ) )
            FOR READ ONLY

        -- カーソルを開く
        OPEN Check_CUR

        -- 先頭行の読み込み
        FETCH NEXT FROM Check_CUR  INTO @Check_nm , @Check_id , @Check_info

        WHILE( @@FETCH_STATUS = 0 )
          BEGIN
               --テーブルレベルのCHECK制約式は、削除しません
               IF( @Check_info = 0 )
                 BEGIN
                    PRINT 'テーブルレベルのCHECK制約式を見つけました。削除処理はしません'
                 END
               ELSE
                 BEGIN
                  --指定された列に設定されたCHECK制約ですか?
                  IF(  @ColName = COL_NAME( @tbl_id , @Check_info ) )
                  BEGIN      
                     --設定前のCheck制約式の取得(syscommentsテーブル)
                     --colidは、制約式が4000バイト以下のときは、常に1です
                     SELECT @Check_old = text FROM syscomments 
                                     WHERE( ( id = @Check_id ) AND ( colid = 1 ) )

                     PRINT '列名=[' + @ColName + ']に付けられたCHECK制約式=[' +
                           @Check_old + 'を削除します'
 
                     --制約式を削除します
                     EXEC( 'ALTER TABLE ' + @TblName + ' DROP CONSTRAINT [' + @Check_nm + ']' )
                  END
                END
             -- 次行の読み込み
             FETCH NEXT FROM Check_CUR INTO @Check_nm , @Check_id , @Check_info
          END

        -- カーソルを閉じる
        CLOSE Check_CUR

        -- カーソルを破棄する
        DEALLOCATE Check_CUR

        -- 削除処理だけですか?         
        IF( @DelFlag = 0 ) RETURN 0

        -- 新しい制約式を登録する
        SELECT @cmd = 'ALTER TABLE ' + @TblName + ' WITH NOCHECK ADD ' + 
                      'CONSTRAINT ' + '[CK_' +  @ColName + ']  CHECK ( ' +  @Check + ' )'
        PRINT @cmd
        EXECUTE( @cmd )
        RETURN 0
GO

--  CHECK制約の設定例
--                          TableName ColumnName    logical_expression    0 or 1
    EXEC SetCheckConstraint  '社員' , '社員コード' , '社員コード>10'        , 1
    EXEC SetCheckConstraint  '社員' , '誕生日'     , '誕生日 < getdate()'   , 1

GO

-- プロシージャを削除
    DROP PROCEDURE SetCheckConstraint
GO

















技術評論社の書籍ガイドへ
上巻:ISBN4-7741-0965-7

ウィンドウを閉じる


(株)日本技術ソフト開発 責任編集:堀川 明
MSDE FunClubに関するご意見・ご要望等ございましたら、 msdefun@horikawa.ne.jp までご連絡下さい。
HOME: http://www.horikawa.ne.jp/msde/


MSDE FunClubの運営は、マイクロソフト社とは一切の関係はありません