

Enterprise Architectでテンプレートを変更しOracle用のDDLを出力する
こんにちは。ソリューション開発部の栗田です。
ソリューション開発部では、DB設計をおこなう際にEnterprise Architectというツールを利用しています。
DB設計をおこない、いざDDLを出力し実行すると、DBがOracleの場合に私の環境ではエラーが発生してしまいました。そういった場合に対応する方法と、テンプレートを修正しすべてのテーブルに設定する共通カラムを出力する方法を紹介します。
今回の記事で利用しているEnterprise ArchitectのVersionは15.0.1513です。
出力対象のテーブル
今回はテンプレート修正の紹介のため、シンプルなテーブル構造を出力してみます。注文テーブルにサロゲートキーがあり、そのキーにAutoNumをTrue設定しています。また、登録日時や更新日時などの共通のカラムはテンプレートで追加するためテーブル定義には含めていません。
DDLの出力(テンプレート修正前)
この内容でメニューの「コード」->「DDLの生成」を選択し、下記のオプションを指定しDDLを作成すると、SEQUENCEとTRIGGERを利用したDDLが出力されます。
CREATE TABLE "ORDER"
(
"ORDER_ID" NUMBER(12) NOT NULL,
"ORDER_DATE" TIMESTAMP(6) NOT NULL,
"PRICE" NUMBER(12) NULL
)
;
CREATE SEQUENCE "SEQ_ORDER_ORDER_ID"
INCREMENT BY 1
START WITH 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
CREATE OR REPLACE TRIGGER "TRG_ORDER_ORDER_ID"
BEFORE INSERT
ON "ORDER"
FOR EACH ROW
BEGIN
SELECT "SEQ_ORDER_ORDER_ID".NEXTVAL
INTO :NEW."ORDER_ID"
FROM DUAL;
END;
/
ALTER TABLE "ORDER"
ADD CONSTRAINT "PK_ORDER"
PRIMARY KEY ("ORDER_ID")
USING INDEX
;
私の環境のOracle(19c)で上記のDDLを実行すると、TRIGGERの作成部分でエラーが発生してしまいます。
ORA-24344
success with compilation error
こちらの原因は詳しく見られていませんが、Oracle(12c)以降はデフォルト値にシーケンスを利用できるため、デフォルト値を利用したDDLを出力します。
最終的に出力したいDDL
上記のDDLを最終的にどうしたいかですが、今回は前述した共通カラムを出すようにするのと、TRIGGERを利用せずにAutoNumを実現するようにして、下記のDDLを出力する形にテーブル定義およびテンプレートを直していきます。
CREATE SEQUENCE "SEQ_ORDER_ORDER_ID"
INCREMENT BY 1
START WITH 1
NOMAXVALUE
MINVALUE 1
NOCYCLE
NOCACHE
NOORDER
;
CREATE TABLE "ORDER"
(
"ORDER_ID" NUMBER(12) DEFAULT SEQ_ORDER_ORDER_ID.NEXTVAL NOT NULL,
"ORDER_DATE" TIMESTAMP(6) NOT NULL,
"PRICE" NUMBER(12) NULL,
CREATE_DATETIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
CREATE_USER VARCHAR2(20) DEFAULT 'system' NOT NULL,
UPDATE_DATETIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
UPDATE_USER VARCHAR2(20) DEFAULT 'system' NOT NULL,
VERSION_NO NUMBER(20) DEFAULT 0 NOT NULL
)
;
ALTER TABLE "ORDER"
ADD CONSTRAINT "PK_ORDER"
PRIMARY KEY ("ORDER_ID")
USING INDEX
;
まずはテーブル定義
Enterprise ArchitectのAutoNumを利用すると、SEQUENCEとTRIGGERがセットで出てしまうため、AutoNumを利用しないようにします。また、少し手間になってしまいますがSEQUENCEを出力するために、シーケンスオブジェクトを作成します。
そして、サロゲートキーの初期値にシーケンスを利用するようにします。シーケンスを自動生成に任せる場合はIDENTITYを利用すれば良いため、シーケンスオブジェクトは作成しなくても問題ありません。
テンプレート修正
メニューの「コード」->「テンプレート」を選択します。表示されたDDLテンプレートエディタで、言語を「Oracle」を選択し、「DDL Create Table」を修正していきます。
Build definition of Columns以降の部分に、下記の青色の定義を追加します。こうすることで出力するCREATE TABLEの後ろの部分に共通カラムを全テーブルに追加できます。
$remark = "----------------- Build definition of columns -------------------"
$tableContent = %list="DDLColumnDefinition" @separator="\n" @indent="\t"%
$tableContent += "\n"
$comment = "★★★★★★★★★★★★★★★★★★★共通カラムの設定★★★★★★★★★★★★★★★★★★★
$tableContent += "\t CREATE_DATETIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,\n"
$tableContent += "\t CREATE_USER VARCHAR2(20) DEFAULT 'system' NOT NULL,\n"
$tableContent += "\t UPDATE_DATETIME TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,\n"
$tableContent += "\t UPDATE_USER VARCHAR2(20) DEFAULT 'system' NOT NULL,\n"
$tableContent += "\t VERSION_NO NUMBER(20) DEFAULT 0 NOT NULL"
$tableContent += ","
%if ddlOptionGenerateSeparateConstraint != "T"%
$remark = "----------------- When PK, FK, uniques, checks are create inline with table -------------------"
設定する作業としてはこれですべてです。DDLの生成を実施すると、最終的に出力したいDDLが出力されると思います。
その他TIPS
テーブル定義でカラムに設定した別名を、カラムコメントとして出力したい際もテンプレート修正で対応可能です。
DDLテンプレートエディタを開き、「DDL Column Comment」を下記のように修正します。もともとは%ddlColumnComment%だけだった部分に%ddlColumnAlias%を追加しています。
%ddlColumnComment%はカラムの設定の右下の入力欄が設定されます。%ddlColumnAlias%に別名が設定されます。
%if ddlOptionColumnComments != "T"%
%endTemplate%
$colName = %DDLName("EA", "COLUMN")%
%if $colName==""%
%endTemplate%
$sComment = %ddlColumnAlias% + ":" + %ddlColumnComment%
%if $parameter1 != "FORCE"%
%if $sComment == ""%
%endTemplate%
%endIf%
$SnapShotName = %DDLName("EA", "TABLE", "INCLUDE_OWNER")% + "." + %DDLName("EA", "COLUMN")%
%EXECUTE_CURRENT($SnapShotName, "Column Comment", 110)%
COMMENT ON COLUMN %DDLName("EA", "TABLE", "INCLUDE_OWNER", "INCLUDE_SURROUND")%.%DDLName("EA", "COLUMN", "", "INCLUDE_SURROUND")% IS '%REPLACE($sComment, "'", "''")%'
%PI("I", "")%
%DDLStatementTerm%
テンプレートを設定し、DDLの生成のオプションでコメントを出力するように設定して出力すると下記のとおりDDL出力が変更されます。
(デフォルト)COMMENT ON COLUMN "ORDER"."ORDER_DATE" IS 'ddlColumnComment';
↓
(テンプレート修正後)COMMENT ON COLUMN "ORDER"."ORDER_DATE" IS '注文日:ddlColumnComment';
ということで、他にもいろいろテンプレートを修正することでAutoNum設定を活かした状態でOracleのDDLを出すこともできるかもしれませんが、今回は方法のひとつとして本手段を紹介しました。