テーブルトリガー

最終公開日 : Sep 16, 2026

はじめに

トリガーは、作成、更新、削除などの操作がテーブルに対して実行されるときに暗黙的かつ自動的に実行されるプロシージャを定義します。
トリガーは、イベント (挿入、削除、更新) の直前または直後に実行できます。
DSL (ドメイン固有言語) はテーブルトリガーを定義するために使用されます。DSL の詳細については、リファレンス を参照してください。
テーブルトリガーを作成するには、データモデルアシスタント (DMA) を使用します。
テーブルトリガーのスクリプトを編集および変更するには、コンテキストコード補完を提供する EBX IDE を使用します。

初期スクリプト

はじめに

DMA を使用してテーブルトリガーを初めて編集すると、EBX® はエクスポートされたプロシージャの正しい定義を含む初期スクリプトを提供します。
テーブルトリガーの初期スクリプトの構造は次のとおりです。
<unit usage statement 1>
<unit usage statement 2>
...
<unit usage statement N>

export procedure trigger_signature_name()
begin
  ...
  <statement 1>
  <statement 2>
  ...
end
次のスクリプトは、before create トリガーの例です。
// this trigger calculates automatically the total and the percentage of students marks.
export procedure onBeforeCreate()
Begin
_ebx.record.total := _ebx.record.subj1 + _ebx.record.subj2 + _ebx.record.subj3;
_ebx.record.per :=(_ebx.record.total/60)*100;
end
次のスクリプトは、before modify トリガーの例です。
// this trigger updates automatically the last modification date.
uses core.datetime as datetime;
export procedure onBeforeModify()
begin
_ebx.record.lastModificationDate := datetime.now();
end

エクスポート済みプロシージャ

エクスポート済みプロシージャは、EBX® によって直接呼び出すことができます。テーブルトリガー内のスクリプトごとに、エクスポート済みプロシージャは 1 つだけ許可されます。
テーブルトリガープロシージャのシグネチャは次のとおりです。
  • onNewContext() : レコードの新しいコンテキストが作成された時に呼び出されます。
  • onBeforeCreate() :レコードが作成される前に呼び出されます。
  • onAfterCreate() :レコードの作成後に呼び出されます。
  • onBeforeModify() :レコードが変更される前に呼び出されます。
  • onAfterModify() :レコードの変更後に呼び出されます。
  • onBeforeDelete() :レコードを削除する前に呼び出されます。
  • onAfterDelete() :レコードを削除した後に呼び出されます。
  • onBeforeTransactionCancel() :キャンセルの前に呼び出されます。
  • onBeforeTransactionCommit() :コミット前に呼び出されます。
注意:エクスポートされたプロシージャのシグネチャ (名前) はトリガーのタイプによって異なり、変更しないでください。

事前定義された変数

はじめに

定義済み変数を使用すると、テーブルトリガーのコンテキストにアクセスできます。次のコンテキスト変数は、テーブルトリガーに固有のものです。一般的な定義済み変数の詳細については、リファレンス を参照してください。

セッション

定義済み変数 \_ebx.session は、現在のセッションに関する情報へのアクセスを提供します。このコンテキスト変数は定数であり、不変の複合型です。
次のフィールドがあります。
名前 タイプ 説明
userId string 現在のユーザーの識別子
userEmail string 現在のユーザーのメールアドレス
locale string 現在のセッションのロケール
例
// this triggers logs information of the current session.
uses core.log as log;
export procedure onNewContext()
begin
var message := ' Session locale : ' | _ebx.session.locale;
message |= '\n User id : ' | _ebx.session.userId;
message |= '\n User email: ' | _ebx.session.userEmail;
log.info(message);
end

レコード

定義済み変数 \_ebx.record を使用すると、作成、更新、または削除する現在のレコードへの読み取り/書き込みアクセスが可能になります。そのフィールドは、現在の EBX® スキーマによって定義されます。
例
// This trigger adds the full name and the modification date of a new created person.
uses core.datetime as datetime;
export procedure onBeforeCreate()
begin
  _ebx.record.inscriptionDate := datetime.now();
  _ebx.record.fullName := _ebx.record.firstName | ' ' | _ebx.record.lastName;
end

NextRecord

定義済み変数 \_ebx.nextRecord を使用すると、次に更新するレコードへの読み取り/書き込みアクセスが可能になります。この変数は、onBeforeModify トリガーでのみ使用できます。この変数は、現在の EBX® スキーマによって定義されます。
例
uses core.datetime as datetime;
export procedure onBeforeModify()
Begin

   if (_ebx.nextRecord.phone <> _ebx.record.phone) then
   begin
   _ebx.nextRecord.phoneChangeDate := datetime.now();
   _ebx.nextRecord.description := 'old phone number is  ' | _ebx.record.phone | '
   and New Phone number is ' | _ebx.nextRecord.phone ;
   end
 end

PreviousRecord

定義済み変数 \_ebx.previousRecord を使用すると、更新後に前のレコードへの読み取り専用アクセスが可能になります。これは OnAfterModify トリガーでのみ使用できます。これは現在の EBX® スキーマによって定義されます。
例
// This trigger logs all data modifications of the table sales.
uses core.log as log;
uses core.datetime as datetime;
export procedure OnAfterModify( )
begin
var message := ' Sales id : ' | _ebx.record.sales_id;
message |= '\n Previous amount : ' | _ebx.previousRecord.amount;
message |= '\n Current amount : ' |  _ebx.record.amount;
message |= '\n Updated on : ' | datetime.now( );
log.info(message);
end

トランザクション

定義済み変数 \_ebx.transaction は、トリガーの現在のトランザクションへの読み取り専用アクセスを提供します。これは、テーブルトリガーとデータセットトリガーのコンテキストでのみ使用できます。この変数は定数であり、変更不可能な複合型です。トランザクションは、データスペースでいくつかの操作 (レコードの更新、変更、削除など) を実行するために必要です。これにより、アクションが失敗しても、データの整合性状態が損なわれることはありません。
例
uses core.data as d;
// The trigger creates a new record in a table.
export procedure onAfterCreate()
begin
var tableA := d.findTable<.tableName>(_ebx.dataset)
var recordA:= d.recordOf(_ebx.transaction, tableA);
// Update the record.
...
d.saveRecord(recordA);
end