データ変更通知(FireDAC)
目次
コマンドの操作(FireDAC) への移動
このトピックでは、一部のデータベースのデータ変更通知を使用する基本手順を説明します。
概要
データ変更通知機能は、データベース内のデータの変更(挿入、更新、削除などの操作)を追跡し、その変更をデータベース クライアントに通知します。
変更通知の方法は DBMS によって異なります。このトピックでは、InterBase におけるこの機能について説明します。 他のデータベースについては、「データベース警告」を参照してください。
InterBase の変更ビュー
変更ビュー™ 機能は、InterBase の複数世代アーキテクチャを使用して、データの変更を追跡します。この機能により、"前回参照してから、どのようなデータが変更されたか" という質問にすばやく答えることができます。
これまでは、それを実現するのに、トリガ、ログ記録、または、先行書き込みトランザクション ログのスクレイピングが必要でした。これは開発者にとって時間のかかる作業であり、トランザクション負荷や変更量によっては、データベース パフォーマンスにも影響を及ぼしました。今では、変更ビューにより、変更されたデータの一貫したビューが他のトランザクションからも参照可能な形で維持管理されているため、既存のトランザクションにパフォーマンスのオーバーヘッドは発生しません。
詳細は、「変更ビュー」を参照してください。
変更ビュー機能の使用
InterBase XE7 では、TFDEventAlerter コンポーネント(データベース イベント アラータ)を使って通知システムを実装することができます。
このセクションでは、InterBase テーブルに対する変更を追跡するデモ VCL アプリケーション(Delphi および C++Builder)の、基本的な作成手順を説明します。次の点について説明します。
- デモ用 InterBase データベースと変更ビューへのサブスクリプションの作成
- InterBase データベースへの接続
- データベースのレコードの表示と編集
- データ変更通知へのサブスクライブ
- データ変更イベントの処理
変更ビュー データベースをセットアップする
デモ アプリケーションを作成する前に、デモ データベースと変更ビューへのサブスクリプションを作成する必要があります。
RAD Studio をセットアップすると、上記操作を実行するために役立つ create.sql
スクリプトが作成されます。このスクリプトの、InterBase デモ データベースと変更ビューへのサブスクリプションを作成する部分を、次に挙げておきます。
/* Create a demo database */ CREATE DATABASE 'C:\SUB.IB' USER 'SYSDBA' PASSWORD 'masterkey' DEFAULT CHARACTER SET UTF8;
/* Create a trigger that fires after updating the 'tab' table */ CREATE TRIGGER tr_tab_after_upd FOR tab ACTIVE AFTER UPDATE POSITION 0 AS BEGIN POST_EVENT 'TAB'; END
/* Create a subscription to track changes to the 'tab' table */ CREATE SUBSCRIPTION sub ON tab FOR ROW (INSERT, UPDATE, DELETE); /* Insert data to the 'tab' table */ INSERT INTO tab (name) VALUES ('Alex Simpson'); INSERT INTO tab (name) VALUES ('Nicole Burns'); INSERT INTO tab (name) VALUES ('Peter Pauls');
create.sql
スクリプトは C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic\connect.sql
にあります。
create.sql スクリプトを実行するには:
C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic
フォルダに移動します。- コマンド プロンプトに以下の構文を入力します。
isql.exe -i create.sql
メモ: デフォルトでは、
isql.exe
は RAD Studio のセットアップ時にC:\Program Files (x86)\Embarcadero\Studio\16.0\InterBaseXE7\bin\
にインストールされます。
このスクリプトは、InterBase データベース C:\sub.ib、変更ビューへのサブスクリプション 'sub'、および、このデータベースの 'tab' テーブルに変更が加えられると起動されるトリガを作成します。
変更ビュー デモ アプリケーションをセットアップする
これで、C:\sub.ib
データベースに対する変更を追跡するデモ アプリケーションの作成と構成を行うことができます。アプリケーションのフォームは次の画面のようなものです。
メモ: このセクションは、「FireDAC ファースト ステップ ガイド」のデモ データベースに接続する単純な VCL アプリケーションの開発手順を読んで理解していることを前提としています。その手順に従って、上記画面のようなユーザー インターフェイスを作成してください。
以下の手順で FireDAC コンポーネントを構成します。
- フォーム デザイナで FDConnection1 を右クリックし、ショートカット メニューの[接続エディタ...]を選択します。[FireDAC 接続エディタ]で以下を行います。
- [定義]タブを開き、[ドライバ ID]のリストから IB を選択します。
- 以下の接続パラメータを指定して[OK]をクリックします。
- Database =
C:\SUB.IB
- User_Name =
sysdba
- Password =
masterkey
- Protocol =
TCPIP
- Server =
127.0.0.1
- Database =
- FDQuery1 を選択し、[オブジェクト インスペクタ]で以下のプロパティを指定します。
- ChangeAlerter =
FDEventAlerte1
- Connection =
FDConnection1
- ChangeAlertName =
tab
- 必ず変更を追跡するテーブルの名前を指定します。 - SQL =
select * from tab
- ChangeAlerter =
- DataSource1 を選択し、DataSet プロパティを
FDQuery1
に設定します。 - FDEventAlerter1 を選択し、SubscriptionName プロパティを
sub
に設定します。 - DBGrid1 を選択し、DataSource プロパティを
DataSource1
に設定します。
次に、デモ データセットを開いてデータベース テーブルへの変更を追跡できるようにする Open DB ボタンの OnClick イベント ハンドラを構成しなければなりません。
Open DB ボタンの OnClick イベント ハンドラを実装するには:
- フォーム デザイナで Open DB ボタンをダブルクリックします。
-
コード エディタで以下のコードを指定します。
Delphi の場合:
procedure TForm1.Button1Click(Sender: TObject); begin FDQuery1.Active := True; FDQuery1.ChangeAlerter.Active :=True; end;
C++Builder の場合:
void __fastcall TForm1::Button1Click(TObject *Sender) { FDQuery1->Active = true; FDQuery1->ChangeAlerter->Active = true; }
変更通知に応答する
FireDAC は、データ変更通知を受け取ると、自動的に変更を取得しデータセットを更新します。この処理は、TFDEventAlerter コンポーネントの以下のプロパティで制御します。
- TFDEventAlerter.Options.AutoRefresh
- TFDEventAlerter.Options.Timeout
- TFDEventAlerter.Options.MergeData
デモ プロジェクト IBChangeView では、上記シナリオの使い方を示しています。このプロジェクトにアクセスするには、[スタート|プログラム|Embarcadero RAD Studio 10 Seattle|サンプル] を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic を開いてください。
ここでは、デモ データセットに加えられた変更を検出すると発生する TFDCustomEventAlerter.OnAlert イベント ハンドラを使用します。このイベント ハンドラで、データ変更通知に応答するカスタム シナリオを実装することができます。
OnAlert イベント ハンドラを実装するには:
- フォーム デザイナで FDEventAlerter1 を選択します。
- [オブジェクト インスペクタ]で[イベント]タブを開き、OnAlert の隣をダブルクリックします。
- コード エディタで以下のコードを指定します。
Delphi の場合:
procedure TForm1.FDEventAlerter1Alert(ASender: TFDCustomEventAlerter; const AEventName: string; const AArgument: Variant); begin ShowMessage('Detected changes to the demo dataset.'); end;
C++Builder の場合:
void __fastcall TForm1::FDEventAlerter1Alert(TFDCustomEventAlerter *ASender, const UnicodeString AEventName, const Variant &AArgument) { ShowMessage("Detected changes to the demo dataset. "); }
サンプル アプリケーションを実行する
このアプリケーションを以下のようにして実行します。
- [プロジェクト マネージャ]でターゲット プラットフォームを選択します(サポートされているプラットフォームは Win32 と Win64 です)。
Shift+Ctrl+F9
を押して、デバッガを使わずにアプリケーションを実行します。
以下のシナリオを使ってアプリケーションをテストします。
- [Open DB]ボタンをクリックします。
- 任意の行の[Name]の列を変更します。
- 他の行をクリックして変更を適用します。
変更を検出すると、アプリケーションによって情報のメッセージ ボックスが表示されます。
変更通知のサポート
以下の表は、各 DBMS で使われる変更通知メカニズムの情報をまとめたものです。
DBMS | 変更通知の種類 | 差分の種類 | TFDEventAlerter.SubscriptionName |
---|---|---|---|
InterBase | イベント アラータ(手動通知) | 変更ビュー(自動差分) | InterBase 変更ビュー サブスクリプション名 |
MS SQL Server | クエリ更新通知(自動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Oracle | DBMS_ALERT/DBMS_PIPE(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Advantage Database | イベント アラータ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Sybase SQL Anywhere | メッセージ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
DataSnap サーバー | コールバック(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
DB2 | DBMS_ALERT/DBMS_PIPE(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Firebird | イベント アラータ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Informix | DBMS_ALERT(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
PostgreSQL | イベント通知(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
SQLite | イベント アラータ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
デモ プロジェクト
詳細は、以下のデモ プロジェクトを参照してください。
- [スタート|プログラム|Embarcadero RAD Studio 10 Seattle|サンプル] を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic を開きます。
- [スタート|プログラム|Embarcadero RAD Studio 10 Seattle|サンプル] を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\MSSQL\QueryNotify を開きます。