MSDE FunClub | 最終更新日 : 2000/07/22 | |
Microsoft Data Engine FunClub |
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(上巻) | ||
【第2章201p 〜 203p掲載】 |
-- [DDL系SQL文の基礎(例題15)EX3-13.SQL] -- SQLServer7.0 Transact-SQL言語 -- 日本技術ソフト開発 堀川 明 -- http://www.horikawa.ne.jp/msde/ -- -- このSQLプログラムは、 -- 指定されたテーブルの指定された列のUNIQUE制約を設定します -- これから操作する既定のデータベースを MySampleTest にします USE MySampleTest GO -- ( 件処理されました)のメッセージの表示を抑止します SET NOCOUNT ON GO -- ****************************************************** -- UNIQUE制約を設定するストアドプロシージャの登録 -- ****************************************************** IF( (object_id('SetUniqueConstraint') IS NOT NULL) AND OBJECTPROPERTY( object_id('SetUniqueConstraint' ) , 'IsProcedure' ) = 1 ) BEGIN DROP PROCEDURE SetUniqueConstraint END GO CREATE PROCEDURE SetUniqueConstraint @TblName sysname , -- 対象となるテーブル @ColName sysname , -- 対象となる列の名前 @DelFlag int -- 0:削除を行なう -- 1:登録を行なう AS SET NOCOUNT ON DECLARE @cmd varchar(256) -- 動的SQL文 DECLARE @ConstName sysname -- 制約の名前 --列に設定された制約をすべて取得する --システムビュー表の検索 DECLARE Unique_CUR INSENSITIVE CURSOR FOR SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE( ( TABLE_NAME = @TblName ) AND (COLUMN_NAME = @ColName) ) FOR READ ONLY -- カーソルを開く OPEN Unique_CUR -- 先頭行の読み込み(制約名の読み込み) FETCH NEXT FROM Unique_CUR INTO @ConstName WHILE( @@FETCH_STATUS = 0 ) BEGIN -- 読み込んだ制約名の種類を判別する -- UNIQUE制約ですか? IF( OBJECTPROPERTY( OBJECT_ID( @ConstName ) , 'IsUniqueCnst' ) = 1 ) BEGIN --UNIQUE制約を削除する --但し、外部からの参照整合性は行なっていないものとする --厳密には、主キーの削除と同じ扱いになる(EX3-10参照) EXEC( 'ALTER TABLE ' + @TblName + ' DROP CONSTRAINT ' + @ConstName ) END -- 次行の読み込み FETCH NEXT FROM Unique_CUR INTO @ConstName END -- カーソルを閉じる CLOSE Unique_CUR -- カーソルを破棄する DEALLOCATE Unique_CUR -- 削除処理だけですか? IF( @DelFlag = 0 ) RETURN 0 -- 新しいUNIQUE制約を登録する -- 制約名は、IX_列名 にします SELECT @cmd = 'ALTER TABLE ' + @TblName + ' ADD ' + 'CONSTRAINT ' + '[IX_' + @ColName + '] UNIQUE ( ' + @ColName + ' )' PRINT @cmd EXECUTE( @cmd ) RETURN 0 GO -- UNIQUE制約の設定例 -- TableName ColumnName 0 or 1 EXEC SetUniqueConstraint '社員' , 'フリガナ' , 1 EXEC SetUniqueConstraint '社員' , '氏名' , 1 GO -- プロシージャを削除 DROP PROCEDURE SetUniqueConstraint GO