1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS.

Slides:



Advertisements
Podobne prezentacje
Procedury wyzwalane Procedura wyzwalana (ang. trigger) - stanowi kod użytkownika przechowywany wewnątrz bazy i uruchamiany w określonych sytuacjach np.
Advertisements

Wykład 3 Prowadzący: dr Paweł Drozda
Skrypty, procedury przechowywane i wyzwalane
Język SQL Część II.
Bazy danych 10. Z łą czenia i transakcje P. F. Góra semestr letni 2004/05.
Bazy danych 9. SQL — Różności P. F. Góra semestr letni 2004/05
Bazy danych 8. SQL podstawy P. F. Góra semestr letni 2004/05.
Bazy danych II Instrukcja INSERT Piotr Górczyński 25/08/2001.
(c) 1999, Instytut Informatyki Politechniki Poznańskiej Rozdział 7: Relacje i ograniczenia integralnościowe Język definiowania danych - DDL (Data Definition.
Metody autoryzacji użytkowników wymaga integracji z systemem operacyjnym nie wymaga logowania mała pewność mechanizmu wymaga logowania duża pewność mechanizmu.
Bezpieczeństwo Procedury składowane Funkcje i Wyzwalacze
ZSBD PL/SQL CZĘŚĆ 3 Wykład 5 Prowadzący: dr Paweł Drozda.
Język definicji danych (Data Definition Language)
Język definicji danych (Data Definition Language)
WYZWALACZE (TRIGGERY) Wyzwalacz jest specjalnym rodzajem procedury składowanej, która może być wykonana w odpowiedzi na jedną z trzech sytuacji: UPDATE.
SQL select kredytobiorca,bank, rodzaj, data_zawarcia, klasyfikacja,kwota, terminzapadalnosci-data_zawarcia iledni from tab_kredyt where (terminzapadalnosci-data_zawarcia)>1095.
Wymagania do projektu i realizacji baz danych:
POWTÓRZENIE Główne elementy składni SQL: Zasady ogólne
Procedury i funkcje Tworzenie: CREATE
Wykład 8 Wojciech Pieprzyca
Wykład 1 Wojciech Pieprzyca
SQL - język relacyjnych i obiektowo-relacyjnych baz danych
Język SQL (Structured Query Language) DDL (Data Definition Language)
Przykład włamania do aplikacji internetowej poprzez modyfikację zapytań SQL Skrypty ASP Serwer bazy danych MS SQL Server Piotr Kuźniacki BDi.
Bazy Danych II prowadzący: mgr inż. Leszek Siwik
SQL – Structured Query Language (3)
MySQL – ODBC - ACCESS.
Instrukcje: CREATE, INSERT, UPDATE, DELETE, DROP
SQL – Structured Query Language (1)
Użytkownicy i przywileje Sesja - przykład Błędy Komunikacja międzyskryptowa Wykład 83PD Technologie internetowe.
SQL - Structured Query Language
Jak zacząć w MS SQL? USE master; GO IF DB_ID (Nbaza') IS NOT NULL DROP DATABASE baza; GO CREATE DATABASE baza; GO USE baza; GO.
Bazy Danych Wykład 7 Wojciech St. Mościbrodzki
PL/SQL – dalsza wędrówka
SQL – część II.
1 SBD, L.Banachowski Podstawy SQL - języka relacyjnych i obiektowo-relacyjnych baz danych (SQL2, SQL'1999, Oracle) Powtórzenie wyk ł adu 3.
1 SBD, L.Banachowski Zaawansowane cechy SQL Powtórzenie wyk ł adu 5.
Autor: Damian Urbańczyk
Bazy Danych W06 Wojciech St. Mościbrodzki
Slajd 1© J.Rumiński Jacek Rumiński  Bazy danych Kontakt: Katedra Inżynierii Biomedycznej, pk. 106, tel.: , fax: ,
1 SBD, L.Banachowski Oprogramowanie strony serwera cz. 1 Powtórzenie wyk ł adu 6.
Komendy SQL do pracy z danymi
Projektowanie Aplikacji Internetowych
Wykład 3 Prowadzący: dr Paweł Drozda. Użytkownik bazy danych – osoba lub aplikacja, mająca dostęp do części danych zgromadzonych w bazie Uprawnienia –
Temat 2: Podstawy programowania Algorytmy – 1 z 2 _________________________________________________________________________________________________________________.
Prototypowanie w ORACLE DESIGNER Projektowanie Bazy Danych.
Oracle Data Modeler (4.1). Aplikacja Wymagania biznesowe Tworzenie systemu informacyjnego Procesy Informacje Analiza Projektowanie Browser: Hollywood.
OBOWIĄZKI INFORMACYJNE BENEFICJENTA Zintegrowane Inwestycje Terytorialne Aglomeracji Wałbrzyskiej.
Tworzenie odwołania zewnętrznego (łącza) do zakresu komórek w innym skoroszycie Możliwości efektywnego stosowania odwołań zewnętrznych Odwołania zewnętrzne.
MULTIMEDIALNE BAZY DANYCH Wprowadzenie. Baza danych Baza danych (database) – magazyn danych – informacji powiązanych tematycznie, umożliwiający ich wyszukiwanie.
PRACA Z APLIKACJAMI SYSTEM PRZEMIESZCZANIA oraz NADZORU WYROBÓW AKCYZOWYCH EMCS PL 1.
1 Definicja danych: Do utworzenia tabeli służy instrukcja CREATE TABLE, wymagająca podania nazwy tworzonej tabeli, nazwy każdej kolumny w tej tabeli, typu.
Coaching w poradnictwie zawodowym i edukacji. PLAN Definicja, proces - zmiana Możliwość wykorzystania coachingu w poradnictwie zawodowym i edukacji Model.
Algorytmy Informatyka Zakres rozszerzony
© 2014 IBM Corporation COMMON POLSKA 2014 JDBC z IBM System i Tomasz Piela & Marcin Wilk Global Technlonogy Services, IBM.
1 Instrukcja SELECT : SELECT[DISTINCT  ALL] {*  [wyrażenie_kolumnowe [AS nowa_nazwa]],[…]} FROMNazwaTabeli [alias],[...] [WHEREwarunek_selekcji_wierszy]
Wybieranie wierszy: 1 Warunek WHERE Rodzaje warunków: - liczbowe - liczbowe z zakresu - znakowe.
Python. Języki Programistyczne Microcode Machine code Assembly Language (symboliczna reprezentacja machine code) Low-level Programming Language (FORTRAN,
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Warszawska Wyższa Szkoła Informatyki Andrzej Kuska Promotor : dr inż. Paweł Figat Konsultant : mgr inż. Andrzej Ptasznik.
Projektowanie systemów cyfrowych z wykorzystaniem języka VHDL Układy sekwencyjne.
„Relacyjne Bazy Danych (Oracle)”
Czy DENY jest zawsze ważniejszy niż GRANT?
Schematy blokowe.
Widoki (views) - Perspektywy:
DDL język definiowania danych
Relacyjne Bazy Danych Wykład 02 Wojciech St. Mościbrodzki
Technologie Informacyjne Bazy danych
J2EE: Bazy danych c.d. Język zapytań EJB QL.
Własności relacji: Baza danych jest zbiorem relacji, o następujących własnościach: każda relacja w bazie danych jest jednoznacznie określona przez swoją.
Zapis prezentacji:

1 Procedury i funkcje CREATE PROCEDURE nazwa ([proc_parameter[,...]]) [characteristic...] routine_body CREATE FUNCTION nazwa ([func_parameter[,...]]) RETURNS type [characteristic...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type Tworzenie: Wywołanie: CALL nazwa [proc_parameter[,...]]);

2 CREATE PROCEDURE przecena (IN nazwa varchar (64)) UPDATE nieruchomosc SET czynsz = czynsz*1.2 WHERE miasto = nazwa; mysql> SELECT nieruchomoscNr, miasto, czynsz, biuroNr FROM nieruchomosc; | nieruchomoscNr | miasto | czynsz | biuroNr | | A14 | Augustów | 858 | B007 | | B16 | Białystok | 495 | B003 | | B17 | Białystok | 412 | B003 | | B18 | Białystok | 385 | B003 | | B21 | Białystok | 660 | B003 | | G01 | Grajewo | 830 | B004 | | L94 | Łomża | 440 | B005 | Prosty przykład:

3 CALL przecena('Augustów'); Wywołanie procedury: mysql> CALL przecena('Augustów'); mysql> SELECT nieruchomoscNr, miasto, czynsz, biuroNr FROM nieruchomosc; | nieruchomoscNr | miasto | czynsz | biuroNr | | A14 | Augustów | 1030 | B007 | | B16 | Białystok | 495 | B003 | | B17 | Białystok | 412 | B003 | | B18 | Białystok | 385 | B003 | | B21 | Białystok | 660 | B003 | | G01 | Grajewo | 830 | B004 | | L94 | Łomża | 440 | B005 |

4 Schemat bazy Biuro Nieruchomości :

55 Ćwiczenie 1 Zrealizować procedurę, która będzie zwiększać płacę pracowników o wartość podaną przy wywołaniu jako dana wejściowa dla stanowiska też podanego przy wywołaniu: CREATE PROCEDURE podwyzka (IN ile int(4), IN jaki varchar (15)) UPDATE personel SET pensja = pensja + ile WHERE stanowisko = jaki; CALL podwyzka(50, 'asystent');

66 Ćwiczenie 2 Zrealizować procedurę, która będzie zmniejszać czynsz klientów o wartość podaną przy wywołaniu jako dana wejściowa dla nr klienta też podanego przy wywołaniu: CREATE PROCEDURE czynsz (IN wartosc int(4), IN komu varchar (15)) UPDATE wynajecie SET czynsz = czynsz - wartosc WHERE klientnr = komu; CALL czynsz(50, 'CO17');

7 Przykład procedury losującej uczniów do klas: DELIMITER | CREATE PROCEDURE UtworzUczniow(IN r INT, IN kl CHAR, IN chlopcy INT, IN dziewczynki INT) BEGIN DECLARE dz INT; DECLARE ch INT; DECLARE rdata DATE; CASE r WHEN 1 THEN SET rdata=' '; WHEN 2 THEN SET rdata=' '; WHEN 3 THEN SET rdata=' '; ELSE SELECT 'ERROR - ZLY ROK'; END CASE;

8 SET dz=0; WHILE (dz < dziewczynki) DO INSERT INTO Uczniowie VALUES (0, (SELECT nazwisko FROM __Nazwiska ORDER BY rand() LIMIT 1), (SELECT imie FROM __Imiona WHERE plec='K' ORDER BY rand() LIMIT 1), (SELECT rdata - INTERVAL rand()*365+1 DAY),'K', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET dz=dz+1; END WHILE;

9 SET ch=0; WHILE (ch < chlopcy) DO INSERT INTO Uczniowie VALUES (0, (SELECT nazwisko FROM __Nazwiska ORDER BY rand() LIMIT 1), (SELECT imie FROM __Imiona WHERE plec='M' ORDER BY rand() LIMIT 1), (SELECT rdata - INTERVAL rand()*365+1 DAY),'M', (SELECT id_klasy FROM Klasy WHERE rok=r AND klasa=kl)); SET ch=ch+1; END WHILE; END| DELIMITER ;

10 Nazwiska: CREATE TABLE __Nazwiska ( id_nazwiska INT UNSIGNED NOT NULL auto_increment, nazwisko char(30) NOT NULL, UNIQUE id(id_nazwiska), PRIMARY KEY (id_nazwiska) ); INSERT INTO __Nazwiska VALUES (0,'Ancypo'),(0,'Arciuch'),(0,'Awdziej'),(0,'Chwiedzko'),(0,'Cychowska'), (0,'Czaplejewicz'),(0,'Filonowicz'),(0,'Filon'),(0,'Kuzbiel'),(0,'Gryszkiewicz'), (0,'Jackiewicz'),(0,'Jurgiel'),(0,'Kazimierowicz'),(0,'Kostera'),(0,'Kostro'), (0,'Nowak'),(0,'Krawiel'),(0,'Krupowicz'),(0,'Mizer'),(0,'Mrozowicz'), (0,'Mucus'),(0,'Niedzwiedz'),(0,'Ostasiewicz'),(0,'Surowiec'),(0,'Anisko'), (0,'Antoniuk'),(0,'Borowik'),(0,'Chodziutko'),(0,'Gieniusz'),(0,'Grygucis'), (0,'Gryszko'),(0,'Jurgiel'),(0,'Karpowicz'),(0,'Kargul'),(0,'Pawlak'), (0,'Marcinkiewicz'),(0,'Miller'),(0,'Sidor'),(0,'Siemianczuk'),(0,'Misiukiewicz'), (0,'Szymczyk'),(0,'Taudul'),(0,'Zapolnik'),(0,'Klej'),(0,'Kucharewicz'), (0,'Chlus'),(0,'Cilulko'),(0,'Puszko'),(0,'Loszczyk'),(0,'Makarewicz'), (0,'Solniczek'),(0,'Szczesnowicz'),(0,'Szyszko'),(0,'Werda'),(0,'Sietejko'), (0,'Sawon'),(0,'Smola'),(0,'Sloma'),(0,'Sacharczuk'),(0,'Miszkin'), (0,'Baszko'),(0,'Bilkiewicz'),(0,'Czaplejewicz'),(0,'Osial'),(0,'Borys'), (0,'Salak'),(0,'Zajczyk'),(0,'Lazarewicz'),(0,'Rudnik'),(0,'Recko'), (0,'Szczesiul'),(0,'Luba'),(0,'Mroczko'),(0,'Abramowicz'),(0,'Beczko'), (0,'Bleczko'),(0,'Butkiewicz'),(0,'Daszkilewicz'),(0,'Galuzyn'),(0,'Gryc'), (0,'Gudel'),(0,'Toczko'),(0,'Malkiewicz'),(0,'Potapa'),(0,'Pupek'), (0,'Prycz'),(0,'Koleda'),(0,'Gniedziejko'),(0,'Juchniewicz'),(0,'Lengiewicz'), (0,'Turko'),(0,'Kulak'),(0,'Dudziuk'),(0,'Trochanowicz'),(0,'Stefanczuk'), (0,'Lopata'),(0,'Loskot'),(0,'Matuk'),(0,'Kijek'),(0,'Woronko'), (0,'Romanowicz'),(0,'Pylko'),(0,'Misarko'),(0,'Waluszko'),(0,'Toloczko'), (0,'Pigiel'),(0,'Stupak'),(0,'Zdanuk'),(0,'Mackiewicz'),(0,'Hecman') ;

11 Imiona: CREATE TABLE __Imiona ( id_imienia INT UNSIGNED NOT NULL auto_increment, imie char(20) NOT NULL, plec ENUM('K','M'), UNIQUE id(id_imienia), PRIMARY KEY (id_imienia) ); INSERT INTO __Imiona VALUES (0,'Lukasz','M'),(0,'Piotr','M'),(0,'Raroslaw','M'),(0,'Jacek','M'),(0,'Andrzej','M'), (0,'Maciej','M'),(0,'Zbigniew','M'),(0,'Leszek','M'),(0,'Kamil','M'),(0,'Pawel','M'), (0,'Wojciech','M'),(0,'Bartosz','M'),(0,'Jakub','M'),(0,'Marcin','M'),(0,'Rafal','M'), (0,'Adam','M'),(0,'Daniel','M'),(0,'Robert','M'),(0,'Boromir','M'),(0,'Slawomir','M'), (0,'Mateusz','M'),(0,'Marek','M'),(0,'Przemyslaw','M'),(0,'Mariusz','M'),(0,'Grzegorz','M'), (0,'Marzena','K'),(0,'Sylwia','K'),(0,'Edyta','K'),(0,'Urszula','K'),(0,'Malgorzata','K'), (0,'Justyna','K'),(0,'Magdalena','K'),(0,'Agnieszka','K'),(0,'Joanna','K'),(0,'Anna','K'), (0,'Monika','K'),(0,'Ewa','K'),(0,'Paulina','K'),(0,'Marta','K'),(0,'Jolanta','K'), (0,'Katarzyna','K'),(0,'Natalia','K'),(0,'Agata','K'),(0,'Elzbieta','K'),(0,'Celina','K'), (0,'Beata','K'),(0,'Karolina','K'),(0,'Dorota','K'),(0,'Izabela','K'),(0,'Wioletta','K') ;

12 Wywołania: call UtworzUczniow(3,'a',10,19); call UtworzUczniow(3,'b',6,24); call UtworzUczniow(3,'c',19,11); call UtworzUczniow(3,'d',14,13); call UtworzUczniow(3,'e',6,25); call UtworzUczniow(3,'f',7,20): call UtworzUczniow(2,'a',9,22); call UtworzUczniow(2,'b',18,8); call UtworzUczniow(2,'c',22,8); call UtworzUczniow(2,'d',13,17); call UtworzUczniow(2,'e',7,23); call UtworzUczniow(2,'f',3,26); call UtworzUczniow(1,'a',6,25); call UtworzUczniow(1,'b',20,10); call UtworzUczniow(1,'c',20,8); call UtworzUczniow(1,'d',16,15); call UtworzUczniow(1,'e',7,24); call UtworzUczniow(1,'f',7,25);

13 Przykład funkcji: mysql> CREATE FUNCTION Witajcie (s CHAR(20)) RETURNS CHAR(50) RETURN CONCAT('Witajcie, ',s,'!'); mysql> SELECT Witajcie('kochani'); | Witajcie('kochani') | | Witajcie, kochani! |

14 IF: IF warunek THEN instrukcje [ELSEIF warunek THEN instrukcje]... [ELSE instrukcje] END IF

15 Wyzwalacze: CREATE TRIGGER nazwa trigger_time trigger_event ON tabela FOR EACH ROW trigger_stmt Wyzwalacz nazwa związany z tabelą tabela. trigger_time - określenie czasowe wykonania, może być: BEFORE lub AFTER instrukcji, która go aktywuje trigger_stmt – instrukcje wykonywane po aktywacji wyzwalacza trigger_event – instrukcje, które aktywują wyzwalacz

16 trigger_event – instrukcje, które aktywują wyzwalacz: INSERT : wyzwalacz jest aktywowany gdy tylko nowy wiersz jest wstawiany do tabeli; np. przez INSERT, LOAD DATA, czy REPLACE. UPDATE : wyzwalacz jest aktywowany gdy tylko wiersz jest uaktualniany; np. przez UPDATE. DELETE : wyzwalacz jest aktywowany gdy tylko wiersz jest usuwany z tabeli; np. przez DELETE czy REPLACE Jednakże DROP TABLE nie aktywuje wyzwalacza

17 Przykład: mysql> CREATE TABLE test1(a1 INT); mysql> CREATE TABLE test2(a2 INT); mysql> CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); mysql> CREATE TABLE test4( -> a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> b4 INT DEFAULT 0 -> );

18 mysql> DELIMITER | mysql> CREATE TRIGGER tester BEFORE INSERT ON test1 -> FOR EACH ROW BEGIN -> INSERT INTO test2 SET a2 = NEW.a1; -> DELETE FROM test3 WHERE a3 = NEW.a1; -> UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; -> END; -> | mysql> DELIMITER ;

19 mysql> INSERT INTO test3 (a3) VALUES -> (NULL), (NULL), (NULL), (NULL), (NULL), -> (NULL), (NULL), (NULL), (NULL), (NULL); mysql> INSERT INTO test4 (a4) VALUES -> (0), (0), (0), (0), (0), (0), (0), (0), (0),(0);

20 mysql> SELECT * FROM test | a3 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | mysql> SELECT * FROM test | a4 | b4 | | 1 | 0 | | 2 | 0 | | 3 | 0 | | 4 | 0 | | 5 | 0 | | 6 | 0 | | 7 | 0 | | 8 | 0 | | 9 | 0 | | 10 | 0 |

21 mysql> INSERT INTO test1 VALUES -> (1), (3), (1), (7), (1), (8), (4), (4); Aktywacja wyzwalacza:

22 mysql> SELECT * FROM test | a1 | | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | mysql> SELECT * FROM test | a2 | | 1 | | 3 | | 1 | | 7 | | 1 | | 8 | | 4 | Wyniki:

23 mysql> SELECT * FROM test | a3 | | 2 | | 5 | | 6 | | 9 | | 10 | mysql> SELECT * FROM test | a4 | b4 | | 1 | 3 | | 2 | 0 | | 3 | 1 | | 4 | 2 | | 5 | 0 | | 6 | 0 | | 7 | 1 | | 8 | 1 | | 9 | 0 | | 10 | 0 |

24 Ćwiczenie 1 Zrealizować wyzwalacz, który będzie wpisywał w pole wizytowal wartość 1 przy wpisaniu nowej wizyty dla danego klienta: CREATE TRIGGER odznaczenie AFTER INSERT ON wizyta FOR EACH ROW UPDATE klient SET wizytowal = 1 WHERE klientnr IN (select klientnr FROM wizyta WHERE data_wizyty = NEW.data_wizyty);

25 Ćwiczenie 2 Zrealizować wyzwalacz, który będzie wpisywał w pole status wartość 1 przy przekroczeniu 2 wynajęć dla danego klienta: CREATE TRIGGER statusy AFTER INSERT ON wynajecie FOR EACH ROW UPDATE klient SET status = 1 WHERE klientnr IN (select klientnr FROM wynajecie GROUP BY klientnr HAVING COUNT(*)>2);

26 Transakcje: Transakcje w systemach zarządzania bazą danych stanowi sekwencje powiązanych ze sobą instrukcji, które muszą być traktowane jak pojedyncza jednostka. Rozumiemy to tak, że albo wszystkie zadania wchodzące w skład transakcji zostaną wykonane, albo żadne z nich. Transakcja jest niepodzielna, ponieważ przy równoczesnym dostępie do zasobów przez wielu użytkowników lub trwających procesach, w czasie awarii może dojść do niespójności bazy danych. Ważną cechą transakcji jest to, że są one nie widoczne dla innych sesji jeżeli nie zostaną wykonane. Nikt nie może odczytać danych z tabel, jeżeli jesteśmy w czasie ich aktualizacji

27 MySQL oferuje transakcje zgodne z tzw. właściwościami ACID: Atomicity ( niepodzielność) – nie ma możliwości podziału transakcji, albo wszystkie zmiany zostaną zachowane w bazie danych albo żadna z nich Consistency (spójność) – oznacza, że operacje przekształcają bazę danych z jednego stanu prawidłowego w inny. Nie powinny być możliwe etapy, kiedy dane są niespójne. Isolation (izolacja) – oznacza, że transakcje nie kolidują ze sobą, gdy są wykonywane. Każda transakcja powinna być wykonywana tak, jakby w danej chwili tylko ona mogła wykonywać operacje odczytu i aktualizacji. Durability (trwałość) – oznacza, że po wykonaniu transakcji w bazie danych, efekty transakcji są stałe.

28 START TRANSACTION [WITH CONSISTENT SNAPSHOT] | BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = {0 | 1} Transakcje rozpoczynamy wydając polecenie START TRANSACTION lub jego synonimy BEGIN WORK oraz BEGIN. Zalecane jest używanie tej pierwszej postaci, gdyż jest ona zgodna z norma SQL-99.

29 MySQL może pracować w dwóch trybach: - autocommit - powoduje, że każde wydawane polecenie jest traktowana jako transakcja, co oznacza, że wynik działania tego polecenia jest automatycznie zatwierdzany w bazie danych i nie ma możliwości jego wycofania. wyłączenie trybu autocommit : SET AUTOCOMMIT = 0; Wówczas można wydawać polecenia: START TRANSACTION - rozpoczyna nową transakcje, COMMIT - zatwierdza wszystkie zmiany wprowadzone w ramach bieżącej transakcji ROLLBACK - wycofuje wszystkie zmiany wprowadzone w ramach bieżącej transakcji.

30 Przykład: mysql> CREATE TABLE test (id INT PRIMARY KEY) ENGINE = InnoDB; mysql> INSERT INTO test VALUES (1), (2); mysql> select * from test; | id | | 1 | | 2 | mysql> SET AUTOCOMMIT = 0; mysql> START TRANSACTION; mysql> UPDATE test SET id=10 WHERE id=1; mysql> UPDATE test SET id=20 WHERE id=2; mysql> SELECT * FROM test; | id | | 10 | | 20 | mysql> COMMIT;

31 Po wykonaniu instrukcji SET AUTOCOMMIT = 0, MySQL zakłada, ze od tej pory wszystkie transakcje będą przez użytkownika jawnie kończone poleceniem COMMIT. Należy o tym zawsze pamiętać, bo gdy o tym zapomnimy i zakończymy sesje (np. zamykając aplikacje kliencką), MySQL automatycznie wycofa wszystkie zmiany wprowadzone w czasie całej sesji! Ponowny powrót do trybu autocommit : SET AUTOCOMMIT = 1; Sprawdzamy jaki tryb zatwierdzania transakcji obowiązuje: mysql> SELECT | | | 1 |

32 Przykład z wycofaniem: | SESJA A | mysql> SET AUTOCOMMIT = 0; mysql> START TRANSACTION; | SESJA B | mysql> SELECT * FROM test; | id | | 1 | mysql> UPDATE test SET id = 2; mysql> SELECT * FROM test; | id | | 1 | mysql> DELETE FROM test;

33 mysql> SELECT * FROM test; | id | | 1 | mysql> UPDATE test SET id = 2; sesja zablokowana mysql> ROLLBACK; sesja ’puszcza’ mysql> UPDATE test SET id = 2; Query OK, 1 row affected (2.13 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM test; | id | | 2 |

34 Przykład z zakleszczeniem: mysql> DROP TABLE test; mysql> CREATE TABLE test (id INT PRIMARY KEY) ENGINE = InnoDB; mysql> INSERT INTO test VALUES (1), (2); mysql> COMMIT; mysql> select * from test; | id | | 1 | | 2 | | SESJA A | | SESJA B | mysql> SET AUTOCOMMIT = 0; mysql> START TRANSACTION; mysql> UPDATE test SET id=10 WHERE id=1; mysql> UPDATE test SET id=20 WHERE id=2;

35 mysql> UPDATE test SET id=20 WHERE id=2; sesja zablokowana mysql> UPDATE test SET id=10 WHERE id=1; sesja ’puszcza’ Query OK, 1 row affected (21.44 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> UPDATE test SET id=10 WHERE id=1; ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction mysql>

36 mysql> SELECT * FROM test; | id | | 10 | | 20 | mysql> SELECT * FROM test; | id | | 1 | | 2 | mysql> COMMIT; Query OK, 0 rows affected (0.00 sec)

37 mysql> SELECT * FROM test; | id | | 1 | | 2 | mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM test; | id | | 10 | | 20 |

38 Zakleszczanie bez klucza głównego: mysql> DROP TABLE test; mysql> CREATE TABLE test (id INT) ENGINE = InnoDB; mysql> INSERT INTO test VALUES (1), (2); mysql> COMMIT; mysql> select * from test; | id | | 1 | | 2 | | SESJA A | | SESJA B | mysql> SET AUTOCOMMIT = 0; mysql> START TRANSACTION; mysql> UPDATE test SET id=10 WHERE id=1;

39 mysql> UPDATE test SET id=20 WHERE id=2; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction przekroczony czas oczekiwania – mysql> UPDATE test SET id=20 WHERE id=2; Query OK, 1 row affected (21.44 sec)Rows matched: 1 Changed: 1 Warnings: 0 mysql> UPDATE test SET id=10 WHERE id=1; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction przekroczony czas oczekiwania mysql> SELECT * FROM test; | id | | 10 | | 20 |

40 mysql> SELECT * FROM test; | id | | 1 | | 2 | mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM test; | id | | 1 | | 2 | mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM test; | id | | 10 | | 20 |

41 Informacje o statusie tabeli i jej powiązaniach: mysql> show table status like 'personel'\G *************************** 1. row *************************** Name: personel Engine: InnoDB Version: 10 Row_format: Compact Rows: 17 Avg_row_length: 963 Data_length: Max_data_length: 0 Index_length: Data_free: 0 Auto_increment: NULL Create_time: :36:44 Update_time: NULL Check_time: NULL Collation: utf8_polish_ci Checksum: NULL Create_options: Comment: InnoDB free: 3072 kB; (`biuronr`) REFER `biuro/biuro`(`biuronr`) ON UPDATE CASCAD

42 INFORMATION_SCHEMA: Zapewnia dostęp do metadanych bazy danych. Metadane to dane o danych (definicja struktury danych), takie jak nazwa bazy danych lub tabeli, typ danych kolumny lub przywileje dostępu. Nazywany czasami słownikiem danych lub katalogiem systemowym. INFORMATION_SCHEMA to ''baza informacyjna'', gdzie magazynuje się informacje o wszystkich bazach danych, które serwer MySQL utrzymuje. Zawiera kilka tabel (tymczasowych), które są tylko do odczytu. Każdy użytkownik MySQL ma prawo dostępu do tych tabel, ale tylko do wierszy związanych z obiektami, do których użytkownik posiada właściwe przywileje dostępu. Struktura tabel INFORMATION_SCHEMA stosuje się do standardu ANSI/ISO SQL:2003 część 11 ''Schematy''. Jest dostępny od wersji MySQL

43 mysql> show tables; | Tables_in_information_schema | | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLUMNS | | COLUMN_PRIVILEGES | | ENGINES | | EVENTS | | FILES | | GLOBAL_STATUS | | GLOBAL_VARIABLES | | KEY_COLUMN_USAGE | | PARTITIONS | | PLUGINS | | PROCESSLIST | | REFERENTIAL_CONSTRAINTS | | ROUTINES | | SCHEMATA | | SCHEMA_PRIVILEGES | | SESSION_STATUS | | SESSION_VARIABLES | | STATISTICS | | TABLES | | TABLE_CONSTRAINTS | | TABLE_PRIVILEGES | | TRIGGERS | | USER_PRIVILEGES | | VIEWS | rows in set (0.05 sec) Pełna lista tabel Information_schema:

44 Wybrane informacje o tabelach: mysql> SELECT table_schema, table_name, table_type FROM information_schema.tables; | table_schema | table_name | table_type | | information_schema | CHARACTER_SETS | SYSTEM VIEW | | information_schema | COLLATIONS | SYSTEM VIEW | | information_schema | COLLATION_CHARACTER_SET_APPLICABILITY | SYSTEM VIEW | | information_schema | COLUMNS | SYSTEM VIEW | | information_schema | COLUMN_PRIVILEGES | SYSTEM VIEW | | information_schema | ENGINES | SYSTEM VIEW | | information_schema | EVENTS | SYSTEM VIEW | | information_schema | FILES | SYSTEM VIEW | | information_schema | GLOBAL_STATUS | SYSTEM VIEW | | information_schema | GLOBAL_VARIABLES | SYSTEM VIEW | | information_schema | KEY_COLUMN_USAGE | SYSTEM VIEW | | information_schema | PARTITIONS | SYSTEM VIEW | | information_schema | PLUGINS | SYSTEM VIEW | | information_schema | PROCESSLIST | SYSTEM VIEW | | information_schema | REFERENTIAL_CONSTRAINTS | SYSTEM VIEW | | information_schema | ROUTINES | SYSTEM VIEW | | information_schema | SCHEMATA | SYSTEM VIEW | | information_schema | SCHEMA_PRIVILEGES | SYSTEM VIEW | | information_schema | SESSION_STATUS | SYSTEM VIEW |...

45 | information_schema | SESSION_VARIABLES | SYSTEM VIEW | | information_schema | STATISTICS | SYSTEM VIEW | | information_schema | TABLES | SYSTEM VIEW | | information_schema | TABLE_CONSTRAINTS | SYSTEM VIEW | | information_schema | TABLE_PRIVILEGES | SYSTEM VIEW | | information_schema | TRIGGERS | SYSTEM VIEW | | information_schema | USER_PRIVILEGES | SYSTEM VIEW | | information_schema | VIEWS | SYSTEM VIEW | | biuro | _10_dyrektorzy | VIEW | | biuro | _10_full | VIEW | | biuro | _11_biuro_b003 | VIEW | | biuro | biuro | BASE TABLE | | biuro | biuro2 | BASE TABLE | | biuro | klient | BASE TABLE | | biuro | nieruchomosc | BASE TABLE | | biuro | nieruchomosc2 | BASE TABLE | | biuro | personel | BASE TABLE | | biuro | rejestracja | BASE TABLE | | biuro | test1 | BASE TABLE | | biuro | test2 | BASE TABLE | | biuro | test3 | BASE TABLE | | biuro | test4 | BASE TABLE | | biuro | wizyta | BASE TABLE | | biuro | wlasciciel | BASE TABLE | | biuro | wynajecie | BASE TABLE |...

46 | mysql | columns_priv | BASE TABLE | | mysql | db | BASE TABLE | | mysql | event | BASE TABLE | | mysql | func | BASE TABLE | | mysql | general_log | BASE TABLE | | mysql | help_category | BASE TABLE | | mysql | help_keyword | BASE TABLE | | mysql | help_relation | BASE TABLE | | mysql | help_topic | BASE TABLE | | mysql | host | BASE TABLE | | mysql | plugin | BASE TABLE | | mysql | proc | BASE TABLE | | mysql | procs_priv | BASE TABLE | | mysql | slow_log | BASE TABLE | | mysql | tables_priv | BASE TABLE | | mysql | time_zone | BASE TABLE | | mysql | time_zone_leap_second | BASE TABLE | | mysql | time_zone_name | BASE TABLE | | mysql | time_zone_transition | BASE TABLE | | mysql | time_zone_transition_type | BASE TABLE | | mysql | user | BASE TABLE | | mysql | user_info | BASE TABLE |

47 Informacje z komentarzami dla tabel bazy biuro : mysql> SELECT table_schema, table_name, table_comment FROM information_schema.tables WHERE TABLE_SCHEMA='biuro'; | TABLE_SCHEMA | TABLE_NAME | TABLE_COMMENT | | biuro | _10_dyrektorzy | VIEW | | biuro | _10_full | VIEW | | biuro | _11_biuro_b003 | VIEW | | biuro | biuro | | | biuro | biuro2 | | | biuro | klient | | | biuro | nieruchomosc | | | biuro | nieruchomosc2 | | | biuro | personel | | | biuro | rejestracja | | | biuro | test1 | | | biuro | test2 | | | biuro | test3 | | | biuro | test4 | | | biuro | v1 | VIEW | | biuro | v2 | VIEW | | biuro | v3 | VIEW | | biuro | wizyta | | | biuro | wlasciciel | | | biuro | wynajecie | | rows in set (0.03 sec)

48 Informacje z komentarzami dla tabel bazy mysql : mysql> select TABLE_SCHEMA, TABLE_NAME, TABLE_COMMENT from information_schema.tables WHERE TABLE_SCHEMA='mysql'; | TABLE_SCHEMA| TABLE_NAME | TABLE_COMMENT | | mysql | columns_priv | Column privileges | | mysql | db | Database privileges | | mysql | func | User defined functions | | mysql | help_category | help categories | | mysql | help_keyword | help keywords | | mysql | help_relation | keyword-topic relation | | mysql | help_topic | help topics | | mysql | host | Host privileges; Merged with database privileges | | mysql | proc | Stored Procedures | | mysql | procs_priv | Procedure privileges | | mysql | tables_priv | Table privileges | | mysql | time_zone | Time zones | | mysql | time_zone_leap_second | Leap seconds information for time zones | | mysql | time_zone_name | Time zone names | | mysql | time_zone_transition | Time zone transitions | | mysql | time_zone_transition_type | Time zone transition types | | mysql | user | Users and global privileges |

49 mysql> SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G *************************** 1. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel TABLE_TYPE: BASE TABLE ENGINE: InnoDB VERSION: 10 ROW_FORMAT: Compact TABLE_ROWS: 17 AVG_ROW_LENGTH: 963 DATA_LENGTH: MAX_DATA_LENGTH: 0 INDEX_LENGTH: DATA_FREE: 0 AUTO_INCREMENT: NULL CREATE_TIME: :36:44 UPDATE_TIME: NULL CHECK_TIME: NULL TABLE_COLLATION: utf8_polish_ci CHECKSUM: NULL CREATE_OPTIONS: TABLE_COMMENT: InnoDB free: 3072 kB; (`biuronr`) REFER` biuro/biuro`(`biuronr`) ON UPDATE CASCAD Wszystkie informacje dla tabeli personel bazy biuro :

50 Informacje o schematach : mysql> SELECT catalog_name, schema_name, default_character_set_name, default_collation_name FROM information_schema.schemata; | catalog_name | schema_name | default_character_set_name| default_collation_name| | NULL | information_schema| utf8 | utf8_general_ci | | NULL | biuro | utf8 | utf8_polish_ci | | NULL | mysql | utf8 | utf8_general_ci | | NULL | szkola | utf8 | utf8_polish_ci | rows in set (0.02 sec)

51 mysql> SELECT * FROM information_schema.columns WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel' AND COLUMN_NAME IN ('personelnr','plec')\G *************************** 1. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: personelNr ORDINAL_POSITION: 1 COLUMN_DEFAULT: NULL IS_NULLABLE: NO DATA_TYPE: varchar CHARACTER_MAXIMUM_LENGTH: 4 CHARACTER_OCTET_LENGTH: 12 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: utf8 COLLATION_NAME: utf8_polish_ci COLUMN_TYPE: varchar(4) COLUMN_KEY: PRI EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT: Rozszerzone informacje o kolumnach:

52 Cd. *************************** 2. row *************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: plec ORDINAL_POSITION: 5 COLUMN_DEFAULT: NULL IS_NULLABLE: NO DATA_TYPE: enum CHARACTER_MAXIMUM_LENGTH: 1 CHARACTER_OCTET_LENGTH: 3 NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL CHARACTER_SET_NAME: utf8 COLLATION_NAME: utf8_polish_ci COLUMN_TYPE: enum('K','M') COLUMN_KEY: EXTRA: PRIVILEGES: select,insert,update,references COLUMN_COMMENT:

53 Informacje o używanych kluczach: mysql> SELECT * FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G ************************** 1. row ************************** CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: PRIMARY TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: personelNr ORDINAL_POSITION: 1 POSITION_IN_UNIQUE_CONSTRAINT: NULL REFERENCED_TABLE_SCHEMA: NULL REFERENCED_TABLE_NAME: NULL REFERENCED_COLUMN_NAME: NULL

54 cd: ************************** 2. row ************************** CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: biuroNr TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel COLUMN_NAME: biuroNr ORDINAL_POSITION: 1 POSITION_IN_UNIQUE_CONSTRAINT: 1 REFERENCED_TABLE_SCHEMA: biuro REFERENCED_TABLE_NAME: biuro REFERENCED_COLUMN_NAME: biuroNr 2 rows in set (0.02 sec)

55 Informacje o więzach (ograniczeniach) tabel: mysql> SELECT * FROM information_schema.table_constraints WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G ************************** 1. row ************************** CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: PRIMARY TABLE_SCHEMA: biuro TABLE_NAME: personel CONSTRAINT_TYPE: PRIMARY KEY ************************** 2. row ************************** CONSTRAINT_CATALOG: NULL CONSTRAINT_SCHEMA: biuro CONSTRAINT_NAME: biuroNr TABLE_SCHEMA: biuro TABLE_NAME: personel CONSTRAINT_TYPE: FOREIGN KEY 2 rows in set (0.02 sec)

56 Informacje o indeksach: mysql> SELECT * FROM information_schema.statistics WHERE TABLE_SCHEMA='biuro' AND TABLE_NAME='personel'\G ************************** 1. row ************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel NON_UNIQUE: 0 INDEX_SCHEMA: biuro INDEX_NAME: PRIMARY SEQ_IN_INDEX: 1 COLUMN_NAME: personelNr COLLATION: A CARDINALITY: 17 SUB_PART: NULL PACKED: NULL NULLABLE: INDEX_TYPE: BTREE COMMENT:

57 ************************** 2. row ************************** TABLE_CATALOG: NULL TABLE_SCHEMA: biuro TABLE_NAME: personel NON_UNIQUE: 1 INDEX_SCHEMA: biuro INDEX_NAME: biuroNr SEQ_IN_INDEX: 1 COLUMN_NAME: biuroNr COLLATION: A CARDINALITY: 17 SUB_PART: NULL PACKED: NULL NULLABLE: INDEX_TYPE: BTREE COMMENT: 2 rows in set (0.01 sec) Cd.