ADO.NET Porównanie dwóch baz MS SQL

0

Witam wszystkich :)
Staram sie porownac dwie bazy danych.
Konkretnie ma być to porównanie struktur tabel w dwoch bazach i zniwelowanie roznic w ilosci, nazwach, typach kolumn oraz w relacjach miedzy tabelami.
Kiedy bede znal juz roznice miedzy tabelami musze aktualizowac jedna z baz danych bez utraty rekordow w poszczegolnych tabelach tej bazy.

Uzywam metody SqlConnection.GetSchema() jednak mysle, ze nie daje mi ona wystarczajacych informacji, aby wykonac to zadanie.

Najlepiej gdyby istnialo juz jakies gotowe narzedzie wywolywane z linii polecen.

Chcial bym zaczerpnac od was nieco informacji na temat mozliwosci wykonania tego zadania bo sam z ADO.NET nie mialem wczesniej do czynienia.
W jaki sposob wykonali byscie to zadanie?
Najpierw wyeksportowac dane do pliku SQL (jakis sensowny sposob?), usunac dane z modyfikowanej bazy, aktualizowac tabele (jakis sensowny sposob?) i wgrac ponownie dane?

Miotalem sie miedzy tymi pod-zadaniami, i pomyslalem, ze moze najpierw wyeksportuje te dane do pliku sqla jako inserty...
Jednak musze wziac pod uwage, ktore pola sa autonumerowane, a GetSchema() daje mi tylko informacje na temat indexow i nie mowi nic o ich numeracji, wiec ciezko mi wygenerowac odpowiedni sql, ktory poprawnie doda rekordy do tabel.

Bardzo prosze o wszelkie sugestie i pozdrawiam ;)

0

Jak bardzo duze moga byc potencjalne roznice? Skoro kolumny moga sie roznic nazwami i typami, to skad wiesz, ktore dane beda odpowiadac ktorym kolumnom? Podaj jakis przyklad. Kiedys porownywalem dane w dwoch bazach (ok. 300 tabel) jedna procedura, wiec tutaj tez moze cos wymyslimy.

0

Swietnie, ze sie odezwales :)
Wiesz, oczywiscie tabele beda sie roznily najpewniej w jakims znosnym przedziale pozwalajacym na ponowne wgranie danych, glownie beda dochodzily nowe kolumny, byc moze nowe relacje miedzy tabelami. Sporadycznie jakas kolumna zniknie, ale jednak istnieje takie prawdopodobienstwo i trzeba to uwzglednic.
Rzuc na ruszt to co masz :)

0

Ok, mam chwile to odpisze.

Generalnie scenariusz jaki mi przychodzi do glowy jest taki:

  • tabela glowna, to tabela, z ktorej dane beda przywracane
  • tabela kopia to ta, ktora bedzie zmieniana

a) W kopii brakuje tabeli - sytuacja prosta, wystarczy skopiowac tabele z danymi
b) W kopii w tabeli x brakuje x kolumn - dorzucamy kolumny
c) W kopii w tabeli x jest za duzo kolumn - usuwamy kolumny
d) W kopii w tabeli x struktura jest ok, brakuje danych - dorzucamy dane

ad a) sytuacja najlepsza, nie ma co kombinowac, problemy:

  • czy mozliwa jest sytuacja, ze w kopii jest tabela y, w glownej x, o takich samej strukturze i danych, ale innej nazwie?
    ad b) problemy:
  • co jesli brakujace kolumny w glownej nie moga byc NULLem, tylko musza miec okreslone wartosci
    ad c) problemy
  • co jesli usuwana kolumna to klucz?
  • co jesli usuwane kolumny sa istotne z jakich powodow - zapisujemy gdzies backup?
    ad d) problemy
  • sprawdzanie czy brakuje danych - po kluczu glownym, co jesli kluczy jest wiecej?
  • co jesli w kopii w tabeli x sa zalozone ograniczenia i importowane dane ich nie spelniaja?
  • co jesli w kopii w tabeli x sa klucze obce i importowane dane nie pasuja?

Sa tez inne pytania. Rozumiem, ze po operacji kopia ma byc logicznym zlaczeniem kopii i glownej (nazwijmy to sensowny merge), tak? Gdzie sensowny oznacza, ze po operacji baza ma rece i nogi. Teraz pytanie co okreslilbys jako 'baza ma rece i nogi'.

Drugie - czy tabele kopii po operacji maja miec dokladnie taka sama strukture jak glowna i roznic sie tylko danymi (polaczenie starych danych z kopii z danymi z glownej), czy tez struktura moze byc inna niz glownej? Czyli w tabeli x sa takie same kolumny i ograniczenia (ogolnie rzecz biorac) jak w odpowiedniej tabeli y w glownej, ale sa tez dodatkowe kolumny, ktore juz byly wczesniej.

Jezeli to pierwsze, to mozna skopiowac tabele glowna z cala jej struktura i tylko wrzucac dane z kopii, ktorych tam jeszcze nie ma - co jesli nie spelniaja jakichs ograniczen? Zmiana ograniczen (malo sensowne) czy olewamy niepasujace dane?

Postaraj sie odpowiedziec na te pytania, ew. dopisz cos do scenariusza, wtedy mozna napisac procedurki odpowiadajace za konkretne zadanie. Czy zmiesci sie w jednej? Szczerze watpie. Ale na pewno mozna bedzie napisac procedurke np. zwracajaca wszystkie kolumny, ktorymi dane tabele sie roznia albo wszystkie tabele, ktorymi bazy sie roznia (na zasadzie nadmiarowa tabela/brak tabeli).

Troche czasu nie pisalem w TransactSQLu, ale w miare czasu moge sobie co nieco przypomniec :)

PS. Zainteresuj sie DTSem w mssql, chociaz nie znam w pelni jego mozliwosci, bo nie mialem jeszcze okazji korzystac.

0

Dzieki, ze sie odezwales.
Mozliwe roznice miedzy tabelami nieco sie uproscily, w zwiazku z czym pytanie juz nie jest aktualne, napisalem co trzeba, jesli wyjdzie jakas kolejna rzecz to konkretnie opisze problem.

Dzieki, pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1