[MsSQL] Dynamiczne tworzenie widoków stored procedure


(Marcin Obala) #1

Cześć

Na początek chciałbym uzyskać informacje czy w ogóle da się zrobić coś takiego.

Sytuacja wygląda tak. Mam kilkanaście baz danych. Utworzyłem nową bazę danych. Moim zamierzeniem jest stworzenie widoków które będą zawierać zapytanie wyciągające dane z wszystkich innych baz. Jednak musi być to bezobsługowe a co miesiąc dochodzą nowe bazy. Wymyśliłem coś takiego:

  1. Nowa baza z widokami o nazwach takich samych jak tabele w bazach z których wyciągać będę dane.

  2. W bazie będzie stored procedure która będzie wyciągać dane z bazy master o wszystkich bazach zaczynających się na np. "Baza0".

  3. W rezultacie dostanę listę Baza01, Baza02, Baza03, Baza04. Chcę teraz wygenerować zapytanie wyglądające tak:

    select * from Baza01.dbo.Tabelka1

    union all

    select * from Baza02.dbo.Tabelka1

    union all

    select * from Baza03.dbo.Tabelka1

    union all

    select * from Baza04.dbo.Tabelka1

A następnie zaktualizować istniejący widok o nazwie "Tabelka" tak aby działał na zapytaniu wyżej. Ewentualnie usunie aktualny widok i doda nowy.

To jest tylko początek bo niestety ktoś bardzo mądry projektując bazę nie tylko rozdzielił bazy na kilka ale też w każdej bazie klucz główny jest liczony od 1 ;/ ale tego zapewne nie da się zrobić tak żeby dane z Baza02 miały ID powiększone o maksymalną wartość z bazy poprzedniej. Tzn. jak teraz patrzę to chyba się da ale to bym musiał w trakcie generowania zapytania bazowego dla widoku generować w nim żeby ID było + odczytana maksymalna wartość?


(kostek135) #2

Twój pierwszy problem rozwiązałbym middlewarem.

Co do drugiego. Nie rób nic pochopnie - jak to w ogóle wyglądać ma załóżmy, że masz 2 tabele Pracownicy i Działy (klasyk jeden do wielu) rozbity na N baz danych. Jak chcesz w tym szukać po kluczach obcych skoro po stronie jeden będą niejednoznaczności. Czy istnieje w bazie klucz który odnosi się do innej bazy, czy są one póki co tylko lokalne dla bazy. Przykładowo w bazie A jest Jan Kowalski o id=6 i pracuje w marketingu wykonuje zapytanie i otrzymuje ze id=6, pracuje w IT, marketing, księgowość, bo w bazach B i C id=6 to pani Halinka i pan Zbyszek, pracują gdzie indziej. Jak to w ogóle może egzystować?


(StawikPiast) #3

nowe zapytanie możesz budowac z uzyciem kursora i dynamic sql. Ale wlasnie to trochę kiepsko wygląda to nadawanie id. Zawsze możesz dorzucić idbazy+idlokalne wtedy nie będą się powtarzac, ale opisz to dokładniej bo wygląda to tragicznie.


(Marcin Obala) #4

Każda baza zawiera dwie tabele. Każda tabela ma swoje ID. Druga tabela ma też kolumnę z ID z kluczem obcym do tabeli1. Każda baza zawiera informacje tylko z jednego miesiąca.Jeśli aplikacja zauważy że wybiła północ na przełomie miesiąca to tworzy nową bazę i wali dane do nowej bazy zaczynając ID od nowa. Więc może być tak że idzie produkcja, jakiś batch produkcyjny, maszyna nie była używana przez cały miesiąc tylko pod sam koniec. I może być tak że produkty mają zdublowane ID w różnych bazach bo szły na przełomie miesiąca.Produkcja się zaczęła. Produkt1 ma ID 1, produkt 2, id 2, mija północ, produkt 3 ma id 1 w nowej bazie danych.


(StawikPiast) #5

Matko boska, co to za potwór, zwolnijcie tego geniusza co to tak spartolił.

Dodaj kolumnę wyliczeniową id bazy + id z tabeli i będziesz miał unikalne id w całej bazie. Albo zamiast takiego sztucznego ID guid czyli polecenie newid() powinno być znacznie szybsze. Operuj na tych danych bo inaczej zginiesz.

A czy te dane są już gdzieś wykorzystywane czy ty piszesz pierwsze zapytania na tą bazę? Jak pierwsze to może zacznij kopiować te wszystkie dane do jednej bazy i z niej wyciagac zapytania. Oczywiście zakładam ze w nowej bazie nie będzie już takiego bałaganu.

Może łatwiej będzie przerobić aplikację?


(Marcin Obala) #6

Aplikacja jest z 2005 roku czy wcześniej. Nie ma szans jej przerobić. Chodzi o to że soft który wyciąga dane statystyczne napisany przez producenta maszyny i softu nie wystarcza nam. Ten soft sobie niby radzi z tym wszystkich. Ale chcemy napisać swój soft do raportowania wyników z maszyn, który będzie zawierał więcej informacji oraz będzie robił to automatycznie i wychodzą takie kwiatki z bazy danych.


(StawikPiast) #7

W takim przypadku to ja bym chyba napisał procedury które będą wszystko kopiować do oddzielnej bazy gdzie poukładasz wszystko poprawnie i dopiero na tym ruszczał raporty. Zresztą nawet tak się zaleca, produkcja dla aplikacji dla raportów oddzielna baza a najlepiej serwer.