データ変更通知(FireDAC)

提供: Appmethod Topics
移動先: 案内検索

コマンドの操作(FireDAC) への移動


このトピックでは、一部のデータベースのデータ変更通知を使用する基本手順を説明します。


概要

データ変更通知機能は、データベース内のデータの変更(挿入、更新、削除などの操作)を追跡し、その変更をデータベース クライアントに通知します。

変更通知の方法は DBMS によって異なります。このトピックでは、InterBase におけるこの機能について説明します。 他のデータベースについては、「データベース警告」を参照してください。

InterBase の変更ビュー

変更ビュー™ 機能は、InterBase の複数世代アーキテクチャを使用して、データの変更を追跡します。この機能により、"前回参照してから、どのようなデータが変更されたか" という質問にすばやく答えることができます。

これまでは、それを実現するのに、トリガ、ログ記録、または、先行書き込みトランザクション ログのスクレイピングが必要でした。これは開発者にとって時間のかかる作業であり、トランザクション負荷や変更量によっては、データベース パフォーマンスにも影響を及ぼしました。今では、変更ビューにより、変更されたデータの一貫したビューが他のトランザクションからも参照可能な形で維持管理されているため、既存のトランザクションにパフォーマンスのオーバーヘッドは発生しません。

詳細は、「変更ビュー」を参照してください。

変更ビュー機能の使用

InterBase XE7 では、TFDEventAlerter コンポーネント(データベース イベント アラータ)を使って通知システムを実装することができます。

このセクションでは、InterBase テーブルに対する変更を追跡するデモ VCL アプリケーション(Object Pascal および Appmethod C++)の、基本的な作成手順を説明します。次の点について説明します。

  • デモ用 InterBase データベースと変更ビューへのサブスクリプションの作成
  • InterBase データベースへの接続
  • データベースのレコードの表示と編集
  • データ変更通知へのサブスクライブ
  • データ変更イベントの処理

変更ビュー データベースをセットアップする

デモ アプリケーションを作成する前に、デモ データベースと変更ビューへのサブスクリプションを作成する必要があります。

Appmethod をセットアップすると、上記操作を実行するために役立つ 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 スクリプトを実行するには:

  1. C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic フォルダに移動します。
  2. コマンド プロンプトに以下の構文を入力します。
isql.exe -i create.sql


メモ: デフォルトでは、isql.exe は Appmethod のセットアップ時に C:\Program Files (x86)\Embarcadero\Studio\16.0\InterBaseXE7\bin\ にインストールされます。

このスクリプトは、InterBase データベース C:\sub.ib、変更ビューへのサブスクリプション 'sub'、および、このデータベースの 'tab' テーブルに変更が加えられると起動されるトリガを作成します。

変更ビュー デモ アプリケーションをセットアップする

これで、C:\sub.ib データベースに対する変更を追跡するデモ アプリケーションの作成と構成を行うことができます。アプリケーションのフォームは次の画面のようなものです。

IB Connect VCL form.png

メモ: このセクションは、「FireDAC ファースト ステップ ガイド」のデモ データベースに接続する単純な VCL アプリケーションの開発手順を読んで理解していることを前提としています。その手順に従って、上記画面のようなユーザー インターフェイスを作成してください。

以下の手順で FireDAC コンポーネントを構成します。

  1. フォーム デザイナFDConnection1 を右クリックし、ショートカット メニューの[接続エディタ...]を選択します。[FireDAC 接続エディタ]で以下を行います。
    • [定義]タブを開き、[ドライバ ID]のリストから IB を選択します。
    • 以下の接続パラメータを指定して[OK]をクリックします。
      • Database = C:\SUB.IB
      • User_Name = sysdba
      • Password = masterkey
      • Protocol = TCPIP
      • Server = 127.0.0.1
  2. FDQuery1 を選択し、[オブジェクト インスペクタ]で以下のプロパティを指定します。
    • ChangeAlerter = FDEventAlerte1
    • Connection = FDConnection1
    • ChangeAlertName = tab - 必ず変更を追跡するテーブルの名前を指定します。
    • SQL = select * from tab
  3. DataSource1 を選択し、DataSet プロパティを FDQuery1 に設定します。
  4. FDEventAlerter1 を選択し、SubscriptionName プロパティを sub に設定します。
  5. DBGrid1 を選択し、DataSource プロパティを DataSource1 に設定します。

次に、デモ データセットを開いてデータベース テーブルへの変更を追跡できるようにする Open DB ボタンの OnClick イベント ハンドラを構成しなければなりません。

Open DB ボタンの OnClick イベント ハンドラを実装するには:

  1. フォーム デザイナOpen DB ボタンをダブルクリックします。
  2. コード エディタで以下のコードを指定します。
    Object Pascal の場合:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
          FDQuery1.Active := True;
          FDQuery1.ChangeAlerter.Active :=True;
    end;
    
    Appmethod C++ の場合:
    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 Appmethod 1.17|サンプル] を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic を開いてください。

ここでは、デモ データセットに加えられた変更を検出すると発生する TFDCustomEventAlerter.OnAlert イベント ハンドラを使用します。このイベント ハンドラで、データ変更通知に応答するカスタム シナリオを実装することができます。


OnAlert イベント ハンドラを実装するには:

  1. フォーム デザイナFDEventAlerter1 を選択します。
  2. [オブジェクト インスペクタ][イベント]タブを開き、OnAlert の隣をダブルクリックします。
  3. コード エディタで以下のコードを指定します。
    Object Pascal の場合:
    procedure TForm1.FDEventAlerter1Alert(ASender: TFDCustomEventAlerter;
      const AEventName: string; const AArgument: Variant);
    begin
    ShowMessage('Detected changes to the demo dataset.');
    end;
    
    Appmethod C++ の場合:
    void __fastcall TForm1::FDEventAlerter1Alert(TFDCustomEventAlerter *ASender, const UnicodeString AEventName,
              const Variant &AArgument)
    {
      ShowMessage("Detected changes to the demo dataset. ");
    }
    

サンプル アプリケーションを実行する

このアプリケーションを以下のようにして実行します。

  1. [プロジェクト マネージャ]でターゲット プラットフォームを選択します(サポートされているプラットフォームは Win32 と Win64 です)。
  2. Shift+Ctrl+F9 を押して、デバッガを使わずにアプリケーションを実行します。

以下のシナリオを使ってアプリケーションをテストします。

  1. [Open DB]ボタンをクリックします。
  2. 任意の行の[Name]の列を変更します。
  3. 他の行をクリックして変更を適用します。

変更を検出すると、アプリケーションによって情報のメッセージ ボックスが表示されます。

InterBase test.png

変更通知のサポート

以下の表は、各 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 Appmethod 1.17|サンプル] を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic を開きます。
  • [スタート|プログラム|Embarcadero Appmethod 1.17|サンプル] を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\MSSQL\QueryNotify を開きます。

関連項目