Temat: Administrowanie użytkownikami bazy danych. Po instalacji serwera MYSQL dostępne jest konto o nazwie root. Domyślnie nie ma ono przypisanego hasła, aczkolwiek podczas procesu konfiguracji jest możliwość nadania go. Użytkownik root ma największe uprawnienia dotyczące bazy danych, zarówno w zakresie administrowania bazami (tworzenie, usuwanie, modyfikowanie), jak i w zakresie tworzenia kont użytkowników i nadawania im uprawnień. Brak przypisanego hasła dla użytkownika root umożliwia zalogowanie się do bazy danych bez hasła, tylko poprzez podanie nazwy użytkownika. Aby nadać hasło użytkownikowi root, korzystamy z programu narzędziowego mysqladmin z komendą password. W systemowej tabeli user bazy danych mysql możemy znaleźć użytkownika root wraz z zaszyfrowanym hasłem i nazwą hosta. Nasz użytkownik root nie posiada na razie hasła. TWORZENIE UŻYTKOWNIKA 1. Utworzenie konta użytkownika odbywa się za pomocą klauzuli: CREATE USER nazwa_użytkownika; Utwórz nowego użytkownika o nazwie sosna. CREATE USER sosna; 2. Utworzony przez nas użytkownik będzie od razu widoczny w tabeli systemowej user. 3. W tabeli user jest widoczny w kolumnie host znak %. Oznacza on, że użytkownik ma możliwość logowania się do dowolnego serwera bazy danych. Dla użytkownika z podaną nazwą komputera, na przykład localhost, w miejscu tym pojawi się właśnie taka nazwa. 4. Aby utworzyć użytkownika z prawem korzystania tylko z serwera umieszczonego pod adresem localhost, po nazwie użytkownika podajemy znak @ i nazwę hosta. CREATE USER nazwa_użytkownika@localhost; Utwórz nowego użytkownika o nazwie brzoza z dostępem tylko do serwera localhost. CREATE USER brzoza@localhost; Pozwoli to na ograniczenie dostępu użytkownika do konkretnego serwera. Tym razem w tabeli systemowej user zobaczymy przy użytkowniku brzoza w kolumnie host nazwę localhost. 1
5. Jeśli chcemy, aby użytkownik musiał używać hasła do zalogowania się do bazy danych, powinniśmy nieco rozbudować nasze polecenie. Na jego końcu podajemy klauzulę IDENTIFIED BY, a po niej w apostrofach hasło do zalogowania. CREATE user nazwa_użytkownika@localhost IDENTIFIED BY hasło ; Utwórz nowego użytkownika wierzba z hasłem drzewa. CREATE user wierzba@localhost IDENTIFIED BY drzewa ; Hasło użytkownika wierzba będzie przechowywane w zakodowanej postaci w tabeli systemowej USER w kolumnie password. 6. Użytkownik z nadanym hasłem, aby dostać się do serwera baz danych, musi podać hasło, inaczej logowanie nie powiedzie się. Dokonaj próby logowania użytkownika wierzba bez podania hasła (w drugim oknie konsoli). 7. Dokonaj próby logowania użytkownika wierzba z podaniem hasła. 8. Samo utworzenie użytkownika nie oznacza przydzielenia mu uprawnień na razie użytkownik wierzba nie może połączyć się z bazą. 9. Utwórz nowego użytkownika modrzew z hasłem las. Wyświetl zawartość tabeli USER. 2
NADAWANIE UPRAWNIEŃ UŻYTKOWNIKOWI Nadawanie użytkownikowi uprawnień odbywa się za pomocą komendy GRANT. Jeśli użytkownik nie ma hasła, po komendzie GRANT podajemy rodzaj uprawnienia. Słowo ALL oznacza wszystkie możliwe uprawnienia. Następnie podajemy słowo ON, a po nim nazwę bazy danych lub tabeli. Wyrażenie *.* oznacza dostęp do wszystkich baz i tabel. Część przed znakiem kropki oznacza bazę danych, a po znaku kropki tabelę. Za nimi, po słowie TO podajemy nazwę użytkownika wraz z nazwą hosta po znaku @. GRANT ALL ON *.* TO brzoza@localhost; 1. Po nadaniu użytkownikowi brzoza dostępu do wszystkich baz danych za pomocą przywileju ALL może się on połączyć z dowolną bazą danych. Jeżeli natomiast spróbujemy nadać te same uprawnienia nowemu użytkownikowi, dla którego uprzednio nie założyliśmy konta na serwerze, otrzymamy komunikat o błędzie. 2. Aby nadać uprawnienia użytkownikowi, którego konto wymaga podania hasła, należy polecenie GRANT wzbogacić o klauzulę IDENTIFIED BY, po której podajemy w apostrofach, tak jak w przypadku tworzenia użytkownika, hasło logowania. GRANT ALL ON *.* TO wierzba@localhost IDENTIFIED BY drzewa ; 3. Użytkownik, któremu zostało nadane hasło, nie zaloguje się do system bez jego podania. Dopisanie do poprzedniego polecenia klauzuli IDENTIFIED BY da ten sam przywilej użytkownikowi dostępu do wszystkich baz danych. 4. Uprawnienia dla użytkownika mogą dotyczyć również tylko konkretnej bazy danych. Wystarczy w tym przypadku po słowie ON, przed znakiem kropki, podać nazwę bazy danych. Znak gwiazdki podany po znaku kropki oznacza wszystkie tabele w bazie. GRANT ALL ON firma.* TO modrzew@localhost IDENTIFIED BY las ; Taki użytkownik będzie mógł wykonywać wszelkie operacje, ale tylko w ramach podanej bazy. Próba dostania się do innej bazy zakończy się niepowodzeniem. Korzystając z tych opcji, możemy więc precyzyjnie określić zakres uprawnień. 5. Uprawnienia użytkownika można również zawęzić do jednej tabeli z konkretnej bazy danych. GRANT ALL ON hurtownia.towary TO sosna@localhost; 3
Próba pobrania wyników z tabeli zamowienia nie powiedzie się. Użytkownik będzie miał tylko dostęp do tabeli towary. 6. Podając typ obiektu bazy danych, możemy nadać użytkownikowi uprawnienia tylko do tego obiektu. Wpisanie słowa PROCEDURE nada uprawnienia tylko do procedur. GRANT ALL ON PROCEDURE nazwa_bazy_danych.nazwa_tabeli TO nazwa_użytkownika@localhost IDENTIFIED BY hasło ; W tym celu po klauzuli ON, a przed wprowadzeniem nazwy bazy i tabeli, podajemy typ dostępowego obiektu. Wpisanie PROCEDURE umożliwia dostęp tylko do procedur bazy, czyli do wstępnie zdefiniowanych powtarzalnych operacji. Ograniczony do procedur użytkownik otrzyma komunikat o błędzie za każdym razem, gdy na przykład zechce wykonać inne działanie niż te, które są określone w procedurach. 7. Oprócz typu obiektu uprawnienia możemy ograniczyć za pomocą typu przywileju. Do tej pory stosowaliśmy typ ALL. Istnieje jednak więcej ich rodzajów z najważniejszymi z nich możesz się zapoznać w tabeli Przywileje użytkownika. Przywilej ALL ALTER CREATE CREATE TEMPORARY TABLES CREATE USER CREATE VIEW DELETE DROP FILE GRANT OPTION INDEX INSERT LOCK TABLES SELECT SHOW DATABASES SHOW VIEW SUPER TRIGGER UPDATE USAGE PRZYWILEJE UŻYTKOWNIKA Znaczenie Przywilej do wszystkiego, oprócz możliwości nadawania przywilejów innym użytkownikom Umożliwia wykonywanie polecenia ALTER TABLE Umożliwia tworzenie baz danych i tabel Umożliwia tworzenie tabel tymczasowych Umożliwia tworzenie i usuwanie użytkownika, zmianę nazwy użytkownika i usuwanie uprawnienia użytkownikowi Umożliwia tworzenie i aktualizowanie struktury widoku Umożliwia usuwanie danych z obiektów Umożliwia usuwanie baz, danych i widoków Umożliwia odczyt i zapis danych do pliku Umożliwia nadawanie i odbieranie uprawnień innym użytkownikom Umożliwia tworzenie i usuwanie indeksów z tabel Umożliwia wykonywanie polecenia INSERT Umożliwia blokowanie tabel, pod warunkiem posiadania przywileju SELECT Umożliwia wykonywanie polecenia SELECT Umożliwia pobieranie listy baz danych Umożliwia przeglądanie listy widoków Umożliwia wykonywanie wszystkich operacji administratora Umożliwia wykonywanie operacji związanych z triggerami Umożliwia wykonywanie polecenia UPDATE Brak przywilejów 4
8. Polecenie nadające uprawnienia użytkownikowi może również zezwalać mu na nadawanie praw innym użytkownikom. Dla przywileju ALL nie jest to jednak ustawione domyślnie. Żeby aktywować możliwość nadawania uprawnień, musimy rozbudować polecenie poprzez dodanie na jego końcu klauzuli WITH, po której podajemy opcję przywileju. Wstawienie GRANT OPTION pozwoli na nadawanie uprawnień innym użytkownikom. GRANT ALL ON *.* TO wierzba@localhost IDENTIFIED BY drzewa WITH GRANT OPTION; Po dodaniu klauzuli WITH GRANT OPTION użytkownik może nadawać uprawnienia innym użytkownikom. Zaloguj się w drugim oknie konsoli jako użytkownik wierzba. Zmień uprawnienia użytkownikowi modrzew. GRANT SELECT ON hurtownia.towary TO modrzew@localhost; W tym przypadku użytkownikowi modrzew został nadany przywilej pobierania danych z tabeli towary w bazie danych hurtownia. 9. Użytkownik modrzew może więc pobierać dane z tabeli towary, ale nie może wykonywać żadnych operacji na tej tabeli. Zaloguj się w nowym oknie jako użytkownik modrzew i spróbuj usunąć towary o cenie powyżej 15 zł. ODBIERANIE UPRAWNIEŃ UŻYTKOWNIKOWI Tak jak nadajemy, tak również możemy poszczególnym użytkownikom odbierać uprawnienia. Może być to pomocne w sytuacji, kiedy dana osoba zmieniła zakres obowiązków i dostęp tego użytkownika do określonych danych nie jest już potrzebny. 1. Za odbieranie uprawnień użytkownikowi odpowiada polecenie REVOKE. REVOKE ALL ON nazwa_bazy.nazwa_tabeli FROM nazwa_użytkownika@localhost; Użytkownik modrzew miał przywilej do pobierania danych z tabeli towary bazy danych hurtownia. Spróbujmy odebrać mu uprawnienia do bazy danych hurtownia. REVOKE SELECT ON hurtownia.towary FROM modrzew@localhost; 5
Na początku polecenia podajemy słowo REVOKE, a po nim typ przywileju, który chcemy odebrać. Po klauzuli ON podajemy nazwę bazy danych i tabel, do których będzie odbierane uprawnienie. W tym przypadku jest to tabela towary z bazy hurtownia. Następnie po klauzuli FROM podajemy nazwę użytkownika wraz z hostem. Przed odebraniem uprawnienia użytkownik mógł przeglądać dane z tabeli towary bazy hurtownia, a po odebraniu uprawnień otrzymuje komunikat o błędzie. 2. Za pomocą opcji REVOKE OPTION podanej po typie przywileju możemy odebrać wszystkie uprawnienia, także uprawnienie do nadawania i odbierania uprawnień innym użytkownikom. REVOKE ALL, GRANT OPTION FROM wierzba@localhost; Tym razem użytkownik wierzba po zalogowaniu nie ma nawet prawa połączyć się z żadną bazą danych. 3. Aby sprawdzić informacje na temat uprawnień danego użytkownika, wystarczy wykonać polecenie rozpoczynające się od klauzuli SHOW GRANTS FOR, po której podajemy nazwę użytkownika. SHOW GRANTS FOR wierzba@localhost; Użytkownik wierzba nie ma już żadnych uprawnień, co widać w tabeli: Natomiast w przypadku użytkownika brzoza zostaną wyświetlone nadane mu uprawnienia, ponieważ nie zostały mu odebrane. USUWANIE UŻYTKOWNIKA 1. Użytkownika usuwamy za pomocą klauzuli DROP USER, po której podajemy nazwę użytkownika: DROP USER nazwa_użytkownika; W ten sposób usuwa się użytkownika, który nie miał przydzielonego konkretnego hosta. Usuń użytkownika sosna: 2. Próba usunięcia użytkownika, któremu przydzielono konkretny host, bez podania w poleceniu DROP hosta, zakończy się błędem. 6
Tego typu użytkownik zostanie usunięty, gdy po jego nazwie podamy znak @ i nazwę hosta. DROP USER brzoza@localhost; 3. Żeby czasowo zablokować użytkownikowi możliwość zalogowania do bazy danych możemy wykonać polecenie DELETE na tabeli user. DELETE FROM user WHERE user = nazwa_użytkownika ; Jednak jego uprawnienia pozostaną, więc gdy później ponownie dodamy konto tego użytkownika, od razu odzyska uprawnienia. ZMIANA NAZWY UŻYTKOWNIKA Czasem istnieje potrzeba dokonania zmiany nazwy użytkownika. Nie musimy wtedy usuwać i ponownie tworzyć nowego użytkownika, zwłaszcza jeśli ma on już przydzielone określone przywileje. 1. Zmiany nazwy użytkownika dokonujemy za pomocą klauzuli RENAME USER, po której podajemy starą nazwę użytkownika, słowo TO i nową nazwę użytkownika. RENAME USER stara_nazwa_użytkownika TO nowa_nazwa_użytkownika; Załóż konto dla nowego użytkownika o nazwie grab bez konkretnego hosta. CREATE USER grab; Nadaj mu uprawnienia do wszystkich tabel w bazie danych firma. GRANT ALL ON firma.* TO grab; Dokonaj zmiany nazwy użytkownika grab na klon: RENAME USER grab TO klon; Wykonując takie polecenie dla użytkownika grab, powodujemy iż od tej pory będzie musiał logować się jako klon. Zaloguj się w nowym oknie jako użytkownik klon i sprawdź jego uprawnienia. 2. Jeśli użytkownik wcześniej miał przydzielony host, należy go uwzględnić w nazwie użytkownika. Dokonaj zmiany nazwy użytkownika modrzew na cis: RENAME USER modrzew@localhost TO cis@localhost; Zaloguj się w nowym oknie jako użytkownik cis, podaj hasło (las) i sprawdź uprawnienia użytkownika. 7
SKŁADNIA POLECEŃ SQL DO ZARZĄDZANIA UŻYTKOWNIKAMI Składnia polecenia* Znaczenie CREATE USER user[@host] Tworzenie użytkownika user [z przypisanym [IDENTIFIED BY [PASSWORD] password ] hostem host] [identyfikującego się hasłem [password]. DROP USER user[@host] Usuwanie użytkownika user [z przypisanym GRANT przywilej [lista_kolumn] ON [obiekt] dostęp TO user[@host] [IDENTIFIED BY [PASSWORD ] password ] [WITH GRANT OPTION] REVOKE przywilej [lista_kolumn] ON [obiekt] dostęp FROM user[@host] REVOKE ALL PRIVILEGES, GRANT OPTION FROM user[@host] RENAME USER old_user TO new_user hostem host]. Nadawanie uprawnienia użytkownikowi user [z przypisanym hostem host] [identyfikującym się hasłem password] z przywilejem przywilej [do obiektu obiekt] i dostępie do bazy danych nazwa_bazy i tabeli nazwa_tabeli. obiekt: TABLE lub FUNCTION lub PROCEDURE dostęp: * lub *.* lub nazwa_bazy.* lub nazwa_bazy.*nazwa_bazy.nazwa_tabeli lub nazwa_tabeli Odbieranie uprawnienia użytkownikowi user [z przypisanym hostem host] [identyfikującym się hasłem password] z przywilejem przywilej [do obiektu obiekt] i dostępie do bazy danych nazwa_bazy i tabeli nazwa_tabeli. obiekt: TABLE lub FUNCTION lun PROCEDURE dostęp: * lub *.* lub nazwa_bazy.* lub nazwa_bazy.nazwa_tabeli lub nazwa_tabeli Zmiana nazwy użytkownika. * część poleceń w nawiasach kwadratowych [] można pominąć, ponieważ uprawnienia można nadawać także użytkownikowi, który nie ma przypisanego hasła ani hosta, natomiast przywilej nie musi dotyczyć konkretnego obiektu 8