KWALIFIKACJA INF3 - CZERWIEC 2021

PYTANIE NR 23.
W języku SQL, aby zabezpieczyć kwerendę CREATE USER tak, aby nie zostało utworzone konto w przypadku, gdy już istnieje, można posłużyć się składnią
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Składnia "CREATE USER IF NOT EXISTS …" w MySQL 8.0+ powoduje, że polecenie nie zakończy się błędem i nie utworzy duplikatu, gdy konto już istnieje.
Wariant bez IF NOT EXISTS zwróci błąd przy istniejącym użytkowniku, a formy "OR DROP" i "OR REPLACE" nie są poprawną składnią MySQL dla CREATE USER.

Pełne wyjaśnienie:

W MySQL (w wersjach 8.0 i nowszych) polecenie CREATE USER może być rozszerzone o klauzulę IF NOT EXISTS. Jej celem jest wykonanie operacji w sposób idempotentny, czyli tak, aby wielokrotne uruchomienie tego samego skryptu dawało ten sam efekt i nie przerywało automatyzacji.

Odpowiedź "CREATE USER IF NOT EXISTS 'anna'@'localhost' IDENTIFIED BY 'yu&T%';" jest poprawna, ponieważ przy istniejącym koncie serwer nie próbuje tworzyć duplikatu i nie zgłasza błędu związanego z istnieniem użytkownika. To jest szczególnie ważne w skryptach wdrożeniowych (CI/CD), inicjalizacji środowisk (np. kontenery) oraz w narzędziach konfiguracji, gdzie nie chcemy ręcznie sprawdzać stanu bazy przed każdym uruchomieniem.

Opcja "CREATE USER 'anna'@'localhost' IDENTIFIED BY 'yu&T%';" nie spełnia wymogu z treści pytania: gdy użytkownik już istnieje, polecenie zwróci błąd i skrypt może się zatrzymać.

Opcje z "CREATE USER OR DROP …" oraz "CREATE OR REPLACE USER …" nie odpowiadają składni MySQL dla tworzenia kont. Brzmią jak próba połączenia dwóch operacji lub przeniesienie nawyków z innych systemów, ale w MySQL w tym miejscu nie występują takie konstrukcje.

Warto zapamiętać: format konta w MySQL to zwykle 'nazwa'@'host' (np. 'anna'@'localhost'), a hasło ze znakami specjalnymi powinno być ujęte w cudzysłowy, aby uniknąć problemów składniowych.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
IF NOT EXISTS sprawia, że polecenie tworzenia użytkownika jest bezpieczne do wielokrotnego uruchamiania. Gdy konto już istnieje, MySQL nie próbuje tworzyć duplikatu i nie przerywa skryptu błędem. To kluczowe w automatyzacji wdrożeń i inicjalizacji baz.
Bez IF NOT EXISTS ponowne uruchomienie skryptu zwykle kończy się błędem, bo użytkownik już istnieje. W pipeline CI/CD taki błąd często zatrzymuje cały proces wdrożenia. IF NOT EXISTS pozwala pisać skrypty idempotentne i bardziej odporne.
W MySQL konto jest identyfikowane jako para: 'użytkownik'@'host', np. 'anna'@'localhost'. Ten zapis ma znaczenie, bo ten sam użytkownik z innym hostem to inne konto. Pominięcie hosta lub błędny zapis może prowadzić do błędów składni.
Nie. To rozszerzenie specyficzne dla MySQL (w praktyce spotykane w różnych DBMS w różnych miejscach, ale nie jako jednolity standard). Na egzaminie trzeba rozpoznawać, które elementy składni są charakterystyczne dla danego silnika.
Najczęściej przy automatyzacji: skrypty inicjalizacyjne bazy dla aplikacji WWW, przygotowanie środowisk testowych i produkcyjnych, kontenery (Docker) oraz narzędzia typu Ansible. Dzięki temu skrypt można uruchamiać wielokrotnie bez ręcznego sprawdzania stanu bazy.
Częste pomyłki to: użycie składni z innej bazy (np. "OR REPLACE"), brak części @'host', brak cudzysłowów przy haśle ze znakami specjalnymi oraz założenie, że IF NOT EXISTS działa w każdej wersji MySQL. Warto testować skrypt na docelowej wersji.
W PostgreSQL podejście jest inne: samo CREATE USER/ROLE nie ma takiej prostej klauzuli w tym miejscu, a idempotencję robi się zwykle blokiem proceduralnym i obsługą wyjątków. Dlatego nie należy bezrefleksyjnie przenosić składni między DBMS.
Hasło należy ująć w cudzysłowy/apostrofy zgodnie ze składnią danego DBMS (w MySQL typowo pojedyncze apostrofy). Dzięki temu znaki typu &, %, czy spacje nie rozwalą parsera SQL. Dodatkowo warto unikać wklejania haseł w logach i repozytorium.
Wskazówką jest m.in. zapis konta jako 'nazwa'@'host' oraz konkretne polecenia administracyjne dla użytkowników. Jeśli w odpowiedziach pojawia się IF NOT EXISTS przy CREATE USER i format 'user'@'localhost', to jest to typowy kontekst MySQL 8.0+.
Stosowano sprawdzenie istnienia konta przed utworzeniem (zapytanie do tabel systemowych) albo obsługę błędu w logice skryptu/aplikacji. To jest bardziej rozbudowane i mniej wygodne w prostych skryptach inicjalizacyjnych, dlatego IF NOT EXISTS jest praktycznym ułatwieniem.
info

To pytanie poprawnie rozwiązuje 51% zdających egzamin. trudne

Źródła:

  • MySQL 8.0 Reference Manual: "CREATE USER Statement" (opis składni z IF NOT EXISTS), https://dev.mysql.com/doc/refman/8.0/en/create-user.html - dostęp 2026-03-01
  • MySQL 8.0 Reference Manual: "Error Message Reference" (błędy związane z kontami/użytkownikami, w tym przypadki gdy konto istnieje), https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html - dostęp 2026-03-01
  • Oracle MySQL Documentation: "MySQL 8.0 Release Notes" (kontekst wersji i zmian w 8.0), https://dev.mysql.com/doc/relnotes/mysql/8.0/en/ - dostęp 2026-03-01

Materiały:

  • Dokumentacja MySQL 8.0 Reference Manual: CREATE USER
  • Ćwiczenia praktyczne: tworzenie użytkowników i nadawanie uprawnień w MySQL
  • Notatki porównawcze składni MySQL vs PostgreSQL vs Oracle dla tworzenia ról/użytkowników

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego