Częściowe wykonanie instrukcji z pliku .sql

0

Witam, czy można wykonać tylko cześć instrukcji z pliku .sql? Chodzi mi o coś ala GOTO i sekcje od której ma nastąpić wywoływanie poleceń.

Mam jeden plik do aktualizowania bazy, każda nowa wersja wprowadza jakieś zmiany które będą dodawane do pliku wraz z numerem wersji. Aktualna wersja bazy jest zapisana w db.
Aktualizując bazę chcę wykonać tylko instrukcje od bieżącej wersji klienta do najnowszej czyli pominąć to co starsze.

Plik .sql uruchamiany jest z pliku .bat

--------------------------------------------------------------------------- 
-- Version 1.0.1
--------------------------------------------------------------------------- 

-- some sql commands...

--------------------------------------------------------------------------- 
-- Version 1.0.4
--------------------------------------------------------------------------- 

-- some sql commands...

--------------------------------------------------------------------------- 
-- Version 1.0.8
--------------------------------------------------------------------------- 

-- some sql commands...

--------------------------------------------------------------------------- 
-- Version 1.1.0
---------------------------------------------------------------------------  

-- some sql commands...

--------------------------------------------------------------------------- 
-- Version 1.1.5
---------------------------------------------------------------------------  

-- some sql commands...

Jest prosty sposób na coś takiego? Mam kilka pomysłów ale zależy mi na najprostszym rozwiązaniu.

0

Jaki silnik?

0

Są gotowe narzędzia do upgradowania i migracji baz danych, w pamięci mam liquidbase, flyway ale sa i inne

0

@Panczo: PostgreSQL
@AnyKtokolwiek: w tym przypadku muszę użyć pliku ze skryptem (bat) który wykona (psql) skrypt sql zapisany w pliku .sql. Takie wymaganie.

0

SQL z if'ami to już nie jest SQL

0

To nie powinien być jeden plik sql ze wszystkimi wersjami, tylko jeden na każdą wersję. Wtedy z pliku bat możesz sterować, które będą wykonane.

0

@jarekczek Zgadzam się, takie było początkowe założenie ale boss chce maksymalnego uproszczenia i wszystko w jednym pliku jeśli chodzi o update. Osobny plik tylko na czysty install na pustą bazę.

0

Zrób sobie plik, który tworzy procedurę w plpgsql. Tam możesz stosować IF, zmienne i inne cuda-wianki.
I na koniec tylko wykonaj tę procedurę.

0

Od wersji 9.0 można użyć konstrukcji DO, np:

DO
$$
BEGIN
 IF now() > '2018-09-05' THEN
	RAISE NOTICE 'a';
 ELSE
	RAISE NOTICE 'b';
 END IF;
END
$$
0

@student pro dzięki za przypomnienie bo to jest dokładnie to czego potrzebuje, zapomniałem o tej komendzie a używałem jej wcześniej hehe :)

0
yabolik napisał(a):

@jarekczek Zgadzam się, takie było początkowe założenie ale boss chce maksymalnego uproszczenia i wszystko w jednym pliku jeśli chodzi o update. Osobny plik tylko na czysty install na pustą bazę.

Są różne spojrzenia na słowo "prostota", mam być taka w sam raz, a nie dalej idąca - w pewnym momencie staje się "prostactwem".

Np skrypty z grupy "przy upgrejdzie" mogą służyć do założenia/odnowienia reguł integralności, odbudowania tabel przewidzianych do odbudowania, indeksów. MOIM zdaniem powinna to być sekwencja jak najprostszych czynności (ALTER, z rzadka UPDATE) aby ewentualne wyjątki i problemy były bardzo proste.

GDYBYM musiał to prowadzić w jednym pliku (ale ja nie dałbym się i bym zrobił w wielu), bym użył jakiegoś tekstowego template, np VTL Apache Velocity

#if $version='1.01'
alter table akuku create colum namuniu varchar(20)
#endif

Co do ewentualnych niepowodzeń i wyjątków, wydaje się MS-SQL sekwencje alter'ujące umie objąć transakcją (wycofa), a np MySQL chyba nie (nie wycofa, zostaną częściowe)

Czy dowolna inna biblioteka templetowa, co kto używa (C#, Java, interpretery)

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