Çok Yakında Yeni Bir Arayüzle karşınızdayız! http://yeni.delphican.com/

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Database Event Listen Notify ile GUI güncelleme
#1
Bazen veri tabanında yapılan güncellemenin o veri tabanına bağlı olan diğer açık uygulamalarda/kullanıcılarda da otomatik olarak güncellenmesini isteriz.

Bu durumda Veri tabanlarında olan event özelliği devreye girer. Farklı veri tabanlarında farklı şekilde isimlendirilir fakat ana mantık aynıdır.

Çalışma mantığı bir tabloda oluşan olaya(INSERT, UPDATE, DELETE) istinaden RDBMS tarafında trigger ile diğer bağlı kullanıcılar(sessions, connection) için bir bildirim oluşturuyoruz.
Bu işlemden sonra bu bildirimi de diğer kullanıcıların bilgisayarında yakalayarak gerekli güncellemeyi yapıyoruz.

Ben bu testi PostgreSQL 9,5 sürümünde ve FireDAC ile kullanıyorum.

Öncelikle bir adet trigger tanımlıyoruz. SQL kodu aşağıdadır.
Bu trigger INSERT, UPDATE, DELETE işlemlerinde tablo adı ve etkilenen satırın ID bilgisini ile notification oluşturuyor.

CREATE OR REPLACE FUNCTION public.table_notify()
 RETURNS trigger AS
$BODY$
BEGIN
  --tablo isimlerine göre bildirimler oluşacak ikinci değerde geçerli kaydın id bilgisi
  IF (TG_OP = 'INSERT') THEN
    PERFORM pg_notify(TG_TABLE_NAME, NEW.id::varchar);
  ELSIF (TG_OP = 'UPDATE') THEN
    PERFORM pg_notify(TG_TABLE_NAME, OLD.id::varchar);
  ELSIF (TG_OP = 'DELETE') THEN
    PERFORM pg_notify(TG_TABLE_NAME, '');
  END IF;
  RETURN NEW;
END;$BODY$
 LANGUAGE plpgsql VOLATILE SECURITY DEFINER
 COST 100;
ALTER FUNCTION public.table_notify()
 OWNER TO postgres;
GRANT EXECUTE ON FUNCTION public.table_notify() TO public;
REVOKE ALL ON FUNCTION public.table_notify() FROM postgres;

Bu oluşturduğumuz trigger hangi tablolarda çalışacaksa tablolar için triggeri tanımlıyoruz.
CREATE TRIGGER x_table_notify
 AFTER INSERT OR UPDATE OR DELETE
 ON public.ornek_tablo_adi
 FOR EACH ROW
 EXECUTE PROCEDURE public.table_notify();

Bu işlemden sonra veri tabanındaki bildirim mekanizması bitiyor. Sonraki adımda da GUI kullanıcı tarafında bu oluşan bildirimleri yakalayıp işlemek gerekiyor
Basitçe anlamanız adına 

TFDEventAlerter -> buradaki firedac bileşenine doğru bilgileri yazarak bildirimi yakalayacağız.
  FDEventAlerter.Names.Add('stok_karti'); //dinleyeceğiniz bildirimin adını yazın ben trigger içinde TG_TABLE_NAME ile tablo adını yazmıştım. Bu nedenle sizde tablo adınızı girmelisiniz.
  FDEventAlerter.Connection := FDConnection;
  FDEventAlerter.Active := True;

procedure TfrmBaseDBGrid.eventAlerterAlert(ASender: TFDCustomEventAlerter;
  const AEventName: string; const AArgument: Variant);
//var
//  n1: Integer;
//  processID: string;
//  recordID: Integer;
begin
//  inherited;
//  if VarIsArray( AArgument ) then
//    for n1 := VarArrayLowBound(AArgument, 1) to VarArrayHighBound(AArgument, 1) do
//      if n1 = 0 then
//        processID := VarToStr(AArgument[n1])  //bildirimi oluşturan kullanıcının db üzerindeki process id (pid) bilgisi
//      else if n1 = 1 then
//        recordID := VarToStr(AArgument[n1]).ToInteger; //kaydın id bilgisi
  FDQuery.Refresh; //bu işlem ile query datalarını dolayısıyla bağlı olduğu gridi refresh etmiş oluyoruz.
end;


Firebird için bir kullanıcı bu şekilde güncellemeyi nasıl yaparım diye sormuştu burada da Firebird için anlatım mevcut. Bu şekilde ilerleyerek firebird içinde bu mekanizmayı kurabilirsiniz.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Buyrun buda uygulamanın videosu
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
PostgreSQL - Linux - Delphi, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#2
Müthiş bi çalışma.. elinize sağlık.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#3
Emeğine sağlık @3ddark. Çok güzel paylaşım.
There's no place like 127.0.0.1
WWW
Cevapla
#4
Teşekkürler.

Ayrıca belirtmek isterim bu EventAlerter bileşenine verdiğiniz Connection parametresi ile aynı Connection üzerinden çalışmıyor. EventAlerter için aynı bilgilerle yeni bir connection(session) açıyor.
Sebebini anlamış değilim. Bu işin aynı Connection üzerinden yapılması çok iyi olurdu. Böyle yapılmasının bir sebebi vardır tabi ki ama bir şekilde çözülür diye düşünüyor. Ayrıca araştırmak gerekir.

Bence bu özellik bana göre çok pahalı. Çok kullanıcılı sistemde kullanıcı Connection(session) sayınız + n tane FDEventAlerter olacak ve her Connection sunucudan kaynak kullanacak. Sunucu da Connection limitiniz varsa orada da sizi engelleyecektir.
PostgreSQL - Linux - Delphi, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#5
Emeğinize sağlık çok faydalı bir paylaşım.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  postgreSQL database oluşturma işlemi akuyumcu63 3 263 30-10-2019, Saat: 22:35
Son Yorum: Fesih ARSLAN
  [ÇÖZÜLDÜ Kısmen]Trigger ile Başka Database çinde Shadow Copy oluşturma 3ddark 5 1.319 23-07-2018, Saat: 11:52
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi