Symfoware データベースを作成する |
早速データベースを作成してみます。
MySQLなどだと、mysqlコマンドを実行し、その後create databaseと
するのですが、Symfowareはデータベース作成用のコマンドがある模様。
また、データを配置する場所やテーブルの所属するスキーマなど
細かく指定できるようです。
今まで触ったデータベースにはない概念
DSI(Data Structure Instance)
DSO(Data Structure Organization)
がありますので、まずは自分なりの理解をまとめてみます。
データベース本体ですが、
「システムで管理されているデータベース名称」
「データベース名称と実体(ファイル)の関連付け」
この2つを作成するコマンドを実行して、初めて実体が生成されます。
テーブルやインデックスは、指定したデータベースの実体ファイルの
中に作成されます。
また、テーブルの作成にはスキーマの指定が必須ですので、
スキーマの作成も必要となります。
データベースやテーブルを作成しただけでは、まだ使用できません。
なぜなら、作成されたテーブルには
「作成されたテーブルは、どのような格納構造とするか(DSO)」
「作成されたテーブルが、どのデータベーススペースに属するか(DSI)」
という情報が定義されていないからです。
この、「DSO」「DSI」という情報を指定してやる必要があります。
「DSO」、[DSI]の情報は、データベース領域ではなく、
インスール後に実行した「RDBシステムセットアップ」で指定した
データ格納先に保存されるようです。
これを踏まえて、番号と名前という列をもつテーブルを作成してみます。
提供されているサンプルを参考に、まずはバッチファイルを作成します。
■create.bat
rdbddlex ddl.dat
rem 初期化済みの領域をフォーマットする場合は -mid
rdbfmt -mi -i DB_TEST.DSI_M_USER
rdbfmt -mi -i DB_TEST.DSI_IDX_M_USER
pause
rdbddlexというコマンドの引数に、データベースの定義ファイルを
引数として実行します。
テーブルの作成後、rdbfmtというコマンドを実行して
テーブルの内容をフォーマットする必要があります。
これを実行しない状態でテーブルにアクセスしようとすると、
JYP5002E スキーマ“SC_TEST”の表“M_USER”内に定義されているDSI“DSI_M_USER”の
初期化が完了していません.
というエラーが発生します。
rdbddlexで実行するddl.datの内容はこんな感じです。
■ddl.dat
--DB作成定義
--DB作成
CREATE DATABASE DB_TEST;
--DBスペース作成
CREATE DBSPACE DB_TEST ALLOCATE FILE E:\db_test\db_test ATTRIBUTE SPACE(4M);
--スキーマ作成
CREATE SCHEMA SC_TEST Comment 'SC_TEST';
--テーブル作成
CREATE TABLE SC_TEST.M_USER(
番号 CHAR(5) DEFAULT '0000' NOT NULL,
名前 NCHAR(50) DEFAULT N' ' NOT NULL,
PRIMARY KEY(番号)) COMMENT '社員コード';
--M_USERテーブルのDSOを作成
CREATE DSO DSO_M_USER
FROM SC_TEST.M_USER
TYPE SEQUENTIAL(PAGESIZE(4),ORDER(1)) ;
--M_USERテーブルのDSIを作成
CREATE DSI DSI_M_USER DSO DSO_M_USER
ALLOCATE DATA ON DB_TEST SIZE 1701K ;
-- インデックスのDSOを作成
CREATE DSO DSO_IDX_M_USER
INDEX ON SC_TEST.M_USER(番号)
TYPE BTREE(PAGESIZE1(4),PAGESIZE2(4))
BY ADDRESS ;
-- インデックスのDSIを作成
CREATE DSI DSI_IDX_M_USER INDEX DSO DSO_IDX_M_USER
OPTION (DEGENERATE)
ALLOCATE INDEX ON DB_TEST SIZE 12K,
BASE ON DB_TEST SIZE 328K;
・・・めちゃくちゃ指定が細かいです。
気をつける点として、データベース領域は自動拡張されません。
※自動拡張オプションもあるようですが、性能低下するようです。
まあ、そうですよね。
これが何を意味するかというと、当初のデータ容量の見積もりを誤ると、
データがあふれて悲しいことになります。
また、実行中一箇所でもエラーになると中途半端な使えない状態の
データベースが出来上がってしまいますので、落ちたところを直し、
既に作成済みの定義部分をコメントして再実行します。
ちなみに、データベースを消すコマンドはこんな感じ。
■drop.bat
rdbddlex -d DB_TEST ddl.dat
pause
■ddl.bat
--DB削除定義
--DSI削除
DROP DSI DSI_IDX_M_USER;
DROP DSI DSI_M_USER;
--DSO削除
DROP DSO DSO_IDX_M_USER;
DROP DSO DSO_M_USER;
--表削除
DROP TABLE SC_TEST.M_USER CASCADE;
--スキーマ削除
DROP SCHEMA SC_TEST CASCADE;
--DBスペースの削除
DROP DBSPACE DB_TEST;
--DBの削除
DROP DATABASE DB_TEST;
うーん。なかなか手ごわいです。