Potwierdzone sprawdzone punkt po punkcie · 2026-11-04
Pomiń nawigację
Materiał edukacyjny · Informatyka Bazy danych · Moduł 08

BAZY DANYCH · INF.03

Funkcje, raporty i bezpieczeństwo

Raport dla dyrekcji wymaga dat, tekstu i warunków. Poznasz funkcje MySQL, wyrażenie CASE, przygotowywanie raportów oraz zasady uprawnień i ochrony przed SQL injection.

Funkcje daty i tekstu

W bibliotece rzadko interesuje nas sama data zapisana w kolumnie. Chcemy wiedzieć, ile dni minęło od terminu zwrotu, w jakim miesiącu wypożyczono najwięcej książek albo jak podpisać kartę czytelnika. Do takich obliczeń służą funkcje wbudowane MySQL. Funkcja przyjmuje wartość, przetwarza ją i zwraca wynik, który można pokazać w kolumnie lub użyć w warunku.

Zacznijmy od dat. CURDATE() zwraca dzisiejszą datę, NOW() datę i czas, a YEAR(), MONTH() i DAY() wyciągają z daty jej część. Najbardziej przydatna w bibliotece jest DATEDIFF(data_późniejsza, data_wcześniejsza), która zwraca liczbę dni między datami. Wynik może być ujemny, jeśli pierwsza data jest wcześniejsza — to nie błąd, tylko informacja o kierunku obliczenia.

SELECT w.id,
       k.tytul,
       w.data_zwrotu,
       w.termin_zwrotu,
       DATEDIFF(w.data_zwrotu, w.termin_zwrotu) AS dni_spoznienia
FROM wypozyczenia w
JOIN ksiazki k ON k.id = w.ksiazka_id
WHERE w.data_zwrotu IS NOT NULL
  AND DATEDIFF(w.data_zwrotu, w.termin_zwrotu) > 0
ORDER BY dni_spoznienia DESC, w.id;

Drugi przykład pokazuje formatowanie daty. DATE_FORMAT(data, '%d.%m.%Y') zamienia datę na napis w polskim porządku dziennym. Samo przechowywanie daty w formacie RRRR-MM-DD jest wygodne dla bazy, ale w raporcie dla nauczyciela lepiej wygląda 02.09.2026. Pamiętaj, że formatowanie zmienia tylko wyświetlanie, a nie wartość w tabeli.

SELECT DATE_FORMAT(data_wypozyczenia, '%d.%m.%Y') AS data,
       COUNT(*) AS liczba_wypozyczen
FROM wypozyczenia
WHERE data_wypozyczenia >= '2026-09-01'
  AND data_wypozyczenia < '2026-10-01'
GROUP BY data_wypozyczenia
ORDER BY data_wypozyczenia;

Funkcje tekstowe pozwalają zbudować czytelne opisy bez zmieniania danych w tabeli. CONCAT skleja napisy, UPPER i LOWER zmieniają wielkość liter, LEFT i RIGHT biorą fragment z początku lub końca, a CHAR_LENGTH liczy znaki. Do usuwania spacji służy TRIM, a do zamiany fragmentu REPLACE. Wszystkie te funkcje można łączyć w jednym wyrażeniu.

SELECT CONCAT(UPPER(nazwisko), ' ', UPPER(LEFT(imie, 1)), '.') AS karta,
       LOWER(COALESCE(email, 'brak e-mail')) AS email,
       COALESCE(telefon, 'brak telefonu') AS telefon
FROM uczniowie
WHERE klasa_id = 1 AND aktywny = 1
ORDER BY nazwisko, imie;

Uwaga na NULL. W MySQL funkcja CONCAT zwraca NULL, jeśli choć jeden argument jest NULL. Dlatego przed sklejeniem warto zamienić brak wartości na tekst przez COALESCE lub IFNULL. CONCAT_WS zachowuje się inaczej: pomija argumenty NULL, ale nadal nie zastąpi ich napisem. W raportach z brakującymi telefonami jawny napis „brak telefonu” jest lepszy niż pusta komórka, bo czytelnik od razu wie, że danych nie ma.

DATEDIFF liczy różnicę dni, a nie godzin 2026-09-01 wypożyczenie 2026-09-15 termin zwrotu 2026-09-20 faktyczny zwrot DATEDIFF = 5 dni Kara i dni spóźnienia liczymy od terminu zwrotu, nie od daty wypożyczenia.
Oś czasu pokazuje trzy daty z jednego wypożyczenia. DATEDIFF zwraca liczbę dni między dwiema z nich, więc trzeba świadomie wybrać argumenty.
Funkcja Co zwraca Przykład użycia
CURDATE() dzisiejszą datę sprawdzenie, czy termin już minął
DATEDIFF(a, b) liczbę dni od b do a DATEDIFF(data_zwrotu, termin_zwrotu)
DATE_FORMAT(data, format) napis z daty w podanym formacie DATE_FORMAT(data, '%d.%m.%Y')
CONCAT(a, b, ...) sklejony napis CONCAT(imie, ' ', nazwisko)
COALESCE(a, b) pierwszą wartość różną od NULL COALESCE(telefon, 'brak telefonu')
CHAR_LENGTH(napis) liczbę znaków, a nie bajtów długość loginu lub kodu

Przykłady z życia

1. Karta biblioteczna. Pani bibliotekarka chce na jednej kartce widzieć „KOWALSKA A.”, adres e-mail i telefon. Dane w tabeli są rozdzielone na kolumny, ale funkcje CONCAT, UPPER i COALESCE potrafią złożyć z nich czytelny podpis bez zmieniania bazy.

2. Lista spóźnień. Na tablicy ogłoszeń pojawia się lista książek oddanych po terminie. DATEDIFF liczy dni spóźnienia, a DATE_FORMAT pokazuje datę w formacie dziennym. Uczeń od razu widzi, czy spóźnił się o dwa dni, czy o dwa tygodnie.

3. Raport miesięczny. Kierownik biblioteki chce wiedzieć, ile wypożyczeń rozpoczęto w każdym dniu września. Data jest grupowana i formatowana, a COUNT(*) liczy wpisy. Bez funkcji daty trzeba by ręcznie przepisywać dni z arkusza.

Matematyka: DATEDIFF przypomina odejmowanie punktów na osi liczbowej: wynik mówi, jak daleko od siebie leżą dwie daty. Kolejność argumentów ma znaczenie, podobnie jak kolejność liczb w odejmowaniu — zamiana miejscami zmienia znak wyniku.

Jak to się łączy…

W module 03 uczyliśmy się wybierać kolumny, a w module 04 grupować wyniki. Tutaj dokładamy funkcje, które przekształcają wartości przed pokazaniem ich w raporcie. W następnej sekcji połączymy je z funkcjami liczbowymi i CASE, a w module 09 wykorzystasz je w raporcie egzaminacyjnym.

Język polski: formatowanie daty to dobór formy do odbiorcy. W bazie data musi być jednoznaczna, ale w ogłoszeniu dla uczniów lepszy jest zapis 4 listopada 2026 niż 2026-11-04. Funkcja DATE_FORMAT pozwala pogodzić te dwa potrzeby.

Zadanie transferowe 1 — lista spóźnionych zwrotów

Bibliotekarka chce przygotować listę książek oddanych po terminie. Dla każdego takiego wypożyczenia potrzebuje numeru wypożyczenia, tytułu książki, daty zwrotu w formacie dziennym oraz liczby dni spóźnienia. Lista ma być posortowana od największego opóźnienia, a przy równych wartościach od najmniejszego numeru wypożyczenia. Opisz zapytanie, wskaż, które funkcje daty zastosujesz, i wyjaśnij, dlaczego warunek nie może brzmieć data_zwrotu = NULL.

Pokaż przykładowe rozwiązanie i kryteria

Przykład: łączę tabele wypozyczenia i ksiazki po ksiazka_id. W SELECT podaję w.id, k.tytul, DATE_FORMAT(w.data_zwrotu, '%d.%m.%Y') AS data_zwrotu oraz DATEDIFF(w.data_zwrotu, w.termin_zwrotu) AS dni_spoznienia. W WHERE sprawdzam w.data_zwrotu IS NOT NULL i DATEDIFF(...) > 0, a na końcu sortuję przez ORDER BY dni_spoznienia DESC, w.id. Warunek = NULL nie działa, bo NULL nie jest równe żadnej wartości; brak zwrotu sprawdza się przez IS NULL.

Kryteria: (1) funkcje — uczeń używa DATEDIFF i DATE_FORMAT; (2) warunek — odrzuca wypożyczenia niezwrócone i te oddane w terminie; (3) sortowanie — malejąco po dniach, z jednoznacznym drugim kluczem; (4) wyjaśnienie — poprawnie tłumaczy różnicę między NULL a wartością daty.

1. Która funkcja zwróci liczbę dni między terminem zwrotu a faktyczną datą zwrotu książki?
1. Która funkcja zwróci liczbę dni między terminem zwrotu a faktyczną datą zwrotu książki?
2. Chcesz zbudować podpis w postaci KOWALSKA A. z kolumn nazwisko i imie. Której funkcji użyjesz do sklejenia fragmentów?
2. Chcesz zbudować podpis w postaci KOWALSKA A. z kolumn nazwisko i imie. Której funkcji użyjesz do sklejenia fragmentów?
3. Kolumna telefon może zawierać NULL, a w raporcie ma pojawić się napis „brak telefonu”. Które wyrażenie da oczekiwany wynik?
3. Kolumna telefon może zawierać NULL, a w raporcie ma pojawić się napis „brak telefonu”. Które wyrażenie da oczekiwany wynik?

Funkcje liczbowe, CASE i raporty

Raport biblioteczny rzadko kończy się na wypisaniu wierszy. Najczęściej trzeba policzyć książki w kategoriach, uśrednić ceny, zsumować kary albo podzielić czytelników na grupy. Do tego służą funkcje liczbowe i agregujące. ROUND zaokrągla wynik, CEIL w górę, FLOOR w dół, ABS usuwa znak, a MOD zwraca resztę z dzielenia. Agregaty COUNT, SUM, AVG, MIN i MAX liczą wartości dla całej grupy wierszy.

Agregat bez grupowania zwraca jeden wiersz dla całej tabeli. Jeśli chcesz osobny wynik dla każdej kategorii, dodaj GROUP BY. Wtedy każda grupa daje jeden wiersz, a w SELECT mogą wystąpić kolumny grupujące i agregaty. Kolumna, której nie ma w GROUP BY i nie jest objęta agregatem, w MySQL może zostać wybrana, ale jej wartość jest nieprzewidywalna — lepiej tego unikać.

SELECT k.nazwa AS kategoria,
       COUNT(*) AS liczba_ksiazek,
       ROUND(AVG(s.cena), 2) AS srednia_cena,
       SUM(s.stan) AS egzemplarze
FROM ksiazki s
JOIN kategorie k ON k.id = s.kategoria_id
GROUP BY k.id, k.nazwa
HAVING COUNT(*) >= 2
ORDER BY srednia_cena DESC;

Klauzula HAVING filtruje grupy po obliczeniu agregatów, a WHERE filtruje pojedyncze wiersze przed grupowaniem. To rozróżnienie jest częstym pytaniem egzaminacyjnym. Warunek „kategoria ma co najmniej dwie książki” jest warunkiem na grupie, więc należy do HAVING. Warunek „książka kosztuje więcej niż 40 zł” dotyczy wiersza, więc należy do WHERE.

SELECT tytul, cena,
       CASE
         WHEN cena < 40 THEN 'tanio'
         WHEN cena < 60 THEN 'średnio'
         ELSE 'drogo'
       END AS polka_cenowa
FROM ksiazki
ORDER BY cena;

Wyrażenie CASE działa jak instrukcja warunkowa w języku programowania. Sprawdza kolejne warunki WHEN i zwraca wartość pierwszego spełnionego. Jeśli żaden nie pasuje, zwraca wartość po ELSE, a bez ELSE — NULL. Można je stosować nie tylko w SELECT, ale też w ORDER BY i wewnątrz agregatów, na przykład do zliczania warunkowego.

SELECT k.nazwa AS kategoria,
       SUM(CASE WHEN s.dostepna = 1 THEN 1 ELSE 0 END) AS dostepne,
       SUM(CASE WHEN s.dostepna = 0 THEN 1 ELSE 0 END) AS niedostepne
FROM ksiazki s
JOIN kategorie k ON k.id = s.kategoria_id
GROUP BY k.id, k.nazwa
ORDER BY k.nazwa;

Dobry raport odpowiada na konkretne pytanie i ma jednoznaczne nagłówki. Zamiast kolumny AVG(cena) lepiej nadać alias srednia_cena, a zamiast COUNT(*) — liczba_ksiazek. Wartości pieniężne zaokrąglaj do dwóch miejsc, a liczby egzemplarzy pozostawiaj całkowite. Po wykonaniu raportu sprawdź, czy suma grup zgadza się z sumą dla całej tabeli — to prosty test, czy nie zgubiłeś wierszy przez JOIN lub zbyt wąski warunek.

Średnia cena książki według kategorii 110 zł 0 zł 40,90 LIT 50,40 FAN 59,90 NAU 64,90 BIO 89,90 HIS 36,20 DZI 39,90 KOM 104,90 POD Najwyższa średnia występuje w kategoriach POD i HIS, a nie w najliczniejszej kategorii FAN.
Wykres powstał z tego samego zapytania co tabela raportu. Wartości są zaokrąglone do dwóch miejsc, ale do narysowania słupków wystarczy porównać ich wysokość.
Pytanie raportu Klauzula Przykład
Ile książek jest w każdej kategorii? GROUP BY + COUNT(*) jedna grupa na kategorię
Które kategorie mają co najmniej dwie książki? HAVING HAVING COUNT(*) >= 2
Jaka jest średnia cena w kategorii? AVG + ROUND ROUND(AVG(cena), 2)
Ile książek jest dostępnych, a ile niedostępnych? SUM(CASE ...) zliczanie warunkowe
Jak podzielić ceny na przedziały? CASE tanio, średnio, drogo

Przykłady z życia

1. Podsumowanie kiermaszu. Po kiermaszu książek nauczyciel chce wiedzieć, ile pozycji sprzedano w każdej kategorii i jaka była średnia cena. GROUP BY daje osobny wiersz dla kategorii, a SUM i AVG liczą wartości. Bez grupowania powstałby jeden ogólny wynik, z którego nie da się odczytać, co się sprzedało najlepiej.

2. Progi cenowe w księgarni. Sprzedawca oznacza książki metkami „do 40 zł”, „40–60 zł” i „powyżej 60 zł”. Wyrażenie CASE przypisuje każdą książkę do właściwego przedziału, a potem można policzyć, ile jest pozycji w każdej grupie. To szybki sposób na przygotowanie oferty promocyjnej.

3. Raport kar. Kierownik chce sumę kar według klas i średnią karę dla wypożyczeń, które w ogóle zostały obciążone opłatą. Warunek „kara większa od zera” trafia do WHERE, a sumowanie i średnia do agregatów. Dzięki temu średnia nie jest zaniżona przez wypożyczenia bez kary.

Geografia: klimatolodzy liczą średnią temperaturę dla regionu, a nie dla całego kraju, bo grupowanie po regionie ujawnia różnice, które giną w jednej średniej. Tak samo raport biblioteki grupuje książki po kategorii, żeby porównywać podobne zbiory, a nie mieszać podręczniki z komiksami.

Matematyka: AVG to średnia arytmetyczna, a ROUND zaokrągla wynik do wskazanej liczby miejsc. SUM dodaje składniki, ale tylko w obrębie jednej grupy. To dokładnie te operacje, które wykonujesz w tabeli na lekcji matematyki, tyle że SQL robi je dla tysięcy wierszy naraz.

Jak to się łączy…

W poprzedniej sekcji poznaliśmy funkcje daty i tekstu. Tutaj dodaliśmy liczby, agregaty i warunkowe CASE, więc potrafimy już zbudować pełny raport. W module 09 wykorzystasz go w scenariuszu egzaminacyjnym, a w module 04 przypomnisz sobie podstawy grupowania. Bezpieczeństwo raportów i dostęp do danych omówimy w następnej sekcji.

Geografia: zestawienia „średnia cena książki w kategorii” przypominają tabele z podręcznika, w których średnia temperatura jest liczona dla regionu, a nie dla całego świata. Grupa jest kluczowa: bez niej wynik jest poprawny matematycznie, ale bezużyteczny w raporcie.

4. Średnia cena książek wynosi 54,876 zł. Chcesz pokazać ją w raporcie jako 54,88. Które wyrażenie zastosujesz?
4. Średnia cena książek wynosi 54,876 zł. Chcesz pokazać ją w raporcie jako 54,88. Które wyrażenie zastosujesz?
5. Raport ma pokazać tylko kategorie, w których jest co najmniej trzy książki. Gdzie należy umieścić ten warunek?
5. Raport ma pokazać tylko kategorie, w których jest co najmniej trzy książki. Gdzie należy umieścić ten warunek?
6. Do czego służy wyrażenie CASE w zapytaniu raportowym?
6. Do czego służy wyrażenie CASE w zapytaniu raportowym?

Uprawnienia, SQL injection i kopie zapasowe

Baza biblioteki zawiera dane uczniów, więc dostęp do niej musi być kontrolowany. W MySQL każdy użytkownik ma nazwę, host i zestaw uprawnień. Zamiast pracować na koncie root, które może wszystko, tworzymy osobne konto dla bibliotekarza i przyznajemy mu tylko potrzebne operacje. To zasada najmniejszych uprawnień: konto raportowe potrzebuje SELECT, konto obsługi wypożyczeń także INSERT i UPDATE, a usuwanie rezerwacji może być ograniczone do jednej tabeli.

CREATE USER 'bibliotekarz'@'localhost'
  IDENTIFIED BY 'SilneHaslo2026!';

GRANT SELECT, INSERT, UPDATE
  ON biblioteka_szkolna.*
  TO 'bibliotekarz'@'localhost';

GRANT DELETE
  ON biblioteka_szkolna.rezerwacje
  TO 'bibliotekarz'@'localhost';

SHOW GRANTS FOR 'bibliotekarz'@'localhost';

Uprawnienia można odbierać poleceniem REVOKE. Jeśli bibliotekarz przestaje usuwać rezerwacje, odbieramy mu DELETE tylko z tej tabeli, nie ruszając pozostałych praw. Konto root w XAMPP często nie ma hasła i działa wyłącznie lokalnie — to wygodne w pracowni, ale niedopuszczalne na serwerze publicznym. Osobne konto z hasłem i ograniczonym hostem to minimum bezpieczeństwa.

Drugie zagrożenie to SQL injection. Powstaje, gdy aplikacja skleja zapytanie z danymi od użytkownika. Jeśli pole wyszukiwania przyjmie tekst ' OR '1'='1, naiwnie zbudowane zapytanie może zwrócić wszystkie książki zamiast jednej. W gorszym scenariuszu atakujący dopisze polecenie DELETE lub UPDATE. Samo „ukrycie” formularza nie chroni — każdy może wysłać żądanie bez przeglądarki.

-- Przykład niebezpiecznego zlepienia danych (nie rób tak w aplikacji):
-- SELECT id, tytul FROM ksiazki WHERE tytul = '' OR '1'='1';

-- Bezpieczne rozwiązanie w PHP: zapytanie parametryzowane
-- $stmt = $pdo->prepare('SELECT id, tytul FROM ksiazki WHERE tytul LIKE ?');
-- $stmt->execute(['%' . $szukany . '%']);

W zapytaniu parametryzowanym znaki zapytania są miejscami na wartości, a nie częścią tekstu SQL. Sterownik wysyła zapytanie i dane osobno, więc nawet cudzysłów w polu wyszukiwania nie zmieni struktury polecenia. Dodatkowo walidujemy typ danych, ograniczamy długość pól i nie pokazujemy użytkownikowi surowych błędów bazy. Uprawnienia ograniczają skutki ewentualnego włamania: konto raportowe z samym SELECT nie usunie tabeli, nawet jeśli injection się uda.

Trzecim filarem jest kopia zapasowa. Kopia logiczna to plik SQL z poleceniami CREATE TABLE i INSERT, tworzony przez mysqldump lub eksport w phpMyAdmin. Kopia fizyczna to kopia plików danych — szybsza przy dużych bazach, ale trudniejsza w przenoszeniu. W szkolnym projekcie wystarczy logiczna, wykonywana regularnie i przed każdą ryzykowną zmianą. Trzymaj ją poza katalogiem publicznym i nie wysyłaj mailem, jeśli zawiera dane osobowe.

-- Wiersz poleceń Windows, nie edytor SQL:
-- mysqldump -u root -p --single-transaction --result-file=kopia.sql biblioteka_szkolna

-- Po odtworzeniu sprawdź liczby wierszy:
SELECT COUNT(*) AS uczniowie FROM uczniowie;
SELECT COUNT(*) AS wypozyczenia FROM wypozyczenia;

Kopia bez testu odtworzenia jest obietnicą, nie zabezpieczeniem. Przynajmniej raz na jakiś czas zaimportuj ją do osobnej bazy i sprawdź, czy tabele powstają, czy klucze obce są poprawne i czy liczby wierszy się zgadzają. W razie incydentu kolejność jest prosta: odetnij dostęp, zmień hasła, sprawdź logi, oceń zakres zmian, odtwórz dane z kopii i dopiero potem wracaj do pracy. Pośpiech bez kopii zwykle powiększa szkody.

Bezpieczeństwo to kilka warstw, nie jedno pole Walidacja typ, długość, zakres formularz i serwer Parametryzacja zapytania przygotowane dane osobno od SQL Uprawnienia najmniejsze możliwe osobne konta Kopia regularna i testowana poza katalogiem www Audyt logi i przegląd praw reakcja na incydent Jedna warstwa może zawieść. Dopiero ich połączenie ogranicza skutki błędu. Konto root bez hasła w XAMPP jest wygodne lokalnie, ale nie może trafić na produkcję.
Bezpieczeństwo bazy nie zależy od jednego mechanizmu. Walidacja, parametryzacja, uprawnienia, kopia i audyt uzupełniają się nawzajem.
Zagrożenie Zły nawyk Bezpieczne rozwiązanie
SQL injection sklejanie zapytania z tekstem z formularza zapytania parametryzowane i walidacja
Zbyt szerokie prawa wszyscy pracują na koncie root osobne konta i zasada najmniejszych uprawnień
Utrata danych kopia tylko na tym samym dysku kopia poza serwerem i test odtworzenia
Wyciek hasła hasło w pliku w katalogu publicznym konfiguracja poza katalogiem www i zmiana hasła

Przykłady z życia

1. Klucz do biblioteki. Woźny ma klucz do wszystkich drzwi, bibliotekarz tylko do wypożyczalni, a uczeń w ogóle nie wchodzi za ladę. Uprawnienia w bazie działają tak samo: każde konto dostaje dostęp do tych tabel i operacji, których naprawdę potrzebuje.

2. Zgubiony telefon z dostępem do dziennika. Nauczyciel traci telefon z zapisanym hasłem. Dobrą reakcją jest natychmiastowa zmiana hasła i odebranie uprawnień, a nie czekanie do końca dnia. Kopia zapasowa pozwala sprawdzić, czy w tym czasie nie zmieniono ocen.

3. Kopia przed aktualizacją. Przed wgraniem nowej wersji aplikacji administrator robi eksport bazy i testuje odtworzenie na komputerze lokalnym. Jeśli aktualizacja uszkodzi dane, wraca do kopii w kilka minut, zamiast odtwarzać wszystko ręcznie.

Informatyka: hasło do bazy jest jak klucz w kodzie aplikacji: nie powinno leżeć w repozytorium ani w pliku dostępnym przez przeglądarkę. Konfigurację trzyma się poza katalogiem publicznym, a w repozytorium zapisuje się tylko przykład bez prawdziwych danych.

Jak to się łączy…

W module 02 poznaliśmy import i eksport, a w module 07 transakcje, które pozwalają wycofać błędne zmiany. Tutaj łączymy te narzędzia z uprawnieniami i ochroną przed injection. W module 09 sprawdzisz cały scenariusz egzaminacyjny, w tym eksport końcowy i weryfikację danych.

Wiedza o społeczeństwie: zasada najmniejszych uprawnień przypomina zasadę pomocniczości — każdy odpowiada tylko za swój zakres. Uczeń nie potrzebuje dostępu do danych całej szkoły, a aplikacja raportowa nie potrzebuje prawa usuwania tabel.

Zadanie transferowe 2 — podejrzany dostęp do bazy

Nauczyciel zauważył, że w kodzie strony biblioteki jest jawnie zapisane hasło do bazy, a w logach pojawiły się nietypowe zapytania po godzinach lekcyjnych. Opisz pierwszą godzinę działań: co zablokujesz, jakie hasła zmienisz, gdzie sprawdzisz ślady i kiedy odtworzysz dane z kopii. Wyjaśnij, dlaczego samo usunięcie hasła z pliku nie wystarczy.

Pokaż przykładowe rozwiązanie i kryteria

Przykład: najpierw odcinam dostęp do bazy i strony, zmieniam hasło konta aplikacji oraz hasło root, a następnie odbieram zbędne uprawnienia i tworzę nowe konto tylko z potrzebnym zakresem. Sprawdzam logi serwera i bazy, listę kont oraz czasy ostatnich zmian w tabelach. Jeśli dane zostały zmienione, odtwarzam je z ostatniej kopii do osobnej bazy, porównuję liczby wierszy i dopiero potem przełączam aplikację. Usunięcie hasła z pliku nie wystarczy, bo mogło ono zostać skopiowane i nadal działa na starym koncie.

Kryteria: (1) reakcja — uczeń blokuje dostęp i zmienia hasła, zamiast tylko poprawiać plik; (2) uprawnienia — ogranicza prawa kont i sprawdza listę użytkowników; (3) dowody — wskazuje logi i porównanie danych jako źródło informacji o zakresie zmian; (4) odtworzenie — testuje kopię i weryfikuje dane przed przywróceniem produkcji.

7. Jakie uprawnienia powinno mieć konto bibliotekarza obsługujące wypożyczenia i zwroty?
7. Jakie uprawnienia powinno mieć konto bibliotekarza obsługujące wypożyczenia i zwroty?
8. Który mechanizm najskuteczniej chroni aplikację przed SQL injection?
8. Który mechanizm najskuteczniej chroni aplikację przed SQL injection?
9. Co najlepiej potwierdza, że kopia zapasowa bazy jest rzeczywiście użyteczna?
9. Co najlepiej potwierdza, że kopia zapasowa bazy jest rzeczywiście użyteczna?

Ćwiczenia SQL

Zadania do samodzielnego wykonania w edytorze SQL.