Witajcie,
Dzisiaj chciałem Was podpytać o temat prac serwisowych na bazie.
Pracuję w firmie gdzie jest główna baza danych (oracle) na której pracuje setki jeśli nie tysiące użytkowników/aplikacji. System jest na tyle rozproszony, że ja w zasadzie sam nie wiem nawet kto z tego korzysta bo mamy wiele endpointów wystawionych dla dostawców zewnętrznych. No i właśnie tutaj zaczynają się schody. Nie mając kontroli nad tym kto i kiedy korzysta z bazy proces wgrywania zmian/aktualizacji/fixów na bazie jest stosunkowo trudny tu jakiś lock na obiekcie tu jakaś transakcja, tu jakiś raport ... Ostatnio na wgrywaniu zmian musieliśmy "ubić" część sesji ponieważ blokowały wgrywanie np nowych wersji pakietów itd. Ogólnie wraz z adminem sobie poradziliśmy trwało to wszystko dobrą godzinę ale okazało się, że właśnie jakiś podmiot zewnętrzny nie dostał informacji o planowanym wgrywaniu zmian i utknęli z robotą na godzinę. Afera się zrobiła i od razu przylecieli z nowymi "procedurami", że mamy teraz wszystkich informować o wgrywkach .... (pomijam już corpo bzdury, że nikt nam nie powiedział komu i co mam komunikować ale o tym napiszę na microblogu w wolnej chwili).
Do rzeczy .... przydałby mi się mechanizm czasowego blokowania logowania użytkowników.
Wymyśliłem takie rozwiązanie, że dam adminom narzędzie (aplikację / skrypt), która do nowej tabeli wprowadzi informacje o planowanym upgrade. Na trigerze AFTER LOGON on DATATABASE sprawdzę czy w najbliższych 3 dniach jest planowany upgrade i jeśli tak to wyświetlę notyfikację logującej sesji (w jaki sposób to już inna kwestia - mam kilka pomysłów i opcji). Teraz w momencie gdy admin rozpocznie wgrywanie skryptów to najpierw wywalę wszystkie sesje, a następnie przy logowaniu (znaczna część microserwisów ponawia automatycznie połączenie przy zerwaniu) automatycznie rzucę RAISE APPLICATION ERROR z informacją, że system w trakcie aktualizacji od ... do ... i nie pozwolę się zalogować takiemu użytkownikowi. Po skończonej wgrywce admin puści skrypt/aplikację i zakończy wgrywkę automatycznie odblokowując logowanie do bazy.
Pytanie do Was czy znacie lepszy sposób? Może oracle sam w sobie ma taki ... "czas dla admina" ? Będę wdzięczny za wszelkie sugestie.