Firebird otmatik loglama (Trigger Level Loging)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
AhmetNuri
Üye
Mesajlar: 260
Kayıt: 02 Tem 2007 07:55
Konum: ist
İletişim:

Firebird otmatik loglama (Trigger Level Loging)

Mesaj gönderen AhmetNuri »

Merhaba, Buraya yazmayalı yaklaşık bir yıl olmuş dedim vaktim varken firebird kısmına biraz katkım olsun. Bu sayfayı okuduğunuza göre muhtemelen sql i biliyorsunuz. En azından başlangıç seviyesi ile orta seviyede değilse benim anlatımım biraz ağır kaçacaktır. Edebiyat yapmada üstüme yoktur. Sevdiğim bir konu ise saatlerce nutuk atabilirim. Fakat anlatımım için aynı şeyleri söyleyemeyeceğim. Onun için adınız arif değilse işiniz baya zor:)
Düzgün ve atlamadan olayları anlatmak için Flame robin ile boş bir veri tabanı açıp sırayla yaptıklarımı buraya aktarmaya çalışacağım. Ama önce bu yapılanların ne işe yarayacağını açıklık getireyim. Diyelimki bir veri tabanınız var. Veri tabanınıza sürekli veriler yazılıyor, değişiyor, siliniyor, peki ya işler ters giderse diyelim ki çalışanlardan biri hesaplarda ufak ufak oynamalar yapıyorsa yada yeni başlıyan personel verileri yanlışlıkla sildiyse bunu nasıl anlayacaksınız? Tabi hep fitnis fiçurus düşünmemek lazım bu kodları yaptığınız değişikleri sürekli versiyon versiyon saklamak isterseniz de kullanabilirsiniz.

Kısaca yapılacak işlem Datas tablosunda bir değişiklik olursa datas tablosundaki değişikliği güncel tarih saati ve değişikliği yapan kullanıcı ile birlikte DATASLOG tablosuna yazacağız.
Bu işlem için üç triger 1 store procedure ve 2 adet table (her table için 1 er otomatik tam sayı trigerı) kullanacağız.

Ben örnek dosyayı Firebird 2.5.1 de hazırladığım için bu dosyayı açmanız için En az Fb 2.5.1 kurulu olmalı.
Öncelikle Veri tabanının çiçek gibi olması için mutlaka domain kullanın.

Kod: Tümünü seç

CREATE DOMAIN DOM_DATE
 AS date
;

CREATE DOMAIN DOM_INT
 AS integer
;

CREATE DOMAIN DOM_TIME
 AS TIME;

CREATE DOMAIN DOM_STR50
 AS varchar(50)
 COLLATE UTF8;
SONRA VERİLERİ GİRECEĞİMİZ DATAS TABLOSUNU HAZIRLAYALIM

Kod: Tümünü seç

CREATE TABLE DATAS
(
  DATAS_ID DOM_INT NOT NULL,
  DATAS_DATE DOM_DATE,
  DATAS_TIME DOM_TIME,
  DATAS_USER DOM_STR50,
  DATAS_1 DOM_INT

);
DATAS_ID otomatik artan sayı
Şimdi kayıt eklendiğinde otomatik olarak kayıt tarihi ve kayıt saatini ve kaydı açan db kullanıcısını yazacak triggerı yazalaım

Kod: Tümünü seç

SET TERM ^;

CREATE TRIGGER TRGDATAS_ZAMANYAZ FOR DATAS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
    /* enter trigger code here */ 
   IF (NEW.DATAS_DATE IS NULL) THEN
    NEW.DATAS_DATE = current_date;
   IF (NEW.DATAS_TIME IS NULL) THEN
    NEW.DATAS_TIME = current_time;
   IF (NEW.DATAS_USER IS NULL) THEN
    NEW.DATAS_USER = current_USER;    
END^

SET TERM ;^

buraya kadar olan kısım normal bir sql programcısının zaten bildiği çoğu sql kod üreten programında otomatik olarak hemen yapıverdiği şeyler. Size tavsiyem veri tabanının veri tabanı olduğu yeri anlamak istiyorsanız belli bir tecrübe seviyesini geçtikten sonra otomatik kodlayıcı değil kendi kodlarınızı kullanın. böylece kendi programınız için daha hızlı ve kullanışlı kodlar yazabilirsiniz.

Bundan sonrası veri tabanını deve tabanından ayıran kısım diyebiliriz. Eğer paradox sql den mahrum veri tabanları kullandıysanız bu kısım sizin için oldukça ilginç gelecektir.

Şimdi bir tablo daha açalım ve içerisine DATAS tablosunda yapılan silme değiştirme ve yeni ekleme bilgilerini geçerli kullanıcı ile birlikte ekleyelim.

Kod: Tümünü seç


CREATE TABLE DATASLOG
(
  DATASLOG_ID DOM_INT NOT NULL,
  DATASLOG_STATUS DOM_INT,  /* datas tablosundaki kayıt ne hareket görmüş
  DATASLOG_ACTINDATE DOM_DATE, /* değişiklik tarihi
  DATASLOG_ACTINTIME DOM_TIME, /* değişiklik saati
  DATASLOG_DATE DOM_DATE,
  DATASLOG_USER DOM_STR50,
  DATASLOG_1 DOM_INT,
  DATASLOG_TIME DOM_TIME
);
Şimdi eğer kaydı silindiği için mi yoksa güncellediği için mi bilgisine ihtiyacımız yoksa tek bir triger işimizi görürdü. Fakat eğer bilginiz log tutacak kadar değerli ise büyük ihtimal ile logları bakarken kayıt action bilgisine ihtiyaç duyarsınız. Onun için üç ayrı triger tanımlayacağız. Üç triger ın bir birinden farkı sadece status alanına eklendiyse 1 yaz update olduysa 2 yaz silindiyse 3 yaz komutu olacak.
Bu işlemler için bir store procedure ve üç adet triger kullanmamız gerekiyor.




Kod: Tümünü seç

PROCEDURE BACKUPDATAS (
    VDATAS_ID integer,
    VDATAS_STATUS integer )
AS
DECLARE VARIABLE DATAS_1 INTEGER;
DECLARE VARIABLE DATAS_DATE DATE;           
DECLARE VARIABLE DATAS_TIME TIME;
DECLARE VARIABLE DATAS_USER VARCHAR(50) ; 
DECLARE VARIABLE DATAS_RETYPE INTEGER ;            


/* AHMET NURİ DENİZ 03.01.2012 */

BEGIN
   
   FOR SELECT         

        DATAS.DATAS_1, 
        DATAS.DATAS_DATE, 
        DATAS.DATAS_TIME,
        DATAS.DATAS_USER
        


    FROM DATAS 
    where  DATAS.DATAS_ID = :VDATAS_ID /* SİZ DE BURADA ID GİBİ UNİC BİR ALAN KULLANIN*/
    INTO 

        :DATAS_1, 
        :DATAS_DATE,
        :DATAS_TIME,
        :DATAS_USER

    DO
      BEGIN
        INSERT INTO DATASLOG ( DATASLOG_1, DATASLOG_DATE,  DATASLOG_TIME, DATASLOG_USER, DATASLOG_STATUS )
    VALUES (:DATAS_1, :DATAS_DATE, :DATAS_TIME, :DATAS_USER, :VDATAS_STATUS );
    
        end
        suspend;

END^
Kullandığım trigrlardan biri , diğerlerinde sadece gönderilen paremetreler değişiyor

Kod: Tümünü seç

TRIGGER TRGDATAS_LOGAFINST ACTIVE
AFTER INSERT POSITION 0
AS
BEGIN
    /* AHMET NURİ DENİZ 03.01.2012*/ 
  
EXECUTE PROCEDURE BACKUPDATAS(NEW.DATAS_ID, 1);     /* KAYDIN INSERTI OLDUĞU İÇİN 1 PAREMETRESİ GÖNDERİYORUZ */
END^
Dosya ekleri
LOGDB.zip
UYGULAMANIN HAZIR HALİ
(49.07 KiB) 235 kere indirildi
Ahmet DENİZ
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Firebird otmatik loglama (Trigger Level Loging)

Mesaj gönderen Lost Soul »

Önfikir olması açısından güzel bir makale olmuş. Teşekkürler.
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

Re: Firebird otmatik loglama (Trigger Level Loging)

Mesaj gönderen cecihan »

Merhaba. Çok güzel bir makale olmuş. Ellerinize sağlık. Bende buna benzer bir yapıyı replikasyon için eski bir programımda kullanıyordum. benim hep yapmak istediğim bir şey vardı bu konuda. Belki sizin bilginiz vardır.
şimdi bu trigerlar sadece silme, düzeltme, ekleme yapılıp yapılmadığını tutuyor. ama yapılan değişikliğin ne olduğu, hangi alanların değiştiği vs. tutmuyor. acaba bir memo alandada (örnek update için gönderilen) sql cümlesi saklabilir mi.
AhmetNuri
Üye
Mesajlar: 260
Kayıt: 02 Tem 2007 07:55
Konum: ist
İletişim:

Re: Firebird otmatik loglama (Trigger Level Loging)

Mesaj gönderen AhmetNuri »

Bu trigger eski kaydı da tutuyor. yani eski kayıt bu şu tarihte değişti şeklinde kayıt sakalayabiliyor.
Ahmet DENİZ
Cevapla