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;
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
);
Ş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 ;^
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
);
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^
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^