Runtime Alan değiştirme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Runtime Alan değiştirme

Mesaj gönderen pentiumkivanc »

Merhaba;
Ben IBOConsole deki gibi bir program yapmak istiyorum. Çalışma esnasında kullanıcı bir tablo yapıp alanda değişiklik yapacak diyelim, Örneğin VARCHAR(20) tipinde bir alanı kullanıcı SMALLINT yapmak istiyor.

Ben ilk başta bunu öncelikle değiştirilecek alanı DROP yapıp sonra ADD yapıp yeniden eklemeyle halletmeye çalıştım ancak, Eğer tablodaki alan sayısı 1 se o zaman yapmıyor :roll:

Şim baktım IBOConsole a gavur yapmış, Değişiklik yaparken iboconsole hemen

Kod: Tümünü seç

update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'RDB$58',
RDB$COLLATION_ID = -1
where (RDB$FIELD_NAME = 'ALAN_ADI) and
(RDB$RELATION_NAME = 'TABLO_ADI')
Bu kod mesela ben alanı varchar dan smallint e çevirirken oluştu. RDB$FIELD_SOURCE Kısmını anladım da, meslea 'RDB$58' nedir diye bi baktım iboconsole benim önceden manuel oluşturduğum alanları böyle domain mi desem nedesem bişeyler yapmış değişiklik yaparken böyle yapıyor. Ben tabi RDB$58 yerine VARCHAR(30) yazdığımda hata veriyor. Bunun üstüne fazla gitmedim.

Arama yaptırdım ama aradığımı bulamadım. belki anahtar kelimeleri yanlış seçmişimdir. ("değiştirme runtime")

Özetle Çalışma Anında Veritabanının yapısını boyutunu nasıl değiştirebilirim?

Veritabanım Firebird 1.5.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

bizim kullandığımız tablo ve domainlerin yanında veritabanlarınında bu tip bilgileri tutmak için kullandığı sistem tabloları ve domainleri vardır.

siz bir alan eklediğiniz zaman bu alanın özelliklerini taşıyan bir adet sistem domaini oluşturulur ve tablonun ilgili fieldi RDB$FIELDS tablosunda bu domain ile ilişkilendirilir.

Bu tabloları ib expertte görmek için database registration info penceresini açıp db explorer seçeneğini seçtikten sonra sol tarafta yer alan seçenekleri işaretleyerek görünür hale getirebilirsiniz.

mesela tablo alanlarını tanımlarken kullanılan her integer ayrı bir system domainin oluşmasın neden olur. buda binlerce sistem domaine sahip olmanız demektir. eğer kendiniz bir domain tanımlayıp kullanırsanız bu sayıda ciddi bir azalma olur.


programın içinden böyle bir mudahale yapmak gerektiinde aşağıdakine benzer bir kod kullanıyorum.

Kod: Tümünü seç

ibqTemp.Close;
ibqTemp.SQL.Clear;
ibqTemp.SQL.Add('select RDB$FIELD_SOURCE from rdb$relation_fields db');
ibqTemp.SQL.Add('where db.rdb$field_name = '+#39+'BOLGEMAHALI'+#39);
ibqTemp.SQL.Add('and db.rdb$relation_name = '+#39+'BOLGELER'+#39);
ibqTemp.Open;
if Trim(ibqTemp.Fields[0].AsString) = 'KARAKTER_100' Then
Begin
      ibSql.Close;
      ibSql.SQL.Clear;
      ibSql.SQL.Add('update RDB$RELATION_FIELDS set');
      ibSql.SQL.Add('RDB$FIELD_SOURCE = '+#39+'KARAKTER_250'+#39);
      ibSql.SQL.Add('where (RDB$FIELD_NAME = '+#39+'BOLGEMAHALI'+#39+') and');
      ibSql.SQL.Add('(RDB$RELATION_NAME = '+#39+'BOLGELER'+#39+')');
      try
        ibSql.ExecQuery;
      except
        on E: Exception do
        Begin
          IBTR.RollbackRetaining;
          HataGoster('FDB Update Error !',E);
        End;
      end;
      IBTR.CommitRetaining;
end;
bu koda daha önceden KARAKTER_100 domaini ile ilişkilendirilmiş olan BOLGELER tablosunun BOLGEMAHALI adlı alanının tipini KARAKTER_250 domaini ile değiştiriyor.

ilgili domaini ya önceden oluşturmuş olmanız gerekir veya kullanıcıya çaktırmadan istediği özelliklere sahp bir domain oluşturup ona göre set etmeniz gerekir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
pentiumkivanc
Üye
Mesajlar: 350
Kayıt: 19 Şub 2004 10:24
İletişim:

Mesaj gönderen pentiumkivanc »

İlginize çok teşekkür ederim Bu konuyla ilgili başka bir sorum daha var. (Eğer yanlış yaptıysam başka bir başlık açayım)

Bu değişiklikten önce değiştireceğim alanlarda veri varsa, örneğin string bilgi vardı, alanı tamsayı yapmak istedim. Bu durumda alanın içindeki veri öylece kalıyor bu sağlıklı mı?
Master43
Üye
Mesajlar: 73
Kayıt: 17 Ara 2004 12:05

Mesaj gönderen Master43 »

Ben bu iş için aşağıdaki SQL kodunu kullanıyorum

Kod: Tümünü seç

ALTER TABLE TABLO_ADI
    ALTER ALAN_ADI TYPE DMN_INTEGER
Ben ilk başta bunu öncelikle değiştirilecek alanı DROP yapıp sonra ADD yapıp yeniden eklemeyle halletmeye çalıştım ancak, Eğer tablodaki alan sayısı 1 se o zaman yapmıyor
eğer değiştireceğin alandaki verilerin gitmesini istiyorsan alanı drop et ve tekrar oluştur alan sayısı 1 sende tabloyu drop yap tekrar oluştur :)
Cevapla