Enterprise Architectでテンプレートを変更しOracle用のDDLを出力する

Enterprise Architect,UML(Unified Modeling Language),開発環境・ツール

こんにちは。ソリューション開発部の栗田です。

ソリューション開発部では、DB設計をおこなう際にEnterprise Architectというツールを利用しています。

DB設計をおこない、いざDDLを出力し実行すると、DBがOracleの場合に私の環境ではエラーが発生してしまいました。そういった場合に対応する方法と、テンプレートを修正しすべてのテーブルに設定する共通カラムを出力する方法を紹介します。

今回の記事で利用しているEnterprise ArchitectのVersionは15.0.1513です。

出力対象のテーブル

今回はテンプレート修正の紹介のため、シンプルなテーブル構造を出力してみます。注文テーブルにサロゲートキーがあり、そのキーにAutoNumをTrue設定しています。また、登録日時や更新日時などの共通のカラムはテンプレートで追加するためテーブル定義には含めていません。

注文テーブル
注文テーブルのテーブル定義

DDLの出力(テンプレート修正前)

この内容でメニューの「コード」->「DDLの生成」を選択し、下記のオプションを指定しDDLを作成すると、SEQUENCEとTRIGGERを利用したDDLが出力されます。

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を出すこともできるかもしれませんが、今回は方法のひとつとして本手段を紹介しました。

  • 株式会社アークシステムの予約・来訪管理システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix