db versiyon kontrol sistemi

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
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

db versiyon kontrol sistemi

Mesaj gönderen akdatilla »

merhaba
Sizlerle kullandığım veritabanı versiyon kontrol sistemini paylaşmak istiyorum.
Eminim sizden gelecek önerilerle daha da iyi teknikler çıkartılabilir.

Öncelikle veritabanına bir versiyon kontrol tablosu ekliyoruz:

Kod: Tümünü seç

CREATE TABLE MAINDBVER
(
	MVR_ID INT NOT NULL,
	MVR_MAJOR SMALLINT,
	MVR_MINOR SMALLINT,
	MVR_BUILD SMALLINT,
	MVR_CIKISTRH DATETIME,
	MVR_GECISTRH DATETIME,
	MVR_BILGI TEXT,
	MVR_LOG TEXT,
	PRIMARY KEY (MVR_ID)
)
Programımızda sabitler halinde sıra ile tüm versiyonlar ve versiyon bilgilerini tanımlıyoruz (yeni versiyonları sabitler halinde ekliyoruz):

Kod: Tümünü seç

Const
     /////////versiyon tablosu
     dbv_1_01_000=101000;
     dbv_1_01_000date='13062008';
     dbv_1_01_000info='Bir cihaz üzerine takılan yedek parça bilgilerine döviz tipi eklendi.'#13#10+
     'Bu sayede tamirat işlelerinde stokun satış döviz tipinden farklı döviz tipi seçilebilmesi sağlandı.';


     dbv_1_02_000=102000;
     dbv_1_02_000date='15072008';
     dbv_1_02_000info='Genel parametrede bulunan geçmiş tarihli şirket çalışma dönemi isimleri'#13#10+
     'şirket bilgilerinin kayıt edildiği tabloya taşındı. Bu sayede tutulabilecek dönem sayısı'#13#10+
     ' arttırıldı.'#13#10+
     ' Yeni listeleme sistemi için raporlar veritabanına DSGDLIST tablosu eklendi.'#13#10+
     ' Seri takip sistemi eklendi.';
     dbv_1_03_000=103000;
     dbv_1_03_000date='26122008';
     dbv_1_03_000info='Ana pencere-Yavru pencere şeklinde çalışan program ayrı ayrı pencerelerde '+
     'çalışacak şekle getirild.'#13#10+
     'Genel veritabanı (TekSet)´e form dizaynları için tablo eklendi.'#13#10;

     dbv_Current=dbv_1_03_000;////dbv_Current son eklediğimiz versiyona eşitlenecek

Programımıza versiyon kontrol prosedürü ekliyoruz . Aşağıda benim yaptığım bir örnek var.
Bütününü vermiyorum ancak yeteri kadar anlaşılır herhalde:

Kod: Tümünü seç

procedure TMainF.SurumKontrolu;
Var
   s,cinfo:String;
   vl:string;
   c,va,vb,vc,ca,cb,cc,oldver,cid:integer;
   GeriYukle:Boolean;
   cdate:Double;
   procedure versiyoncoz(v:integer);
   var
      c:integer;
      vl:string;
   begin
        vl:='00000000'+inttostr(v);
        c:=Length(vl);
        Delete(vl,1,c-7);
        ca:=strtoint(copy(vl,1,2));
        cb:=strtoint(copy(vl,3,2));
        cc:=strtoint(copy(vl,5,3));
   end;
begin
     GeriYukle:=False;    ////Geri yukle dbyedekten geri yükleme gerektiği zaman (bir hata oluştuğunda) true yapılır.
     if DM.QOpen('SELECT * FROM MAINDBVER ORDER BY MVR_MAJOR,MVR_MINOR,MVR_BUILD') then
     begin
          DM.GenelSQL.Last;
          va:=intField('MVR_MAJOR');
          vb:=intField('MVR_MINOR');
          vc:=intField('MVR_BUILD');
     end else
     begin
          va:=1;
          vb:=0;
          vc:=0;
     end;
     oldver:=va*100000+vb*1000+vc;
     if oldver<dbv_Current then
     begin
          DM.DBYedekle('SurumGuncelleme'); //güncellme öncesinde yedek alınır
     end;
     if oldver< dbv_1_01_000 then
     begin
          cid:=dbv_1_01_000;
          cdate:=TextToDbl(dbv_1_01_000date,asfDate)-2;////-2 mssql de tarih ile ilgili bir sıkıntıdan geliyor
          cinfo:=dbv_1_01_000info;

          versiyoncoz(cid);

        
          /////////////bu kısımda yeni versiyona geçilmesi için gerekli sql komutlarını çalıştırıyoruz.
          DM.QExec('ALTER TABLE SRVPRC ADD SRD_PRB VARCHAR(8)');
          if TekDataMdl.WorkWithNetsis then
          begin

          end else
          begin
               DM.QExec('UPDATE SRVPRC SET SRD_PRB=STK_PBSATIS '+
               'FROM SRVPRC AS T1 INNER JOIN STKKART ON (T1.SRD_YPR=STK_KOD) '+
               'WHERE T1.SRD_PRB IS NULL');
          end;
          /////////////////////////////////////////////////////////////////

          ///////Yeni versiyona geçildi. Yeni versiyonu veritabanına kayıt ediyoruz.
          DM.QInsert(DM.ExecSQL,'MAINDBVER',['MVR_ID','MVR_MAJOR','MVR_MINOR',
          'MVR_BUILD','MVR_CIKISTRH','MVR_GECISTRH','MVR_BILGI','MVR_LOG'],
          [cid,ca,cb,cc,cdate,now-2,cinfo,'']);

     end;
.
.
.
.
     if GeriYukle then
     DM.DBYedekGeriYukle('SurumGuncelleme')
     else
     begin
          if oldver<dbv_Current then
          Begin

          end;
     end;
     vl:='00000000'+inttostr(dbv_Current);
     c:=Length(vl);
     Delete(vl,1,c-7);
     ca:=strtoint(copy(vl,1,2));
     cb:=strtoint(copy(vl,3,2));
     cc:=strtoint(copy(vl,5,3));
     Application.Title:='ProTech v '+inttostr(ca)+'.'+copy(vl,3,2)+'.'+copy(vl,5,3);
     MainF.Caption:=Application.Title;
end;
Yapmış olduğumuz bu versiyon kontrol prosedürünü programımızın başlangıç kısmında çalıştırıyoruz.
Cevapla