none
database birleştirme RRS feed

  • Soru

  • Merhaba arkadaşlar,

    Ufak bir sorunum bulunmakta.Yardımlarınız için şimdiden teşekkür ederim.

    5 adet veritabanım var.Bunları tek bir veritabanında nasıl birleştirebilirim veri kaybı olmadan.İlişkisel veritabanı kullanıldığı için ID ler birbirini tutması lazım.

    Yardımlarınızı bekliyorum.


    Software Developer & Database Administrator

    1 Temmuz 2013 Pazartesi 18:09

Yanıtlar

  • Yusuf,

    Anladigim kadariyla isin basindan GUID yerine int ID kullanmissin dosyalarinda.

    Ben bu isi kendi kodumla soyle yapmistim:

    -Ana Database tablolarini olustur.

    -Tum tablolarin bir adet GUID (rowguid) eklenmis temp versiyonunu olustur (create table #Tablo1 (rowID uniquidentifier default newID(), ...) ). Master tablodaki RowId degerlerini gerekli yerlerde foreign IDler olarak ata. Bu islemi tamamladiginda tum tablolar GUID anahtarlar ile baglantili olacak. Eski IDENTITY kolonlari istedigin gibi degistirebilir durumdasin demektir.

    -select rowID, row_number over (order by ...) ile IDENTITY kolonlarinin yeni degerlerini al (master tablolar icin) ve update et (temp dosyalardaki masterlari guncelliyoruz).

    -RowID'leri kullanarak yeni identity degerleri ata.

    -Temp dosyalardan asil dosyalara insert et.

    Ikinci bir yontem:

    -Yine ortak DB'de tablolarini olustur.

    -Ilk db'den doldur.

    -Sonrakilerden doldururken, hedef tablonun max IDsini al. O db'den gelenlerde ID degerine o max degeri ekleyerek doldur (master tablo ve o ID'yi foreign key olarak kullananlarda max ekleyeceksin)

    Ucuncu bir yontem:

    -Yine ortak DB'de tablolarini olustur.

    -Kaynak dblerden doldururken her kaynak icin farkli bir deger ekleyerek ID ver. Ornegin ilk herhangi bir tablodaki maximum IDENTITY degeri 1000000 ise, 1. Db'den gelenlerin ID'leri oldugu gib al, 2.den gelenlere 1000000, 3.den gelenlere 2000000 ... ekle.

    2 Temmuz 2013 Salı 11:11

Tüm Yanıtlar

  • Merhaba,

    SSMS üzerinde veritabanını sağ tuşla seçip Tasks > Generate Scripts ekranından veri tabanınızın nesnelerine ait scriptleri alabilir, ardından diğer veri tabanında çalıştırarak oluşturabilirsiniz.

    Verileri aktarmak için INSERT ... SELECT komutlarını kendiniz yazabilir veya yine SSMS üzerinde veritabanını sağ tuşla seçip Tasks > Export Wizard aracını kullanarak bu işlemi arayüz desteğiyle adım adım yapabilirsiniz.

    iyi çalışmalar

    2 Temmuz 2013 Salı 05:43
  • Merhaba,

    SSMS üzerinde veritabanını sağ tuşla seçip Tasks > Generate Scripts ekranından veri tabanınızın nesnelerine ait scriptleri alabilir, ardından diğer veri tabanında çalıştırarak oluşturabilirsiniz.

    Verileri aktarmak için INSERT ... SELECT komutlarını kendiniz yazabilir veya yine SSMS üzerinde veritabanını sağ tuşla seçip Tasks > Export Wizard aracını kullanarak bu işlemi arayüz desteğiyle adım adım yapabilirsiniz.

    iyi çalışmalar

    Merhaba,

    5 adet veritabanı bulunduğundan aynı kayıtlar üst üste ekleniyor.sorgu ile yapmaya kalkışsam bilgisayar çöker her bir tabloda yaklaşık 90.000 üstü kayıt var.hadi kayıt sayısını da geçelim 300 üstü tablo var :)

    Değerli bilginiz için teşekkürler dostum.

    farklı bir yol bulmam lazım.bilgisi olan arkadaşlar yardımlarınızı bekliyorum


    Software Developer & Database Administrator

    2 Temmuz 2013 Salı 07:10
  • Bunun icin bazi tool lar onlari kullanmani oneririm. Database leri compare edip merge etmeni sagliyorlar. RedGate basarili bir program bu konuda.

    http://www.red-gate.com/products/sql-development/sql-data-compare/

    2 Temmuz 2013 Salı 07:56
  • Yusuf,

    Anladigim kadariyla isin basindan GUID yerine int ID kullanmissin dosyalarinda.

    Ben bu isi kendi kodumla soyle yapmistim:

    -Ana Database tablolarini olustur.

    -Tum tablolarin bir adet GUID (rowguid) eklenmis temp versiyonunu olustur (create table #Tablo1 (rowID uniquidentifier default newID(), ...) ). Master tablodaki RowId degerlerini gerekli yerlerde foreign IDler olarak ata. Bu islemi tamamladiginda tum tablolar GUID anahtarlar ile baglantili olacak. Eski IDENTITY kolonlari istedigin gibi degistirebilir durumdasin demektir.

    -select rowID, row_number over (order by ...) ile IDENTITY kolonlarinin yeni degerlerini al (master tablolar icin) ve update et (temp dosyalardaki masterlari guncelliyoruz).

    -RowID'leri kullanarak yeni identity degerleri ata.

    -Temp dosyalardan asil dosyalara insert et.

    Ikinci bir yontem:

    -Yine ortak DB'de tablolarini olustur.

    -Ilk db'den doldur.

    -Sonrakilerden doldururken, hedef tablonun max IDsini al. O db'den gelenlerde ID degerine o max degeri ekleyerek doldur (master tablo ve o ID'yi foreign key olarak kullananlarda max ekleyeceksin)

    Ucuncu bir yontem:

    -Yine ortak DB'de tablolarini olustur.

    -Kaynak dblerden doldururken her kaynak icin farkli bir deger ekleyerek ID ver. Ornegin ilk herhangi bir tablodaki maximum IDENTITY degeri 1000000 ise, 1. Db'den gelenlerin ID'leri oldugu gib al, 2.den gelenlere 1000000, 3.den gelenlere 2000000 ... ekle.

    2 Temmuz 2013 Salı 11:11
  • Teşekürler arkadaşlar ama olmadı.

    Software Developer & Database Administrator

    4 Temmuz 2013 Perşembe 10:13
  • Ne yaptin da, ne olmadi :) O zaman yolu yok diyelim.
    4 Temmuz 2013 Perşembe 11:55