Baza danych w demo aplikacji

Ilaro.Admin jest już na takim etapie, że można już sobie coś poklikać, a żeby to ułatwić już jakiś czas temu stworzyłem demo aplikacje.

Demo używa bazy danych Northwind z małymi zmianami.

  • Dodana tabela EntityChanges do zapisywania każdej zmiany.
  • Zastąpienie kilku composite primary keys, pojedynczymi kluczami, z tego względu, że początkowo nie było to obsługiwane, a w tym momencie nie jest to jeszcze wystarczająco przetestowane.

Jako, że jest ono dostępne dla wszystkich kwestią czasu jest gdy coś się zepsuje, albo przez błąd w aplikacji, albo ktoś walnie się ku temu przyczyni, np. usuwając wszystkie rekordy.
Czyli potrzebujemy przywracania bazy danych do domyślnego stanu.

Co do tego potrzebujemy?

  • Mechanizm, który co określony czas będzie wywoływał akcje resetu.
  • Akcje resetu sama w sobie.
  • Użytkownik korzystający podczas z aplikacji podczas resetu, musi być świadomy co się dzieje.

Od razu muszę nadmienić, że to zadanie było trochę utrudnione przez to, że aplikacja jest postawiona na współdzielonym hostingu.

Scheduling

Rzeczy najbardziej oczywiste czyli skorzystanie z zaplanowanych zadań w systemie lub napisanie prostego serwisu z wykorzystaniem Quartz.Net (lub czegoś podobnego), niestety odpadły z powodu, który wcześniej już wspomniałem.

W pierwszym momencie moim faworytem było rozwiązanie zaproponowane już dosyć dawno na blogu stackoverflow.
Wydawało się idealne – małe, proste, brak potrzeby korzystania czegoś zewnętrznego. Jednak problemem tego rozwiązania jak i tego zaproponowanego przez Phil Haack jest to, że nie radzą sobie z zadaniami z dużym interwalem, z prostego powodu: krótki czas życia aplikacji ASP.

Kolejną możliwością jest skorzystanie z możliwości zaplanowania zadania z poziomu panelu hostingu.
Korzystam z hostingu na webio.pl (który polecam), z panelem administracyjnym web site panel, który daje taką możliwość.
Jest dostępnych kilka typów zadań:

  • Kopia zapasowa bazy danych
  • Sprawdź dostępność strony internetowej
  • SCHEDULE_TASK_DELETE_EXCHANGE_ACCOUNTS
  • Sprawdź datę wygaśnięcia domeny
  • Wyślij pliki przez FTP
  • Wyślij powiadomienie e-mail
  • Spakuj do Zip plik przestrzeni

Zadanie, które nas interesuje to „Sprawdzanie dostępności strony internetowej”. Do jego działania potrzebujemy udostępnić url po wywołaniu, którego nastąpi reset bazy. Problemem tego rozwiązania może być to, że każdy kto zna ten adres mógłby „bawić ” się resetem, więc potrzebna jest jakaś forma uwierzytelniania. Zdecydowałem się na najprostsze rozwiązanie, czyli przekazywanie GET’em tokena, który po stronie aplikacji będzie sprawdzany. Nie jest to rozwiązanie idealne ale jak na moje potrzeby jest w sam raz.
Wygląda to tak:

Reset bazy danych

Akcja wywołana, token sprawdzony – resetujemy bazę danych.
Pierwsza myśl – potrzebuje plik backupu, a chwilę po tym przypomniałem sobie, że jestem ograniczony hostingiem i przywrócenie bazy danych jest możliwe tylko z poziomu panelu hostingu.

Życie ujrzał plan B, czyli dwa skrypty, pierwszy czyszczący bazę danych i drugi, który będzie ją przywracał do pożądanego stanu.

Skrypt czyszczący (zdecydowałem się tylko na czyszczenie rekordów, strukturę pozostawiam)

Skrypt dodający dane wygenerowałem przy pomocy narzędzia „generate scripts…” w managment studio.

Powiadomienie użytkownika

Ostatnią rzeczą jest pokazanie informacji na stronie o planowanym czasie resetu bazy danych. W tym celu utworzyłem partial view, w którym pobieram dwie informacje z app settings, interwał resetu i kiedy ostatni reset był. Dzięki tym danym obliczam kiedy będzie kolejny reset.
Efekt końcowy wygląda w ten sposób:

database reset

Osobną kwestią jest w jaki sposób dodałem ten widok do layoutu znajdującego się w bibliotece Ilaro.Admin, co omówię w osobnym wpisie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *