Base de Conhecimento

Delphi and database events

Delphi e eventos no Microsoft SQL Server

Eventos em banco de dados são uma maneira conveniente de notificar o aplicativo de que um certo evento ocorreu. Ao invés de deixar a aplicação estar constantemente consultando o banco de dados, voce pode ter um evento no exato momento para que o banco de dados possa notificar a aplicação de que uma determinada ação precisa ser executada. Por exemplo, vamos supor que uma aplicação faz uma alteração em um registro do cadastro de clientes, que faz com que a aplicação necessite realizar uma ação. A outra aplicação precisa somente esperar pelo evento, sem a necessidade de ficar constantemente acessando o banco de dados para verificar se o registro foi modificado.

FDEventAlerter

Em Delphi (ou ao invés no FireDAC) você pode resolver isso usando um componente chamado TFDEventAlerter. Este componente possui a capacidade de ‘escutar’ os eventos dentro do ambiente de banco de dados. A beleza do componente TFDEventAlerter é que ele é desenhado para prover uma interface, independente do banco de dados que você usa. Com esta interface, você pode decidir se você vai esperar por um evento específico, ou por uma alteração em um registro específico em uma tabela.

Exemplo com Microsoft SQL Server

No exemplo a seguir, estamos usando Microsoft SQL Server. Para enviar os eventos com o Microsoft SQL Server, você pode usar Query Notifications.

Para estas Query Notifications, podemos usar o código descrito a seguir:


-- Cria a fila e o serviço
CREATE QUEUE [NotificationsQueue];
CREATE SERVICE [NotificationsService] ON QUEUE [NotificationsQueue] (
[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]
);
GRANT SEND ON SERVICE::[NotificationsService] TO [];


-- Permissões necessárias para []
GRANT SELECT to []
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO []
GRANT RECEIVE ON QueryNotificationErrorsQueue TO []
GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to []
GRANT RECEIVE ON [NotificationsQueue] TO []
GRANT VIEW DEFINITION TO []

Uma vez que este setup está feito, nós poderemos prosseguir e implementar este evento no Delphi. Nós fazemos isso colocando o componente TFDEventAlerter em um Form ou um DataModule e conectar a um banco de dados usando a propriedade Connection. Além disso, você precisa configar a fila, o serviço e alterar os eventos usando a propriedade Names:

FDEventAlerter.Connection := ''
FDEventAlerter.Names.Add('QUEUE=NotificationsQueue');
FDEventAlerter.Names.Add('SERVICE=NotificationsService');

Então, você pode usar o evento OnAlert para capturar os eventos e execuar as ações de acordo com seu tipo, como demonstrado no evento abaixo:

procedure TFrmMain.FDEventAlerterAlert(ASender: TFDCustomEventAlerter; const AEventName: string;
  const AArgument: Variant);
begin
  mmLog.Lines.Add('Evento - [' + AEventName + '] - [' + AArgument + ']');
end;

 

Especificamente para o Microsoft SQL Server, você precisa habilitar o service-broker (ALTER DATABASE <nome_do_banco_de_dados> SET ENABLE_BROKER), caso contrário nenhum evento será compartilhado com a fila e nenhum alerta será capturado pelo TFDEventAlerter. Isso também está descrito no artigo https://docwiki.embarcadero.com/RADStudio/Sydney/en/Database_Alerts_(FireDAC) for Microsoft SQL Server.

FPara cada usuário de um TFDEventAlerter são necessários uma fila e um serviço. O TFDEventAlerter criará essa fila e este serviço no esquema padrão do usuário logado no banco. Portanto é necessário ter permissão para fazer o login e os criar. A fila e o serviço será associadas a um nome único quando um nome não for provido. Depois, fechando e “desregistrando” o TFDEventAlerter, o componente irá apagar do banco seus respectivos fila e serviço.

Written by Remco Vorthoren
Desenvolvedor Delphi

Contato

Deixe-nos ajudá-lo a realizar seus sonhos.