Wykład 5 SQL 4 Structured Query Lenguage Instrukcje sterowania danymi Bazy Danych - A. Dawid 2011 1
CREATE USER Tworzy nowego użytkownika Składnia CREATE USER specyfikacja użytkownika [, specyfikacja użytkownika]... user_specification: użytkownik [IDENTIFIED BY [PASSWORD] hasło'] mysql> CREATE USER 'adam'@'localhost' IDENTIFIED BY 'hasło'; Query OK, 0 rows affected (0.03 sec) mysql> CREATE USER 'adam'@ %' IDENTIFIED BY 'hasło'; Bazy Danych - A. Dawid 2011 2
DROP USER Usuwa użytkownika Składnia DROP USER specyfikacja użytkownika mysql> DROP USER 'adam'@'localhost''; Query OK, 0 rows affected (0.0 sec) Bazy Danych - A. Dawid 2011 3
RENAME USER Zmienia nazwę użytkownika Składnia RENAME USER stara_nazwa TO now_nazwa mysql> RENAME USER 'adam'@'localhost TO marek @ localhost ; Query OK, 0 rows affected (0.0 sec) Bazy Danych - A. Dawid 2011 4
SET PASSWORD Zmienia hasło użytkownika Składnia SET PASSWORD [FOR user] = { PASSWORD( haslo') OLD_PASSWORD( haslo') 'encrypted password' } mysql> SET PASSWORD FOR 'adam'@'localhost = PASSWORD( adam11 ); Query OK, 0 rows affected (0.0 sec) Bazy Danych - A. Dawid 2011 5
GRANT Nadaje uprawnienia użytkownikom Składnia GRANT uprawnienie.,.. ON nazwa obiektu TO {użytkownik.,..} [REQUIRE {NONE opcje_ssl [AND] opcje_ssl]...} PUBLIC [ opcje grant]; uprawnienie::= {ALL PRIVILAGES} { SELECT DELETE INSERT UPDATE [ ( nazwa kolumny.,..)]} REFERENCES [ (nazwa kolumny.,..)]} USAGE } Bazy Danych - A. Dawid 2011 6
Nazwa obiektu::= [TABLE] nazwa tablicy DOMAIN nazwa domeny COLLATION nazwa porównania CHARACTER SET nazwa zbioru znakowego TRANSLATION nazwa translacji opcje_ssl: SSL X509 CIPHER 'cipher' ISSUER 'issuer' SUBJECT 'subject' opcje grant::= WITH GRANT OPTION MAX_QUERIES_PER_HOUR liczba MAX_UPDATES_PER_HOUR liczba MAX_CONNECTIONS_PER_HOUR liczba MAX_USER_CONNECTIONS liczba Bazy Danych - A. Dawid 2011 7
Przykłady Tworzymy nowego użytkownika CREATE USER 'adam'@'localhost' IDENTIFIED BY 'hasło'; Nowy użytkownik nie ma żadnych przywilejów Nadajemy uprawnienia administratora GRANT ALL PRIVILEGES ON *.* TO 'adam'@'localhost' WITH GRANT OPTION; Nadajemy uprawnienia tylko do korzystania z bazy Magazyn. GRANT USAGE ON magazyn.* TO 'adam'@'localhost' WITH GRANT OPTION; Bazy Danych - A. Dawid 2011 8
Przykłady Nadajemy uprawnienia do tworzenia nowych obiektów GRANT CREATE ON *.* TO 'adam'@'localhost' WITH MAX_QUERIES_PER_HOUR 90 ; Nadajemy uprawnienia tylko do ogladania tabeli dokumenty w bazie magazyn GRANT SELECT ON magazyn.dokumenty TO 'adam'@'localhost' WITH GRANT OPTION; GRANT UPDATE(NrDok,cena),INSERT(cena,NrTow) ON magazyn.dokumenty TO 'adam'@'localhost' REQUIRE SSL WITH GRANT OPTION; Bazy Danych - A. Dawid 2011 9
REVOKE Odwołuje uprawnienia użytkownikom Składnia REVOKE [GRANT OPTION] {ALL PRIVILAGES } {uprawnienie.,..} ON nazwa obiektu FROM PUBLIC {użytkownik.,..} CASCADE RESTRICT uprawnienie::= {ALL PRIVILAGES} { SELECT DELETE INSERT UPDATE [ ( nazwa kolumny.,..)]} REFERENCES [ (nazwa kolumny.,..)]} USAGE } Bazy Danych - A. Dawid 2011 10
Przykłady Odwołujemy wszystkie uprawnienia REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'adam'@'localhost'; mysql> REVOKE SELECT ON magazyn.* FROM 'adam'@'localhost'; ERROR 1141 (42000): There is no such grant defined for user 'adam' on host 'localhost mysql> REVOKE CREATE ON *.* FROM 'adam'@'localhost'; Query OK, 0 rows affected (0.00 sec) Można tylko odwołać te przywileje które wcześniej były utworzone przez instrukcje GRANT. Bazy Danych - A. Dawid 2011 11
PROGRAMOWANIE PROCEDURY i FUNKCJE SQL pozwala na pisanie krótkich programów wykonywanych przez System Zarządzania Bazami Danych Składnia CREATE [DEFINER = { użytkownik CURRENT_USER }] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic...] routine_body CREATE [DEFINER = {użytkownik CURRENT_USER }] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic...] routine_body Bazy Danych - A. Dawid 2011 12
Przykład Funkcji CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!'); >source func.sql; >mysql> SELECT hello('witam'); +----------------+ hello('witam') +----------------+ Hello, Witam! +----------------+ 1 row in set (0.00 sec) Bazy Danych - A. Dawid 2011 13
Przykłady Procedur USE magazyn delimiter // CREATE PROCEDURE myproc (OUT par INT) BEGIN SELECT COUNT(*) INTO par FROM osoba; END// CREATE PROCEDURE ZnajdzNazwisko( IN zimie CHAR(32), OUT znazwisko CHAR(32) ) BEGIN SELECT Nazwisko FROM osoba WHERE Imie = zimie INTO znazwisko; END// delimiter ; Bazy Danych - A. Dawid 2011 14
Wywołanie procedur mysql> CALL myproc(@i); Query OK, 1 row affected (0.00 sec) mysql> SELECT @i AS Rozmiar; +---------+ Rozmiar +---------+ 2 +---------+ mysql> CALL ZnajdzNazwisko('Jan',@out); Query OK, 1 row affected (0.00 sec) mysql> SELECT @out AS Nazwiska; +----------+ Nazwiska +----------+ Nowak +----------+ Bazy Danych - A. Dawid 2011 15
Wywołanie procedur mysql> SELECT hello('witam'); +----------------+ hello('witam') +----------------+ Hello, Witam! +----------------+ 1 row in set (0.00 sec) mysql> CALL myproc(@i); Query OK, 1 row affected (0.00 sec) mysql> SELECT @i AS Rozmiar; +---------+ Rozmiar +---------+ 2 +---------+ 1 row in set (0.00 sec) Bazy Danych - A. Dawid 2011 16
KURSORY Kursor obiekt używany w aplikacjach do przechowywania wyniku zapytania i do modyfikacji tablic wykorzystywanych w zapytaniu. Pozwala na dostęp do obszaru pamięci w którym przechowywane są wyniki zapytania. Pozwala to na modyfikacje standardowego sposobu wyświetlania informacji w postaci tabel na pojedyncze wiersze. Instrukcje DECLARE, OPEN, FETCH, CLOSE Kursory najczęście wykorzystwane są wewnątrz procedur i funkcji Bazy Danych - A. Dawid 2011 17
DECLARE CURSOR Tworzy kursor Składnia DECLARE nazwa kursora [INSENSITIVE] [SCROLL] CURSOR FOR { instrukcja SELECT [klauzula modyfikowalności]} { przygotwana instrukcja}; klauzula modyfikowalności::= FOR{ READ ONLY UPDATE [OF nazwa kolumny.,..]}] Przykład DECLARE klient CURSOR FOR SELECT Nr,Imie FROM magazyn.osoba; Bazy Danych - A. Dawid 2011 18
OPEN CURSOR Przygotowanie kursora do użycia Składnia OPEN nazwa kursora Przykład OPEN klient; CLOSE CURSOR Zamyka aktualnie otwarty kursor Składnia CLOSE nazwa kursora Przykład CLOSE klient; Bazy Danych - A. Dawid 2011 19
FETCH CURSOR Pobiera wiersze z otwartego kursora Składnia FETCH [ [orientacja] FROM ] nazwa kursora INTO specyfikacja docelowa.,.. ; orientacja ::= NEXT PRIOR FIRST LAST { ABSOLUTE RELATIVE specyfikacja wartości } Instrukcja ta pobiera wartości z jednego wiersza kursora i umieszcza je w liście specyfikacja docelowa. Orientacja określa sposób przesuwania wskaźnika pozycji kursora Bazy Danych - A. Dawid 2011 20
Przykład: Procedura wyliczania towaru delimiter // CREATE PROCEDURE WartoscTow () BEGIN DECLARE done INT DEFAULT 0; DECLARE a,b FLOAT; DECLARE c CHAR(64); DECLARE cur1 CURSOR FOR SELECT Nazwa,ilosc FROM towary; DECLARE cur2 CURSOR FOR SELECT cena1 FROM dokumenty; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur1; OPEN cur2; DROP TEMPORARY TABLE IF EXISTS WartoscTowaru; CREATE TEMPORARY TABLE WartoscTowaru (NazwaTowaru char(64), Status CHAR(8), WartoscTowaru FLOAT); Bazy Danych - A. Dawid 2011 21
Przykład: Procedura wyliczania towaru read_loop: LOOP FETCH cur1 INTO c,a; FETCH cur2 INTO b; IF done THEN LEAVE read_loop; END IF; IF a > 0 THEN INSERT INTO WartoscTowaru VALUES (c,'jest',a*b); ELSE INSERT INTO WartoscTowaru VALUES (a,'brak',0); END IF; END LOOP; CLOSE cur1; CLOSE cur2; END// delimiter ; Bazy Danych - A. Dawid 2011 22
Przykład: Wywołanie procedury mysql> SELECT cena1 FROM dokumenty; +-------+ cena1 +-------+ 5.1 5.6 +-------+ 2 rows in set (0.02 sec) mysql> SELECT * FROM towary; +-------+-----------+---------+-------+ NrTow Nazwa J_miary ilosc +-------+-----------+---------+-------+ 1 Banany kg 18.5 2 Winogrona kg 15.5 +-------+-----------+---------+-------+ 2 rows in set (0.00 sec) Bazy Danych - A. Dawid 2011 23
Przykład: Wywołanie procedury mysql> CALL WartoscTow (); Query OK, 0 rows affected, 1 warning (0.63 sec) mysql> SELECT * FROM WartoscTowaru; +-------------+--------+---------------+ NazwaTowaru Status WartoscTowaru +-------------+--------+---------------+ Banany Jest 94.35 Winogrona Jest 86.8 +-------------+--------+---------------+ 2 rows in set (0.00 sec) Bazy Danych - A. Dawid 2011 24
WYZWALACZE (triggers) Wyzwalacze zestaw instrukcji wykonywany po zmianie zawartości tabeli. Instrukcje CREATE, DROP Składnia CREATE TRIGGER nazwa wyzwalacza {BEFORE AFTER } {INSERT UPDATE DELETE } ON nazwa tabeli FOR EACH ROW Bazy Danych - A. Dawid 2011 25
Przykład: Procedura wyliczania towaru DROP TRIGGER IF EXISTS testwar; delimiter CREATE TRIGGER testwar BEFORE INSERT ON towary FOR EACH ROW BEGIN INSERT INTO towary SET cena2 = NEW.ilosc; END; delimiter ; Bazy Danych - A. Dawid 2011 26
ROLLBACK Kończy transakcje bez zachowania zmian Składnia ROLLBACK [WORK] Gdy użyjemy tej instrukcji, transakcja zakończy się niepowodzeniem i wszystkie zmiany podczas niej dokonane nie zostaną zachowane Bazy Danych - A. Dawid 2011 27