GRANT SELECT ON hurtownia.* TO 'sprzedawca'@'localhost'; Podane w ramce polecenie SQL nadaje prawo SELECT
GRANT SELECT ON hurtownia.* TO 'sprzedawca'@'localhost';Podane w ramce polecenie SQL nadaje prawo SELECT
A. do wszystkich tabel w bazie hurtownia.
B. do wszystkich pól w tabeli hurtownia.
C. dla użytkownika root na serwerze localhost.
D. dla użytkownika root na serwerze sprzedawca.
Pytanie z egzaminu CKE, styczeń 2020 (arkusz E.14-SG-20.01).
Polecenie GRANT SELECT ON hurtownia.* TO 'sprzedawca'@'localhost'; nadaje użytkownikowi sprzedawca, logującemu się z hosta localhost, uprawnienie SELECT do wszystkich tabel znajdujących się w bazie danych hurtownia. Kluczowy jest zapis hurtownia.*, gdzie część przed kropką oznacza nazwę bazy danych, a gwiazdka po kropce oznacza wszystkie obiekty tabelaryczne w tej bazie, najczęściej po prostu wszystkie tabele. Nie chodzi tu o wszystkie pola jednej tabeli, bo tabela nie została wskazana z nazwy. Gdybyśmy chcieli nadać uprawnienie tylko do jednej tabeli, zapis wyglądałby np. hurtownia.produkty. W praktyce takie polecenie stosuje administrator bazy, gdy chce dać komuś dostęp tylko do odczytu danych, bez możliwości ich zmiany. To jest zgodne z zasadą najmniejszych uprawnień: użytkownik dostaje tylko to, co jest mu potrzebne. Moim zdaniem to jedna z ważniejszych dobrych praktyk w SQL, bo ogranicza ryzyko przypadkowego usunięcia albo modyfikacji danych.
W tym poleceniu łatwo pomylić kilka rzeczy, bo składnia GRANT jest krótka, ale ma konkretne znaczenie. Zapis hurtownia.* nie oznacza wszystkich pól w tabeli o nazwie hurtownia. W SQL po lewej stronie kropki zwykle podaje się bazę danych, a po prawej tabelę lub symbol wieloznaczny. Gwiazdka w tym miejscu nie odnosi się do kolumn tak jak w zapytaniu SELECT * FROM tabela, tylko do wszystkich tabel w podanej bazie. To częsty błąd myślowy: ktoś widzi SELECT i *, więc od razu kojarzy to z pobieraniem wszystkich kolumn, ale w poleceniu GRANT kontekst jest inny. Równie ważne jest odczytanie części TO 'sprzedawca'@'localhost'. Ona wskazuje konto użytkownika, któremu nadajemy uprawnienia, a nie konto root. Użytkownik root w ogóle nie pojawia się w tym poleceniu, więc nie można zakładać, że to jego dotyczą przywileje. W MySQL konto składa się z nazwy użytkownika oraz hosta, z którego może się łączyć. Dlatego 'sprzedawca'@'localhost' oznacza użytkownika sprzedawca dostępnego lokalnie na serwerze bazy. Nie oznacza też użytkownika root na serwerze sprzedawca, bo sprzedawca jest nazwą konta, a localhost nazwą hosta. Z mojego doświadczenia warto zawsze czytać GRANT według schematu: jakie uprawnienie, na jakim obiekcie, dla jakiego użytkownika i z jakiego hosta. Wtedy takie pytania robią się dużo prostsze.