論理構造定義の変更の指定方法について説明します。
既存のデータベースの定義に新たにスキーマ定義を追加することができます。スキーマ定義を追加する場合は、スキーマ定義時と同様に、CREATE SCHEMA文で指定します。CREATE SCHEMA文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
在庫管理DBに属するスキーマを追加
CREATE SCHEMA STOCKS
↑
スキーマ名
スキーマ定義の削除をする場合は、DROP SCHEMA文を使用します。以下に指定例を示します。
スキーマに順序定義を追加する場合は、CREATE SEQUENCE文を使用します。以下に指定例を示します。CREATE SEQUENCE文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
スキーマSTOCKSに順序2の定義を追加
CREATE SEQUENCE STOCKS.順序2 ↑ ↑ スキーマ名 | 順序名 INCREMENT BY 1 START WITH 1 ↑ ↑ 増分値 初期値
順序定義の削除は、DROP SEQUENCE文を使用します。当該順序を参照している実表、ビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガがある場合は、順序定義を削除することはできません。あらかじめ、当該順序を参照している実表、ビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガの定義を削除しておく必要があります。以下に削除例を示します。
順序1を削除
DROP SEQUENCE STOCKS.順序1 ↑ ↑ スキーマ名 順序名
スキーマに表定義を追加する場合は、CREATE TABLE文を使用します。以下に指定例を示します。CREATE TABLE文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
スキーマSTOCKSに製品表の定義を追加
CREATE TABLE STOCKS.製品表 (品番 SMALLINT NOT NULL, 品名 NATIONAL CHAR(10),…) ↑ ↑ スキーマ名 表名 ↑ 追加の対象とする実表の表名指定
表の定義の削除は、DROP TABLE文を使用します。当該実表を参照しているビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガがある場合は、表定義を削除することはできません。あらかじめ当該実表を参照しているビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガの定義を削除しておく必要があります。当該実表を参照するビュー定義、プロシジャルーチン定義、ファンクションルーチン定義またはトリガ定義も一緒に削除する場合は、CASCADEを指定します。同様に、実表に対して格納構造定義がある場合も、実表と一緒に格納構造定義を削除する場合は、CASCADEを指定することが必要です。
DROP TABLE文によって表定義を削除すると、同時にデータベースのデータの実体も削除されます。したがって、表定義で誤ってほかの表名を指定すると、定義情報だけでなく大切なデータの本体を失うことになります。DROP TABLE文の使用にあたっては十分な注意が必要です。
表定義の削除例を以下に示します。
在庫表の定義情報および在庫表を削除
DROP TABLE STOCKS.在庫表 CASCADE
↑ ↑ ↑ スキーマ名 表名 CASCADE指定 ↑ 削除の対象とする実表の表名指定
表の定義の変更は、ALTER TABLE文を使用します。ALTER TABLE文で以下の変更を行うことができます。
列定義の追加
列定義の削除
実表に列を新たに追加する場合は、ALTER TABLE文に列定義の追加を指定します。1つの表定義変更文で追加できるのは、1列です。追加する列の定義順は、既存の列の後になります。SEQUENTIAL構造の場合は、BLOB型の列の追加により、表の1行に対応するデータが1ページを超えても問題ありません。
追加する列に対する制約は、“NOT NULL”だけ指定可能です。NOT NULLを指定した場合、列定義にはDEFAULT句を指定する必要があります。
既存のデータには、DEFAULT値が設定されます。
また、運用中のデータベースに対して列定義の追加が必要な場合は、アプリケーションを停止せずに列定義を追加することができます。
アプリケーション実行中に列定義を追加する場合は、rdbddlexコマンドの準備モード(lオプション)で定義します。
参照
rdbddlexコマンドの詳細については、“コマンドリファレンス”を参照してください。
列定義の追加の指定例を以下に示します。
発注表に“販売価格”列を追加
ALTER TABLE STOCKS.発注表 ADD 販売価格 INTEGER
↑ ↑ ↑ スキーマ名 表名 列定義 ↑ 変更対象表の指定
この結果を以下に示します。
実表から列を削除する場合は、ALTER TABLE文で列定義削除を指定します。1つの表変更文で1列しか削除できません。削除する列を参照しているビュー定義がある場合は、列削除はできません。また、列に対してインデックスのDSO定義がある場合は、列削除はできません。あらかじめインデックスのDSO定義を削除しておく必要があります。ただし、列に対して一意性制約がある場合は、インデックスのDSO定義を削除していても、削除することはできません。また、列定義の削除で表の列数をゼロにすることはできません。全列を削除する場合は、DROP TABLE文を使用します。列定義の削除の指定例を以下に示します。
発注表から仕入価格を削除
ALTER TABLE STOCKS.発注表 DROP 仕入価格 ↑ ↑ ↑ スキーマ名 表名 削除列名 ↑ 変更対象表の指定
この結果を以下に示します。
定義済みのスキーマにビュー定義を追加する場合は、CREATE VIEW文を使用します。ビュー表の定義の変更はできません。ビュー表の定義の変更は、一度ビュー定義を削除しておいて、あらためてビュー定義を追加する方法で行います。
ビュー定義の追加例を以下に示します。CREATE VIEW文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
スキーマSTOCKSに“電話”ビュー表を追加
CREATE VIEW STOCKS.電話 (社名, 電話番号) ↑ ↑ ↑ スキーマ名 ビュー表名 ビュー表の列名 ↑ 追加対象のビュー表名 AS SELECT 会社名, 電話番号 FROM STOCKS.会社表
定義済みのスキーマからビュー定義を削除する場合は、DROP VIEW文を使用します。削除対象のビュー表を参照する別のビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガの定義がある場合は、当該ビュー定義を削除することはできません。あらかじめ、削除対象のビュー表を参照するビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガの定義を削除しておく必要があります。削除対象のビュー表の定義と、それを参照するビュー表、プロシジャルーチン、ファンクションルーチンまたはトリガの定義も一緒に削除する場合は、CASCADEを指定します。
ビュー定義の削除例を以下に示します。
ビュー表“在庫ビュー”の定義を削除
DROP VIEW STOCKS.在庫ビュー CASCADE ↑ ↑ ↑ スキーマ名 ビュー表名 CASCADE指定 ↑ 削除対象のビュー表名
トリガ定義を追加する場合には、トリガ定義文を使用します。トリガ定義文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
トリガ“発注トリガ”を定義
CREATE TRIGGER STOCKS.発注トリガ …
↑
トリガ名
トリガ定義を削除する場合には、DROP TRIGGER文を使用します。
トリガ“発注トリガ”の定義を削除
DROP TRIGGER STOCKS.発注トリガ
↑ トリガ名
プロシジャルーチン定義の追加(CREATE PROCEDURE文)
プロシジャルーチンを追加する場合には、プロシジャルーチン定義文を使用します。プロシジャルーチン定義文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
スキーマSTOCKSにプロシジャルーチンPROC002を追加
CREATE PROCEDURE STOCKS.PROC002 ( IN PARAM1 INT ) ↑ ↑ ルーチン名 パラメタ宣言 BEGIN -+ DECLARE 発注数量変数 INTEGER; | SELECT 発注数量 INTO 発注数量変数 FROM STOCKS.発注表;|→複合文 : | END -+
プロシジャルーチン定義の削除(DROP PROCEDURE文)
プロシジャルーチンを削除する場合には、プロシジャルーチン削除文を使用します。削除対象のプロシジャルーチンを呼び出す別のプロシジャルーチンがある場合は、当該プロシジャルーチンを削除することはできません。ただし、CASCADEを指定すると、関連するプロシジャルーチンはすべて削除されます。
スキーマSTOCKSからプロシジャルーチンPROC002を削除
DROP PROCEDURE STOCKS. PROC002
↑
ルーチン名
ファンクションルーチン定義の追加(CREATE FUNCTION文)
ファンクションルーチンを追加する場合には、ファンクションルーチン定義文を使用します。ファンクションルーチン定義文の指定方法の詳細については、“2.6 論理構造の定義”を参照してください。
スキーマSTOCKSに、ファンクションルーチンUSER002を定義する例
Solaris/Linuxの場合
CREATE FUNCTION STOCKS.USER002 ( IN INTEGER, IN INTEGER ) ↑ ↑ ↑ スキーマ名 ルーチン名 パラメタ宣言 RETURNS INTEGER LANGUAGE C ↑ 戻りデータ型 NAME ‘ABCDEFG’ LIBRARY ‘/usr/local/lib/libuser1.so’ ↑ ↑ シンボル名 ライブラリ
Windowsの場合
CREATE FUNCTION STOCKS.USER002 ( IN INTEGER, IN INTEGER ) ↑ ↑ ↑ スキーマ名 ルーチン名 パラメタ宣言 RETURNS INTEGER LANGUAGE C ↑ 戻りデータ型 NAME ‘ABCDEFG’ LIBRARY ‘D:\FORSYMFO\FUNCLIB\USERFUNC001.DLL’ ↑ ↑ シンボル名 ライブラリ
ファンクションルーチン定義の削除(DROP FUNCTION文)
ファンクションルーチンを削除する場合には、ファンクションルーチン削除文を使用します。削除対象のファンクションルーチンをSQL文に指定した、プロシジャルーチンやトリガがある場合は、当該ファンクションルーチンを削除することはできません。ただし、CASCADEを指定すると、すべて削除されます。
スキーマSTOCKSからファンクションルーチンUSER002を削除
DROP FUNCTION STOCKS.USER002 ↑ ↑ スキーマ名 ルーチン名
注釈定義のうち、表および列の注釈定義は、ALTER TABLE文で変更することができます。以下に例を示します。
表の注釈定義の変更例
ALTER TABLE STOCKS.在庫表 COMMENT '製品名, 在庫数量, 格納倉庫, 販売価格の表'
↑ 変更する注釈定義
列の注釈定義の変更例
ALTER TABLE STOCKS.在庫表 MODIFY 製品番号 COMMENT '製品のコード番号'
↑ 変更する注釈定義
表の交換は、表名を交換することにより、DSOとの関係も交換します。表の交換を行う場合には、SWAP TABLE文を使用します。これにより、以下の効果を得ることができます。
短時間でデータを移行できます。
アプリケーションの変更は必要ありません。
ビューおよびルーチン定義は以前のものをそのまま使用できます。
表の交換の例を、以下に示します。
毎日のデータを本日、1日前、2日前・・・という形態で管理する場合、日が変わる契機で、本日のデータを1日前に、1日前のデータを2日前にと順番にデータを移動する運用に表の交換を使用する例を示します。新しい日のデータは初期化して使います。
SWAP TABLE STOCKS.表00 STOCKS.表01; (1) SWAP TABLE STOCKS.表00 STOCKS.表02; (2) : : : SWAP TABLE STOCKS.表00 STOCKS.表29; (29) SWAP TABLE STOCKS.表00 STOCKS.表30; (30)