Alertes des bases de données (FireDAC)
Remonter à Utilisation des commandes (FireDAC)
L'alerte SGBD fait référence à une notification ou une alerte de base de données envoyée par un déclencheur ou une procédure stockée de base de données à un client de base de données dans le but de lui notifier des événements.
Une alerte est identifiée par un nom et peut contenir des arguments supplémentaires. Les clients s'enregistrent à des alertes. Plusieurs clients peuvent s'enregistrer à une seule alerte et un seul client peut s'enregistrer à plusieurs alertes. Lorsqu'une alerte est signalée dans une base de données, tous les clients enregistrés sont avisés. Lorsqu'une alerte n'est plus utilisée, l'application se désenregistre de cette alerte.
Voici des exemples d'alertes standard :
- Une modification des données d'une table. Dans ce cas, une application actualise un ensemble de données renvoyant ces données de table.
- Une notification concernant une condition remplie dans les données.
- Une notification envoyée à d'autres applications, signalant qu'une application spécifique va effectuer une tâche particulière, telle que l'archivage ou la sauvegarde de données.
Chaque SGBD implémente des alertes SGBD qui lui sont propres. Il n'existe aucune norme pour les mécanismes d'alerte.
Utilisation de TFDEventAlerter
FireDAC fournit des API d'alertes unifiées, telles que le composant TFDEventAlerter. Certains SGBD peuvent implémenter quelques mécanismes d'alerte de SGBD. Chaque objet TADEventAlerter écoute plusieurs alertes en indiquant leur nom dans la propriété TFDEventAlerter.Names et en utilisant un mécanisme unique spécifié par la propriété Options.Kind.
FireDAC écoute les alertes dans un thread en arrière-plan par le biais d'une connexion privée supplémentaire établie avec la base de données. Cette connexion supplémentaire est créée automatiquement par FireDAC pour chaque composant TFDEventAlerter. Lorsque l'application crée plusieurs objets TFDEventAlerter, pensez à utiliser les connexions mises en pool pour améliorer les performances.
Pour commencer à recevoir les alertes d'événements, indiquez dans la propriété TFDEventAlerter.Names les noms d'événements requis. Définissez Options.Kind sur le type d'alerte d'événement ou laissez cette propriété vide pour utiliser l'alerte par défaut. Indiquez le gestionnaire d'événement OnAlert déclenché lorsqu'un événement se produit et définissez la propriété Active sur True ou appelez la méthode Register. Pour ne plus recevoir les alertes d'événements, définissez la propriété Active sur False ou appelez Unregister.
Le gestionnaire d'événement OnAlert peut être appelé dans des contextes de thread principaux ou d'arrière-plan. Utilisez la propriété Options.Synchronize pour contrôler ce comportement.
- Remarque : L'application doit réduire l'exécution du gestionnaire de thread en arrière-plan.
L'application définit le dépassement du délai d'attente des alertes en spécifiant la propriété Options.Timeout. Lorsqu'il n'y a plus d'alertes pour une période spécifiée, le gestionnaire d'événement OnTimeout est appelé.
Par exemple, pour s'enregistrer à l'alerte "Customers" à l'aide du mécanisme "DBMS_ALERT" sur la base de données Oracle et du mécanisme Firebird standard, utilisez le code suivant :
FDEventAlerter1.Names.Clear;
FDEventAlerter1.Names.Add('Customers');
case FDConnection1.RDBMSKind of
mkOracle: FDEventAlerter1.Options.Kind := 'DBMS_ALERT';
mkInterbase: FDEventAlerter1.Options.Kind := 'Events';
end;
FDEventAlerter1.Options.Synchronize := True;
FDEventAlerter1.Options.Timeout := 10000;
FDEventAlerter1.OnAlter := DoAlert;
FDEventAlerter1.OnTimeout := DoTimeout;
FDEventAlerter1.Active := True;
// …
procedure TForm1.DoAlert(ASender: TFDCustomEventAlerter;
const AEventName: String; const AArgument: Variant);
begin
if CompareText(AEventName, 'Customers') = 0 then
qryCustomers.Refresh;
end;
procedure TForm1.DoTimeout(ASender: TObject);
begin
// …
end;
Pour Oracle, utilisez le code côté serveur suivant :
CREATE OR REPLACE TRIGGER TR_CUSTOMERS
AFTER INSERT OR UPDATE OR DELETE ON CUSTOMERS
BEGIN
SYS.DBMS_ALERT.SIGNAL('Customers', '123');
END;
Pour Firebird, utilisez le code suivant :
CREATE TRIGGER TR_CUSTOMERS FOR CUSTOMERS
ACTIVE AFTER INSERT OR UPDATE OR DELETE
BEGIN
POST_EVENT 'Customers';
END;
Mécanismes d'alerte des SGBD
Comme il a été noté plus haut, chaque SGBD implémente des alertes de base de données qui lui sont propres. Le type du mécanisme d'alerte est identifié par la valeur de la propriété TFDEventAlerterOptions.Kind. En l'absence de valeur spécifiée, le mécanisme par défaut est utilisé. Pour la plupart des mécanismes, les fonctionnalités côté client sont les mêmes, seules les fonctionnalités du côté de la base de données sont différentes.
Le tableau suivant présente le SGBD et ses mécanismes d'alerte qui sont supportés par les pilotes FireDAC :
SGBD | Type d'alerte d'événement | Description |
---|---|---|
Advantage Database | Evénements (*) | La fonctionnalité Evénements (Notifications) standard est utilisée. Pour lancer un événement, utilisez la procédure stockée sp_SignalEvent. Par exemple :
sp_SignalEvent('Customers', true, 0, '123');
|
Sybase SQL Anywhere | Message (*) | La fonctionnalité de l'instruction MESSAGE est utilisée. Pour lancer un événement, un message spécialement formaté de ce type : _FD_$$<nom_événement>[$$<argument>] doit être envoyé. Par exemple :
MESSAGE '_FD_$$Customers$$123' |
Serveur DataSnap | Rappels (*) | Les rappels avancés DataSnap sont utilisés (pour plus d'informations, voir Delphi Labs : DataSnap XE - Callbacks). Le contenu de TFDEventAlerter.Names doit avoir l'un des formats suivants :
|
DB2 | DBMS_ALERT (*) | Le package DBMS_ALERT est utilisé. Avant d'être utilisé, un DBA doit exécuter GRANT EXECUTE ON DBMS_ALERT TO <utilisateur ou groupe>. Pour lancer un événement, utilisez l'appel DBMS_ALERT.SIGNAL. Par exemple :
CALL DBMS_ALERT.SIGNAL('Customers', '123'); |
DBMS_PIPE | Le package DBMS_PIPE est utilisé. Avant d'être utilisé, un DBA doit exécuter GRANT EXECUTE ON DBMS_PIPE TO <utilisateur ou groupe>. Pour lancer un événement, utilisez l'appel DBMS_PIPE.SEND_MESSAGE. Par exemple :
BEGIN CALL DBMS_PIPE.PACK_MESSAGE(123); CALL DBMS_PIPE.SEND_MESSAGE('Customers'); END; | |
Firebird | Evénements (*) | Le mécanisme Firebird standard de notification d'événement est utilisé. Pour lancer un événement, utilisez l'instruction POST_EVENT <nom>. Par exemple :
EXECUTE BLOCK AS BEGIN POST_EVENT 'Customers'; END; |
Informix | DBMS_ALERT (*) | Le package DBMS_ALERT est utilisé à partir du package de compatibilité externe. Pour lancer un événement, utilisez l'appel DBMS_ALERT_SIGNAL. Par exemple :
EXECUTE PROCEDURE DBMS_ALERT_SIGNAL('Customers', '123') |
Interbase | Evénements (*) | Le mécanisme InterBase standard de notification d'événement est utilisé. Pour lancer un événement, utilisez l'instruction POST_EVENT <nom> à partir d'un déclencheur ou d'une procédure stockée. Le lancement côté client n'est pas pris en charge. |
Microsoft SQL Server | QueryNotifies (*) | Le service de notification des mises à jour de requête est utilisé. Le contenu de TFDEventAlerter.Names doit avoir l'un des formats suivants :
Vous pouvez également spécifier ces paramètres dans Names:
ALTER DATABASE <nom_bd> SET ENABLE_BROKER |
MongoDB | Queue (*) |
Utilise un curseur en queue (EN) sur une collection plafonnée (EN) pour alerter des insertions. La propriété Names de l'alerte doit contenir une valeur unique un utilisant l'un des formats suivants pour indiquer la collection plafonnée cible :
Où :
Quand une insertion se produit, votre gestionnaire pour l'événement OnAlert reçoit le document inséré comme une chaîne JSON ( |
Oracle | DBMS_ALERT (*) | Le package DBMS_ALERT est utilisé. Avant d'être utilisé, un DBA doit exécuter GRANT EXECUTE ON DBMS_ALERT TO <utilisateur ou groupe>. Pour lancer un événement, utilisez l'appel DBMS_ALERT.SIGNAL. Par exemple :
BEGIN SYS.DBMS_ALERT.SIGNAL('Customers', '123'); END; |
DBMS_PIPE | Le package DBMS_PIPE est utilisé. Avant d'être utilisé, un DBA doit exécuter GRANT EXECUTE ON DBMS_PIPE TO <utilisateur ou groupe>. Pour lancer un événement, utilisez l'appel DBMS_PIPE.SEND_MESSAGE. Par exemple :
BEGIN SYS.DBMS_PIPE.PACK_MESSAGE(123); SYS.DBMS_PIPE.SEND_MESSAGE('Customers'); END; | |
QueryNotifies | La fonctionnalité Continuous Query Notification (CQN) est l'implémentation Oracle de la fonctionnalité Notifications de changements de données. Pour de plus amples informations, voir Oracle CQN et Continuous Query Notification (EN). | |
PostgreSQL | Notifie (*) | Le mécanisme de notification d'événement standard est utilisé. Pour lancer un événement, utilisez l'instruction NOTIFY <nom>. PostgreSQL 9.0 prenant en charge les arguments de charge utile, utilisez NOTIFY <nom> [, <charge_utile>]. Par exemple :
NOTIFY Customers |
SQLite | Evénements (*) | La fonction personnalisée POST_EVENT est utilisée. Pour lancer un événement, utilisez POST_EVENT(<name>, [arg1 [,arg2 [,arg3 [,arg4]]]]). Par exemple :
SELECT POST_EVENT('Customers', 123) |
- Note: L'astérisque marque le type d'alerte d'événement par défaut.
Voir aussi
- Multi-threading
- Application exemple TFDEventAlerter