Symfoware データベースを作成する



前回、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;



うーん。なかなか手ごわいです。



もどる