Michał Dyrała 3 Napisano 29 Grudnia 2021 Udostępnij Napisano 29 Grudnia 2021 w Błąd podczas aktualizacji z wersji 37.1.0 do 38.0.0/38.0.1 (edytowane) Dzień dobry. Ogólny rys sytuacyjny: - baza jest zainstalowana na Windows Server 2019 Standard 64bit - baza to MSSQL 2019 Standard 64bit - na serwerze są trzy bazy dla trzech różnych podmiotów (nazwijmy je A, B i C), z tego co pamiętam wszystkie są w wersji PRO, aktywne od 2018-03-23. - na serwerze są także bazy dla innych programów (ale to nie powinno mieć znaczenia w tym przypadku) Stan "działający" Do 18.12.2021 wszystko było OK. Program był w wersji 37.1.0.4997 i do takiej też wersji były przystosowane bazy wszystkich trzech podmiotów. 18.12.2021 została pobrana wersja 38.0.0.5094, a następnie zaktualizowana. Po aktualizacji po kolei nastąpiło logowanie do wszystkich trzech podmiotów celem aktualizacji bazy. Podmiot A i B zostały zaktualizowane bez problemów. Przy podmiocie C wyskoczył komunikat, że aktualizacja nie może zostać przeprowadzona ponieważ inne stanowisko jest podłączone do bazy. 18.12.2021 podmiot C pozostał w stanie bazy dla wersji 37.1.0.4997 i aż do dzisiaj, tj. do 29.12.2021 nikt się tam nie logował (przez okres świąteczny). Dzisiaj podczas próby logowania aplikacja zapytała czy zaktualizować bazę, po wybraniu "Tak" ukazał się komunikat Raporty z aktualizacji są w załączniku - są to dwa różne raporty - pierwszy jest z pierwszej próby aktualizacji, natomiast drugi z każdej kolejnej. Generalnie najpierw występuje błąd Invalid object name 'dbo.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp'. a za każdym kolejnym razem Cannot insert duplicate key row in object 'ModelDanychContainer.StanyAplikacji' with unique index 'AS_IDX_UzytkownikId_Klucz'. The duplicate key value is (<NULL>, Tagi_Klienci). i nie ma możliwości dostać się do danych. Po przywróceniu bazy do wersji 37.1.0.4997 programem serwisowym można uruchomić program z bazą w wersji 37.1.0.4997 (przy każdym uruchomieniu jest pokazywany monit o uaktualnienie wersji bazy danych). Jednak ponowna próba aktualizacji bazy do nowej wersji kończy się tymi samymi błędami. Próbowaliśmy także pominąć aktualizację bazy do wersji 38.0.0 i zaktualizować ją do wersji 38.0.1 zarówno z niedziałającej 38.0.0 jak i działającej 37.1.0 - efekt jest taki sam - najpierw błąd `Invalid object name` a następnie cały czas `Cannot insert duplicate key row in object`. Do przeżycia byłby scenariusz, gdzie trzeba by wrócić do kopii z 18.12.2021 (chociaż nie jest to najszczęśliwsze rozwiązanie) ale to też nie zadziałało. Jeśli ktoś ma jakąś wskazówkę co może być przyczyną albo gdzie szturchnąć palcem, żeby aktualizacja zadziałała to będzie super. Nie ukrywam, że nie dość, że jest koniec miesiąca to jeszcze koniec roku i dostęp do danych jednak by się przydał. Nexo_raport pierwszy.txt Nexo_raport drugi.txt Edytowane 29 Grudnia 2021 przez Michał Dyrała Link to postu
Michał Gałecki 82 Napisano 30 Grudnia 2021 Udostępnij Napisano 30 Grudnia 2021 w Błąd podczas aktualizacji z wersji 37.1.0 do 38.0.0/38.0.1 (edytowane) Dzień dobry, do wersji 38.0.0 oraz 38.0.1 wkradł się problem, który objawia się błędem podczas przeprowadzania konwersji danych. Jest on nam znany i występuje podczas próby jej wykonania na użytkowniku (logującym się na SQL Server), u którego domyślna schema została zmieniona z "dbo" na jakąś inną. Błąd ten zostanie poprawiony w wersji 39. Kroki, które należy podjąć w celu samodzielnego rozwiązania problemu: 1. Należy przywrócić podmiot do wersji sprzed aktualizacji, czyli np. 37.1 2. Należy wykonać załączony skrypt - wykona on się poprawnie tylko na koncie użytkownika, u którego domyślna schema jest inna niż "dbo". 3. Można dokonać próby aktualizacji do wersji 38. NaprawaKonwersji_V38.sql Edytowane 30 Grudnia 2021 przez Michał Gałecki Link to postu
Michał Dyrała 3 Napisano 2 Stycznia 2022 Autor Udostępnij Napisano 2 Stycznia 2022 w Błąd podczas aktualizacji z wersji 37.1.0 do 38.0.0/38.0.1 Dziękuję bardzo za odpowiedz. Udało mi się przywrócić podmiot do życia. Skrypt okazał się bardzo pomocny, jednak sam problem rozwiązałem trochę inaczej. Po pierwsze faktycznie ten felerny podmiot miał ustawioną inną schema niż dbo w mapowaniu użytkownika (wszystkie trzy podmioty korzystają z tego samego usera do połączenia do bazy) i tabele ze skryptu zostały utworzone w tym schema a nie w dbo. Wracając do naprawy (może komuś się przyda) to tak: 1. zmienić default_schema użytkownikowi na dbo 2. utworzyć w schemacie dbo trzy tabele ze skryptu 3. przekopiować do nich rekordy z istniejących tabel, które zostały utworzone podczas aktualizacji 4. usunąć tabele utworzone przez aktualizację 5. usunąć z tabeli ModelDanychContainer.StanyAplikacji, o ile istnieją, cztery OSTATNIE rekordy Tagi_Klienci, Tagi_Przychody, Tagi_Rozchody oraz Tagi_Asortyment. Jeśli tego nie zrobimy to podczas aktualizacji dostaniemy wyjątek Cannot insert duplicate key row in object 'ModelDanychContainer.StanyAplikacji' with unique index 'AS_IDX_UzytkownikId_Klucz'. The duplicate key value is (<NULL>, Tagi_Klienci). Teraz można uruchomić aktualizację i trzymać kciuki, żeby się udała. Oczywiście nie muszę przypominać o wykonaniu kopii zapasowej PRZED jakimikolwiek zmianami w bazie. Poniżej skrypt, który realizuje kroki 2-4 (u mnie zamiast dbo był ustawiony schemat ModelDanychContainer więc jeśli ktoś będzie miał inny to musi to zmienić) CREATE TABLE dbo.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp ( idReguly int not null, przesuniecieWykonania int, godzinaWykonania time ); insert into dbo.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp select * from ModelDanychContainer.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp; drop table ModelDanychContainer.RegulyAutomatyzacjiZmianaPrzesunieciaWykonaniaNaOpoznienieWykonaniaTemp; CREATE TABLE dbo.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp ( IdUbezpieczenia int NOT NULL, PreferencyjneOd DateTime ); INSERT INTO dbo.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp SELECT * FROM ModelDanychContainer.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp; drop table ModelDanychContainer.UbezpieczeniaWlascicielskieZUSPrzeniesieWartosciPreferencyjneOdTmp; CREATE TABLE dbo.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp ( InterwalAutomatycznejWymianyOnline int not null ); insert into dbo.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp select * from ModelDanychContainer.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp; drop table ModelDanychContainer.ParametryDokumentowDoKsiegowania_InterwalAutomatyznejWymianyOnline_Tmp; 2 Link to postu
Polecane posty