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