データ変更通知(FireDAC)
目次
コマンドの操作(FireDAC) への移動
データ変更通知機能を使用すると、データベースのデータの変更をデータベース クライアントに通知することができます。この機能は、データベース内のデータに対する変更(INSERT
、UPDATE
、DELETE
操作など)を追跡し、その変更をデータベース クライアントに通知します。
FireDAC では、さまざまなデータベースについてこの変更通知機能をサポートしています(「変更通知のサポート」を参照)。ただし、FireDAC がこの機能を実装している方法は、データベースの種類によって異なります。このトピックでは、FireDAC データ変更通知機能の一般的な情報を説明し、それから DBMS ごとの実装について考慮します。
データベース警告メカニズムの詳細は、「データベース警告」を参照してください。
FireDAC データ変更通知機能のセットアップ
FireDAC アプリケーションでデータ変更通知機能をセットアップするには、次の主要コンポーネントを追加して構成する必要があります。
- TFDConnection オブジェクト - DBMS に接続するための FireDAC 接続オブジェクトです。
- メモ: このセクションは、「FireDAC ファースト ステップ ガイド」のデモ データベースに接続する単純な VCL アプリケーションの開発手順を読んで理解していることを前提としています。
- TFDQuery オブジェクト - SQL クエリを実行できるデータセットを実装するための FireDAC オブジェクトです。追跡対象の SQL クエリの次の基本プロパティを構成します。
- Connection プロパティ: FireDAC 接続オブジェクトを指定するにはこのプロパティを設定する必要があります。
- SQL プロパティ: ここに実行したい SQL 文を設定する必要があります。
- ChangeAlerter プロパティ: データセットと関連付けられた FireDAC アラータ オブジェクトを指定するには、このプロパティを設定する必要があります。
- ChangeAlertName プロパティ: この設定で、変更を追跡する対象となるベース テーブルの名前を指定することができます。
- TFDEventAlerter オブジェクト - データベース変更通知を処理するオブジェクトです。イベント アラータの次の基本プロパティを構成します。
- Options プロパティ: イベント アラータの動作を制御する一連のプロパティを指定することができます。
- SubscriptionName プロパティ: 変更通知のサブスクリプション名を指定するには、このプロパティを設定する必要があります。これは使用するデータベースの種類に応じて異なります。
- メモ: TFDEventAlerter は追跡対象の TFDQuery を実行する前にアクティブ化してください。実行前にクエリ通知 API に文を登録する必要があるためです。これは SQL Server と Oracle の要件です。
変更通知への応答
FireDAC は、データ変更通知を受け取ると、自動的に変更を取得しデータセットを更新します。この処理は、TFDEventAlerter コンポーネントの以下のプロパティで制御します。
- FireDAC.Comp.Client.TFDCustomEventAlerter.Options.AutoRefresh
- FireDAC.Comp.Client.TFDCustomEventAlerter.Options.Timeout
- FireDAC.Comp.Client.TFDCustomEventAlerter.Options.MergeData
「個別 DBMS のデータ変更通知」に挙げたどのデモ プロジェクトでも、上記のシナリオの使用方法が示されています。
さらに、追跡対象のデータセットに加えられた変更を検出すると発生する TFDCustomEventAlerter.OnAlert イベント ハンドラを使用することもできます。このイベント ハンドラで、データ変更通知に応答するカスタム シナリオを実装することができます。次のコードでは、データベース上のどれかのデータが変更されるとメッセージを表示するよう OnAlert イベント ハンドラを実装しています。
procedure TForm1.FDEventAlerter1Alert(ASender: TFDCustomEventAlerter;
const AEventName: string; const AArgument: Variant);
begin
ShowMessage('Detected changes to the demo dataset.');
end;
void __fastcall TForm1::FDEventAlerter1Alert(TFDCustomEventAlerter *ASender, const UnicodeString AEventName,
const Variant &AArgument)
{
ShowMessage("Detected changes to the demo dataset. ");
}
変更通知のサポート
以下の表は、各 DBMS で使われる変更通知メカニズムの情報をまとめたものです。
DBMS | 変更通知の種類 | 差分の種類 | TFDEventAlerter.SubscriptionName |
---|---|---|---|
InterBase | イベント アラータ(手動通知) | 変更ビュー(自動差分) | InterBase 変更ビュー サブスクリプション名 |
MS SQL Server | クエリ更新通知(自動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Oracle | DBMS_ALERT/DBMS_PIPE(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
連続問合せ通知(CQN) | 自動差分 | 任意の値 | |
Advantage Database | イベント アラータ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Sybase SQL Anywhere | メッセージ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
DataSnap サーバー | コールバック(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
DB2 | DBMS_ALERT/DBMS_PIPE(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Firebird | イベント アラータ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
Informix | DBMS_ALERT(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
PostgreSQL | イベント通知(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
SQLite | イベント アラータ(手動通知) | なし(データセット全体の更新) | 通知メッセージ テキスト |
個別 DBMS のデータ変更通知
このセクションでは、データ変更通知機能を実装する際に、データベースごとに考慮しなければならない点を説明します。
InterBase の変更ビュー
InterBase では、変更ビュー機能という方法でデータ変更通知を実装しています。詳細は、「変更ビュー」を参照してください。
変更ビュー機能を使用する InterBase アプリケーションを開発する前に、変更ビューに対するサブスクリプションを作成する必要があります。次のコードは、サブスクリプションを作成する方法の例です。
/* Create the xxx subscription to track changes to the 'yyy' table */
CREATE SUBSCRIPTION xxx ON yyy FOR ROW (INSERT, UPDATE, DELETE);
変更ビュー機能の構成方法の詳細は、次の場所にあるデモ プロジェクトを参照してください。
- [スタート|プログラム|Embarcadero RAD Studio Sydney|サンプル]を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\InterBase\ChangeView\Generic を開きます。
Oracle CQN
連続問合せ通知(CQN)機能は、Oracle で実装されているデータ変更通知機能です。詳細は、「Continuous Query Notification(連続問合せ通知)」を参照してください。
Oracle CQN 機能を構成する際には、次の点を考慮する必要があります。
- Oracle クライアントに変更通知権限が必要です。次のコードは、ユーザーにこの権限を与える方法の例です。
/* Give change notification privilege to the xxx Oracle user */ GRANT DBMS_CHANGE_NOTIFICATION TO xxx;
- SQL プロパティでは、ベース テーブルの
SELECT
リストにROWID
の列を含める必要があります。例:SELECT t.ROWID, t.* FROM table t
- メモ: 識別子
ROWID
は、データベース内の行の一意識別フィールドです。テーブルに行を挿入したときに作成され、行を削除したときに破棄されます。ROWID の値にはいくつかの重要な用途があります。たとえば、ROWID を使用すると 1 つの行に最も速くアクセスできます。
- メモ: 識別子
- TFDEventAlerter オブジェクトのプロパティを次のように構成します。
- Options.Kind プロパティを
QueryNotifies
に設定します。 - SubscriptionName プロパティを任意の値に設定します。このプロパティを空にしておくことはできません。空の場合、クエリは増分リフレッシュではなく完全リフレッシュされます。
- Options.Kind プロパティを
Oracle CQN 機能の構成方法の詳細は、FireDAC Oracle CQN サンプルを参照してください。
Oracle の既知の問題
11.2 クライアント ソフトウェアの一部のバージョンでは、11.2 データベースの一部のバージョンに関する変更通知、OCI コールバック、アドバンスト キューイング(AQ)通知を受け取ることができません。これは Oracle の既知の問題です。詳細情報は Oracle のページで入手することができます。
Microsoft SQL
MSSQL データベースのデータ変更通知機能の構成方法の詳細は、次の場所にあるデモ プロジェクトを参照してください。
- [スタート|プログラム|Embarcadero RAD Studio Sydney|サンプル]を選択し、Object Pascal\Database\FireDAC\Samples\DBMS Specific\MSSQL\QueryNotify を開きます。