| MSDE FunClub |
|
最終更新日 : 2000/11/03 |
|
Microsoft Data Engine FunClub
|
Since 2000.11.03
|
|
SQLServer7.0/MSDE 完全トレーニングテキスト(下巻) |
|
【第22章431p 〜 436p掲載】 |
-- [SQL22_01.SQL]
-- SQLServer7.0 Transact-SQL言語
-- 日本技術ソフト開発 堀川 明
-- http://www.horikawa.ne.jp/msde/
--
-- このSQLプログラムは、
-- Access テーブルエクスポート機能によって作成された
-- テーブルに対して、制約を設定するストアドプロシージャです
--
-- ( 件処理されました)のメッセージの表示を抑止します
SET NOCOUNT ON
GO
-- 接続先データベースの定義
USE MySampleTest
GO
-- **********************************************************
-- 指定されたテーブルの指定された列に NOT NULL 属性を設定
-- **********************************************************
IF( (OBJECT_ID('ALTTBL_NotNULL') IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID('ALTTBL_NotNULL'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE ALTTBL_NotNULL
END
GO
CREATE PROCEDURE ALTTBL_NotNULL
@tblnm sysname , --テーブルの名前
@colnm sysname , --列の名前
@type sysname --データ型
AS
SET NOCOUNT ON
DECLARE @cmd varchar(256)
--ALTER TABLE文を組み立てる
SELECT @cmd = 'ALTER TABLE [' + @tblnm + '] ' +
'ALTER COLUMN [' + @colnm + '] ' + @type + ' NOT NULL'
--RAISERROR('%s',0,1,@cmd)
EXEC( @cmd )
GO
-- **********************************************************
-- 指定されたテーブルの指定された列に CHECK制約を設定
-- **********************************************************
IF( (OBJECT_ID('ALTTBL_SetCHECK') IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID('ALTTBL_SetCHECK'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE ALTTBL_SetCHECK
END
GO
CREATE PROCEDURE ALTTBL_SetCHECK
@tblnm sysname , --テーブルの名前
@colnm sysname , --列の名前
@check varchar(256) --制約式の内容
AS
SET NOCOUNT ON
DECLARE @cmd varchar(256)
DECLARE @cnm sysname
--CHECK制約名
SELECT @cnm = '[CK_' + @tblnm + '_' + @colnm + ']'
--制約が存在していれば、それを削除する
IF( (OBJECT_ID(@cnm) IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID(@cnm),'IsCheckCnst') = 1 )
BEGIN
--制約削除
SELECT @cmd = 'ALTER TABLE ' + @tblnm + ' DROP CONSTRAINT ' + @cnm
EXEC( @cmd )
END
--制約作成
SELECT @cmd = 'ALTER TABLE ' + @tblnm + ' ADD ' +
'CONSTRAINT ' + @cnm + ' CHECK ( ' + @check + ' )'
--RAISERROR('%s',0,1,@cmd)
EXEC( @cmd )
GO
-- **********************************************************
-- 指定されたテーブルの指定された列に DEFAULT制約を設定
-- **********************************************************
IF( (OBJECT_ID('ALTTBL_SetDEFAULT') IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID('ALTTBL_SetDEFAULT'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE ALTTBL_SetDEFAULT
END
GO
CREATE PROCEDURE ALTTBL_SetDEFAULT
@tblnm sysname , --テーブルの名前
@colnm sysname , --列の名前
@value varchar(256) --デフォルト値の値
AS
SET NOCOUNT ON
DECLARE @cmd varchar(256)
DECLARE @cnm sysname
--DEFAULT制約名
SELECT @cnm = '[DEFAULT_' + @tblnm + '_' + @colnm + ']'
--制約が存在していれば、それを削除する
IF( (OBJECT_ID(@cnm) IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID(@cnm),'IsDefaultCnst') = 1 )
BEGIN
--制約削除
SELECT @cmd = 'ALTER TABLE ' + @tblnm + ' DROP CONSTRAINT ' + @cnm
EXEC( @cmd )
END
--制約作成
SELECT @cmd = 'ALTER TABLE ' + @tblnm + ' ADD ' +
'CONSTRAINT ' + @cnm + ' DEFAULT ' + @value + ' FOR ' + @colnm
--RAISERROR('%s',0,1,@cmd)
EXEC( @cmd )
GO
-- **************************************************************
-- 指定されたテーブルの指定された列に Primary Key制約を設定
-- **************************************************************
IF( (OBJECT_ID('ALTTBL_SetPrimaryKey') IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID('ALTTBL_SetPrimaryKey'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE ALTTBL_SetPrimaryKey
END
GO
CREATE PROCEDURE ALTTBL_SetPrimaryKey
@tblnm sysname , --テーブルの名前
@colnm sysname --列の名前
AS
SET NOCOUNT ON
DECLARE @cmd varchar(256)
DECLARE @cnm sysname
--PrimaryKey制約名
SELECT @cnm = '[PK_' + @tblnm + ']'
--制約が存在していれば、それを削除する
IF( (OBJECT_ID(@cnm) IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID(@cnm),'IsPrimaryKey') = 1 )
BEGIN
--制約削除
SELECT @cmd = 'ALTER TABLE ' + @tblnm + ' DROP CONSTRAINT ' + @cnm
EXEC( @cmd )
END
--制約作成
SELECT @cmd = 'ALTER TABLE ' + @tblnm + ' ADD ' +
'CONSTRAINT ' + @cnm + ' PRIMARY KEY ( [' + @colnm + '] )'
--RAISERROR('%s',0,1,@cmd)
EXEC( @cmd )
GO
-- *****************************************************************
-- 指定されたテーブルの指定された列に インデックスを作成する
-- *****************************************************************
IF( (OBJECT_ID('ALTTBL_MakeIDX') IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID('ALTTBL_MakeIDX'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE ALTTBL_MakeIDX
END
GO
CREATE PROCEDURE ALTTBL_MakeIDX
@tblnm sysname , --テーブルの名前
@colnm sysname , --列の名前
@type int --0:重複あり 1:UNIQUE
AS
SET NOCOUNT ON
DECLARE @cnm sysname
--Indexの名前
SELECT @cnm = 'IDX_' + @tblnm + '_' + @colnm
DECLARE @cmd varchar(256)
--INDEXが存在していれば、それを削除する
IF EXISTS (SELECT name FROM sysindexes WHERE( name = @cnm ) )
EXEC('DROP INDEX ' + @tblnm + '.' + @cnm )
--インデックスを作成する
IF( @type = 0 )
SELECT @cmd = 'CREATE INDEX ' + @cnm + ' ON ' + @tblnm + '( ' + @colnm + ' )'
ELSE
SELECT @cmd = 'CREATE UNIQUE INDEX ' + @cnm + ' ON ' + @tblnm + '( ' + @colnm + ' )'
--RAISERROR('%s',0,1,@cmd)
EXEC( @cmd )
GO
-- *****************************************************************
-- 参照整合性制約を設定する
-- 【1対多の設定】
-- *****************************************************************
IF( (OBJECT_ID('ALTTBL_SetRelation') IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID('ALTTBL_SetRelation'),'IsProcedure') = 1 )
BEGIN
DROP PROCEDURE ALTTBL_SetRelation
END
GO
CREATE PROCEDURE ALTTBL_SetRelation
@tblnmPK sysname , --主キー側のテーブルの名前
@colnmPK sysname , --主キー側の列の名前
@tblnmFK sysname , --外部キー側のテーブルの名前
@colnmFK sysname --外部キー側の列の名前
AS
SET NOCOUNT ON
DECLARE @cnm sysname
DECLARE @cmd varchar(256)
--参照整合性の名前を定義
SELECT @cnm = 'FK_' + @tblnmFK + '_' + @tblnmPK
--参照整合性が存在していれば、それを削除する
IF( (OBJECT_ID(@cnm) IS NOT NULL) AND
OBJECTPROPERTY(OBJECT_ID(@cnm) ,'IsForeignKey') = 1 )
BEGIN
--制約削除
SELECT @cmd = 'ALTER TABLE ' + @tblnmFK + ' DROP CONSTRAINT ' + @cnm
EXEC( @cmd )
END
--参照整合性制約作成
SELECT @cmd = 'ALTER TABLE ' + @tblnmFK + ' ADD ' +
'CONSTRAINT ' + @cnm + ' FOREIGN KEY ( [' + @colnmFK + '] ) REFERENCES ' +
@tblnmPK + ' ( [' + @colnmPK + '] )'
--RAISERROR('%s',0,1,@cmd)
EXEC( @cmd )
GO