MSDE FunClub | 最終更新日 : 2000/07/22 | |
Microsoft Data Engine FunClub |
|
|
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