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.
Buyrun buda uygulamanın videosu
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.
Misafirler için gizlenen link, görmek için
Giriş yap veya üye ol.
Misafirler için gizlenen link, görmek için
Giriş yap veya üye ol.
Misafirler için gizlenen link, görmek için
Giriş yap veya üye ol.
Buyrun buda uygulamanın videosu
Misafirler için gizlenen link, görmek için
Giriş yap veya üye ol.