Interbase / Firebird - System Tables and Views

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
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Referans : Interbase 6 Languege Reference.PDF http://dellapenna.univaq.it/download.ph ... erBase6SQL

Konu Başlığı : System Tables and Views

- Burada Veritabanının teknik yapısına dair bilgiler bulunmakta.

- Bana lazım olan kısımların SQL cümleciklerini Fonksiyon altına aldım. Ayrıca kod içerisinde anlamlı olsun diye önce tip tanımı yaptım. Bundan kasıt; koda tekrar döndüğümde hangi SQL cümleciğini istediğimi, ilerde tekrar ihtiyacım olduğunda okunur/anlaşılır kılmayı hedeflemek.

Kod: Tümünü seç

Type TMetaData = (mtTable, mtView, mtProcedure, mtTrigger, mtRole, mtGenerator, mtFunction, mtDomain, mtException);
- Etüd ederken karşılaştığım özel bir durumu aktarayım. Bu trükler canımızı sıkabilecek şeyler olduğunda önemli. 8)

- Aşağıda göreceğiniz gibi programı çoğu yerinde SQL cümleciklerinin bazılarını Select * ile tümünü alırken bazılarını özellikle tek tek field isimlerini verip nokta tespitinde bulundum...

- Bunun nedeni ise birden fazla versiyondaki Interbase/Firebird veritabanı yapısında farklı durumlar sözkonusu.

- Bazı field'lar birinde var diğerinde yok. (Örnek RDB$FIELD_PRECISION) Ben de bunu kullanıcıya sorsam da (hani register server derken hangi sürüm server olduğunu verdiğimiz EMS, IBExpert gibi) sormasam da garantilemek için tekrar kontrol edeceğime göre bunu sormadan her versiyona uyumlu olsun istedim.

- Olmayan Field'i select içine verdiğimde hata döneceğine, * jokeri ile hata farklılık gösteren tablo'ların alanlarının tümünü alarak hatayı bertaraf etmeyi hedefledim ve oldu.

- Ayrıca bu kontrol IBDatabase.SQLDialect integer cevabından kontrol edilebiliyor ve ona göre gardımızı alabilir ve o tablo alanını sorgudan çıkarabiliriz...

Kod: Tümünü seç

Function MetaDataListeSQL(Tip : TMetaData) : String;
begin
   Case Tip of
	 mtTable:     Result :=  'SELECT RE.RDB$Relation_Name FROM RDB$Relations RE '+
                           ' WHERE (RE.RDB$System_Flag = 0 or RE.RDB$System_Flag is NULL)'+
                           ' AND   (RE.RDB$View_Source is NULL)'+
                           ' ORDER BY 1';
	 mtView:      Result :=  'SELECT RE.RDB$Relation_Name FROM RDB$Relations RE '+
                           ' WHERE (RE.RDB$System_Flag = 0 or RE.RDB$System_Flag is NULL)'+
                           ' AND   (RE.RDB$View_Source is NOT NULL)'+
                           ' ORDER BY 1';
	 mtProcedure: Result :=  'SELECT PR.RDB$Procedure_Name FROM RDB$Procedures PR '+
                           ' WHERE (PR.RDB$System_Flag = 0 or PR.RDB$System_Flag is NULL)' +
                           ' ORDER BY 1';
	 mtTrigger:   Result :=  'SELECT *'+
                           ' FROM  RDB$TriggerS' +
                           ' WHERE (RDB$System_Flag IS NULL  OR  RDB$System_Flag=0)' +
                           ' AND   RDB$Trigger_Name NOT IN (SELECT RDB$Trigger_Name' +
                           ' FROM RDB$CHECK_CONSTRAINTS)'                            +
                           ' ORDER BY RDB$Trigger_Name';
	 mtRole:      Result :=  'SELECT RO.RDB$Role_Name FROM RDB$Roles RO '+
                           ' WHERE (RO.RDB$System_Flag = 0 or RO.RDB$System_Flag is NULL)';
	 mtGenerator:	Result :=  'SELECT GE.RDB$Generator_Name FROM RDB$Generators GE '+
                           ' WHERE (GE.RDB$System_Flag = 0 or GE.RDB$System_Flag is NULL)';
	 mtFunction:	Result :=  'SELECT FU.RDB$Function_Name FROM RDB$Functions FU '+
                           ' WHERE (FU.RDB$System_Flag = 0 or FU.RDB$System_Flag is NULL)';
	 mtDomain:		Result :=  'SELECT FI.RDB$Field_Name FROM RDB$Fields FI '+
                           ' WHERE (FI.RDB$System_Flag = 0 or FI.RDB$System_Flag is NULL)'+
                           ' and   SUBSTRING(FI.RDB$Field_Name FROM 1 FOR 4) <> ''RDB$''';
	 mtException: Result :=  'SELECT EX.RDB$Exception_Name FROM RDB$Exceptions EX'+
                           ' WHERE (EX.RDB$System_Flag = 0 or EX.RDB$System_Flag is NULL)';
   end; // Case
end;

Kod: Tümünü seç

Procedure MetaDataListeAl(Tip : TMetaData; Liste:TStrings);
begin
  Liste.Clear;
  Try
    with IBSQL1 do
    begin
      Close;
      SQL.Text := MetaDataListeSQL(Tip);
      Prepare;
      ExecQuery;
      if not Eof then
      begin
        Liste.Clear;
        Repeat
          Liste.Add(AdjustLineBreaks(Fields[0].AsString));
          Next;
        Until EOF;
        Close;
        Application.ProcessMessages;
      end;
    end; // With
  Except // Burası Role, Function vb. tablolar yoksa pass geçsin diye
  End;
end;
Kullanımı :

Kod: Tümünü seç

Var
  Liste : TStringList;
begin
  Liste := TStringList.Create;
  MetaDataListeAl(mtTable,      Liste);
  TreeViewGuncelle('Tablo', Liste); // TreeView'i güncelleyen başka bir fonksiyondur. 
  ...
  ...
  Liste.Free;
end;
- Yarışmacılarımıza modülerlik konusunda dikkat etmeleri için de örnek olmasını dilerim... Her fonksiyon blok halinde kopyalanıp sorunsuz olarak başka yerde kullanılabilmesi projelerinizi zamanla daha hızlı üretmenize olanak sağlar...
:idea:

- Yarışmaya katılacaklara şimdiden başarılar...
Resim
Resim ....Resim
Cevapla