Delphi Dünyası Facebook'ta

Kodbank İndir

! CODEBANK 2012 !

İNDİRMEK&DETAYLI BİLGİ ALMAK İÇİN BURAYI TIKLAYINIZ.

Gönderen Konu: Firebird otmatik loglama (Trigger Level Loging)  (Okunma sayısı 149 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı AhmetNuri

  • Delphi 1 Level 5
  • *****
  • İleti: 46
  • Rep: +0/-1
Firebird otmatik loglama (Trigger Level Loging)
« : 04 Ocak 2012 00:14:53 »
Not : Sanırım forumun data yükleme eri dolu buraya dosyayı yükleyemedim.
Merhaba,  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: [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: [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: [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: [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: [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: [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^