Bazy danych 7. Widoki i wyzwalacze. P. F. Góra

Podobne dokumenty
Bazy danych 10. SQL Widoki

Bazy danych 8. Widoki i wyzwalacze. P. F. Góra

Bazy danych 10. SQL Widoki, procedury składowane, kursory i wyzwalacze

Bazy danych 6. Klucze obce. P. F. Góra

Bazy danych 7. SQL podstawy

Bazy Danych i Usługi Sieciowe

Bazy danych i usługi sieciowe

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

Bazy danych 9. SQL Klucze obce Transakcje

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Bazy danych 5. Samozłaczenie SQL podstawy

Bazy danych 4. SQL podstawy. P. F. Góra

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Wyzwalacze (triggery) Przykład

Wykład 8. SQL praca z tabelami 5

Bazy danych 9. Klucze obce Transakcje. P. F. Góra

Aspekty aktywne baz danych

Paweł Rajba

Bazy danych 9. Klucze obce Transakcje

Wyzwalacze. do automatycznego generowania wartości kluczy głównych. Składnia instrukcji tworzacej wyzwalacz

Wprowadzenie. Tworzenie widoków

Bazy danych 6. Podzapytania i grupowanie. P. F. Góra

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Oracle PL/SQL. Paweł Rajba.

Instrukcja podwaja zarobki osób, których imiona zaczynają się P i dalsze litery alfabetu zakładamy, że takich osbób jest kilkanaście.

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Przykład 3 Zdefiniuj w bazie danych hurtownia_nazwisko przykładową funkcję użytkownika fn_rok;

Tworzenie widoku CREATE OR REPLACE VIEW [nazwa_widoku] AS SELECT [nazwy_kolumn] FROM [nazwa_tablicy];

Bazy danych 4. SQL- podstawy

Cele. Definiowanie wyzwalaczy

Bazy danych. Bazy danych. Zapytania SELECT. Dr inż. Paweł Kasprowski.

Wykład 5 funkcje i procedury pamiętane widoki (perspektywy) wyzwalacze

Bazy danych 11. SQL Procedury składowane, kursory i wyzwalacze

Administracja i programowanie pod Microsoft SQL Server 2000

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Bazy danych 7. SQL dalsze możliwości. Grupowanie.

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Używany kiedy pełna treść instrukcji SQL jest nieznana przed uruchomieniem programu.

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

SQL 4 Structured Query Lenguage

Projektowanie systemów baz danych

Język SQL, zajęcia nr 1

E.14 Bazy Danych cz. 17 SQL Widoki

I. Język manipulowania danymi - DML (Data Manipulation Language). Polecenia INSERT, UPDATE, DELETE

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Relacyjne bazy danych. Podstawy SQL

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

UPDATE Studenci SET Rok = Rok + 1 WHERE Rodzaj_studiow =' INŻ_ST'; UPDATE Studenci SET Rok = Rok 1 WHERE Nr_albumu IN ( '111345','100678');

Wykład 05 Bazy danych

Literatura: SQL Ćwiczenia praktyczne Autor: Marcin Lis Wydawnictwo: Helion. Autor: Joanna Karwowska

Wykład 5. SQL praca z tabelami 2

T-SQL dla każdego / Alison Balter. Gliwice, cop Spis treści. O autorce 11. Dedykacja 12. Podziękowania 12. Wstęp 15

Autor: Joanna Karwowska

PODSTAWY BAZ DANYCH 13. PL/SQL

Programowanie po stronie serwera w SZBD. Robert A. Kłopotek Wydział Matematyczno-Przyrodniczy. Szkoła Nauk Ścisłych, UKSW

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Wprowadzenie do projektowania i wykorzystania baz danych Relacje

Bazy danych wykład szósty Więzy i wyzwalacze. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

Hurtownia Świętego Mikołaja projekt bazy danych

Kowalski Marcin Wrocław, dn Jaśkiewicz Kamil Bazy Danych 1 Podstawy Projekt Temat: Baza danych do zarządzania projektami

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Relacyjne bazy danych. Podstawy SQL

Połączenie z bazą danych : mysql h u root -p Enter password: *******

Zarzadzanie transakcjami. Transakcje

Kurs. Podstawy MySQL

BAZA DANYCH SIECI HOTELI

Bazy danych 7. Klucze obce Transakcje. P. F. Góra

Bazy danych 6. SQL funkcje daty i czasu, zmienne tymczasowe, aliasy

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Tworzenie tabel. Bazy danych - laboratorium, Hanna Kleban 1

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład X

Trigger jest obiektem związanym z tablicą, który aktywuje się gdy do tablicy następuje odpowiednie zapytanie.

Bazy danych 8. Procedury składowane i kursory. P. F. Góra

Język DML. Instrukcje DML w różnych implementacjach SQL są bardzo podobne. Podstawowymi instrukcjami DML są: SELECT INSERT UPDATE DELETE

Przykładowa baza danych BIBLIOTEKA

LAB2. Dalsze ćwiczenia z podstaw języka SQL (CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT)

Integralność danych Wersje języka SQL Klauzula SELECT i JOIN

Wyzwalacze. Anna Fiedorowicz Bazy danych 2

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

Podstawy języka SQL. SQL Structured Query Languagestrukturalny

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki Instrukcja do zajęć laboratoryjnych

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

PL/SQL. Zaawansowane tematy PL/SQL. Piotr Medoń

77. Modelowanie bazy danych rodzaje połączeń relacyjnych, pojęcie klucza obcego.

050 SQL ELEMENTY ZAAWANSOWANE. Prof. dr hab. Marek Wisła

1. Wyzwalacze BD (ang. triggers)

Język SQL. Rozdział 10. Perspektywy Stosowanie perspektyw, tworzenie perspektyw prostych i złożonych, perspektywy modyfikowalne i niemodyfikowalne.

Ref. 7 - Język SQL - polecenia DDL i DML

LAB 6 BEGIN TRANSACTION, COMMIT, ROLLBACK, SET TRANSACTION ISOLATION LEVEL,

Transakcje jednocześnie ACID

Systemowe aspekty baz

Język SQL. Rozdział 9. Język definiowania danych DDL, część 2.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

CREATE DATABASE ksiegarnia_internetowa DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

1 Zaznacz poprawne stwierdzenia dotyczące grup plików (filegroup) możemy określić do której grupy plików trafi

Transkrypt:

Bazy danych 7. Widoki i wyzwalacze P. F. Góra http://th-www.if.uj.edu.pl/zfs/gora/ 2017

Widoki, AKA Perspektywy W SQL tabela, która utworzono za pomoca zapytania CREATE TABLE, nazywa się tabela podstawowa (base table). przez system operacyjny. Jej struktura i dane przechowywane sa Wynik każdego zapytania SELECT też, formalnie, jest tabela. Tabelę taka nazywa się tabela pochodna (derived table). Widokiem (lub perspektywa) nazywam trwała definicję tabeli pochodnej, która to definicja przechowywana jest w bazie danych. Copyright c 2009-17 P. F. Góra 2

Jak tworzymy widoki? CREATE VIEW nazwa AS SELECT treść zapytania select; Copyright c 2009-17 P. F. Góra 3

Przykład Tworzymy następujace tabele: mysql> CREATE TABLE arabic -> (i INT UNSIGNED NOT NULL, b VARCHAR(8)) CHARSET=cp1250; Query OK, 0 rows affected (0.87 sec) mysql> CREATE TABLE roman (i INT UNSIGNED NOT NULL, r VARCHAR(4)); Query OK, 0 rows affected (0.42 sec) mysql> SET CHARSET cp1250; Query OK, 0 rows affected (0.04 sec) mysql> INSERT INTO arabic VALUES -> (1, jeden ),(2, dwa ),(3, trzy ),(4, cztery ),(5, pięć ); Query OK, 5 rows affected (0.13 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> INSERT INTO roman VALUES -> (1, I ),(2, II ),(3, III ),(4, IV ); Query OK, 4 rows affected (1.17 sec) Records: 4 Duplicates: 0 Warnings: 0 Copyright c 2009-17 P. F. Góra 4

mysql> SELECT * FROM arabic; +---+--------+ i b +---+--------+ 1 jeden 2 dwa 3 trzy 4 cztery 5 pięć +---+--------+ 5 rows in set (0.00 sec) mysql> SELECT * FROM roman; +---+------+ i r +---+------+ 1 I 2 II 3 III 4 IV +---+------+ 4 rows in set (0.00 sec) Copyright c 2009-17 P. F. Góra 5

Tworzymy najprostszy widok mysql> CREATE VIEW v1 -> AS SELECT * FROM arabic; Query OK, 0 rows affected (1.14 sec) Tak utworzony widok jest w gruncie rzeczy aliasem tabeli. mysql> SELECT * FROM v1; +---+--------+ i b +---+--------+ 1 jeden 2 dwa 3 trzy 4 cztery 5 pięć +---+--------+ 5 rows in set (1.13 sec) Copyright c 2009-17 P. F. Góra 6

Widoki można tworzyć na podstawie widoków. Wyrażenie SELECT w definicji widoku może zawierać klauzulę WHERE. Można brać tylko wybrane kolumny. Można nadawać im aliasy. mysql> CREATE VIEW v2 -> AS SELECT b AS napis FROM v1 -> WHERE i > 3; Query OK, 0 rows affected (0.15 sec) mysql> SELECT * FROM v2; +--------+ napis +--------+ cztery pięć +--------+ 2 rows in set (0.05 sec) Copyright c 2009-17 P. F. Góra 7

Underlying tables Tabele, których użyto do zdefiniowania widoku, sa nazywane underlying tables. Widok v1 ma jedna underlying table: arabic. Widok v2 ma dwie underlying tables: tabelę arabic oraz widok v1. Copyright c 2009-17 P. F. Góra 8

Widoki a zmiana underlying table Widoki reaguja na zmianę danych w tabelach, których użyto do ich stworzenia: mysql> INSERT INTO arabic VALUES(6, sześć ); Query OK, 1 row affected (0.43 sec) mysql> SELECT * FROM v2; +--------+ napis +--------+ cztery pięć sześć +--------+ 3 rows in set (0.38 sec) Copyright c 2009-17 P. F. Góra 9

Widoki nie reaguja na zmianę definicji tabeli, o ile nie narusza ona integralności widoku. mysql> ALTER TABLE arabic ADD COLUMN (x CHAR(1) DEFAULT X ); Query OK, 6 rows affected (4.51 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM arabic WHERE i>4; +---+--------+------+ i b x +---+--------+------+ 5 pięć X 6 sześć X +---+--------+------+ 2 rows in set (0.89 sec) mysql> SELECT * FROM v1 WHERE i>4; +---+--------+ i b +---+--------+ 5 pięć 6 sześć +---+--------+ 2 rows in set (0.00 sec) Copyright c 2009-17 P. F. Góra 10

Można tworzyć całkiem skomplikowane widoki mysql> CREATE VIEW lewy -> AS SELECT arabic.i AS i, b, r FROM arabic LEFT JOIN roman -> ON arabic.i=roman.i; Query OK, 0 rows affected (1.23 sec) mysql> SELECT * FROM lewy; +---+--------+------+ i b r +---+--------+------+ 1 jeden I 2 dwa II 3 trzy III 4 cztery IV 5 pięć 6 sześć +---+--------+------+ 6 rows in set (0.18 sec) Copyright c 2009-17 P. F. Góra 11

Po co widoki? mysql> CREATE TABLE Ceny -> (ProducentId SMALLINT UNSIGNED NOT NULL, -> ProduktId SMALLINT UNSIGNED NOT NULL, -> Cena DECIMAL(10,2) NOT NULL, -> PRIMARY KEY(ProducentId, ProduktId)); mysql> CREATE TABLE Dostawy -> (NrDostawy INT UNSIGNED NOT NULL PRIMARY KEY, -> ProducentId SMALLINT UNSIGNED NOT NULL, -> ProduktId SMALLINT UNSIGNED NOT NULL, -> Ilosc INT UNSIGNED NOT NULL); mysql> CREATE VIEW ksiegowosc -> AS SELECT ProducentID, Ilosc*Cena AS Kwota -> FROM Dostawy NATURAL JOIN Ceny; mysql> CREATE VIEW produkcja -> AS SELECT ProduktId, SUM(Ilosc) AS Zapas -> FROM Dostawy -> GROUP BY ProduktId; W bazie zapamiętane zostana tylko definicje poszczególnych kolumn widoków, nie zaś wartości! Różni użytkownicy bazy chca/mog a/powinni mieć różny dostęp do tych samych danych źródłowych. Copyright c 2009-17 P. F. Góra 12

Definiowanie widoków pozwala na przechowywanie całkiem złożonych definicji w bazie danych i późniejsze wykorzystywanie ich w zapytaniach. Jest to szczególnie wygodne gdy z ta sama baza współpracuja różne aplikacje. Copyright c 2009-17 P. F. Góra 13

Widoki modyfikowalne Niektóre widoki sa modyfikowalne zmiana danych w widoku powoduje zmianę danych w underlying tables. mysql> UPDATE v2 SET napis="six" WHERE napis LIKE "sz%"; Query OK, 1 row affected (1.33 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM arabic; +---+--------+------+ i b x +---+--------+------+ 1 jeden X 2 dwa X 3 trzy X 4 cztery X 5 pięć X 6 six X +---+--------+------+ 6 rows in set (0.00 sec) Copyright c 2009-17 P. F. Góra 14

Ale... mysql> INSERT INTO v2 VALUES ( siedem ); ERROR 1423 (HY000): Field of view widoki.v2 underlying table doesn t have a default value Nie można dodać lub zmienić wiersza widoku modyfikowalnego, jeżeli zmiana taka naruszałaby więzy integralności underlying tables. Gdyby kolumna i tabeli arabic była określona jako AUTO INCREMENT lub też gdyby nie była określona jako NOT NULL, powyższe wstawienie wiersza do widoku zadziałałoby. Jeżeli zatem chcemy udostępniać użytkownikom (aplikacjom) widoki, które maja być modyfikowalne, trzeba dobrze przemyśleć strukturę całej bazy. Copyright c 2009-17 P. F. Góra 15

Widoki niemodyfikowalne Niektóre widoki sa z założenia niemodyfikowalne: Niemodyfikowalne sa te, które w liście SELECT zawieraja UNION, UNION ALL, DISTINCT, DISTINCTROW, inny widok niemodyfikowalny lub podzapytanie. Podzapytania w widokach W MySQL widoki nie moga zawierać podzapytań, ale o ile podzapytania nie sa skorelowane, problem da się obejść! Jak? tworzac widoki, które spełniaja rolę podzapytań. W ten sposób można tworzyć bardzo złożone widoki. Copyright c 2009-17 P. F. Góra 16

Przykład: W pewnej bazie istnieja tabele mysql> DESCRIBE Studenci; +----------+---------------------+------+-----+---------+----------------+ Field Type Null Key Default Extra +----------+---------------------+------+-----+---------+----------------+ nr tinyint(3) unsigned NO PRI auto_increment Imie varchar(16) NO MUL Nazwisko varchar(16) NO +----------+---------------------+------+-----+---------+----------------+ mysql> DESCRIBE Bazy; +-------+---------------------+------+-----+------------+-------+ Field Type Null Key Default Extra +-------+---------------------+------+-----+------------+-------+ nr tinyint(3) unsigned NO PRI data date NO PRI 0000-00-00 OK char(2) YES OK +-------+---------------------+------+-----+------------+-------+ Istnieja też tabele Metnum oraz Szeregi, o strukturze takiej samej, jak tabela Bazy. Copyright c 2009-17 P. F. Góra 17

Teraz możemy utworzyć widoki mysql> CREATE VIEW KtoBazy AS -> SELECT Nr, COUNT(*) AS C FROM Bazy WHERE OK="OK" GROUP BY Nr; mysql> CREATE VIEW KtoMetnum AS -> SELECT Nr, COUNT(*) AS C FROM Metnum WHERE OK="OK" GROUP BY Nr; mysql> CREATE VIEW KtoSzeregi AS -> SELECT Nr, COUNT(*) AS C FROM Szeregi WHERE OK="OK" GROUP BY Nr; mysql> CREATE VIEW KtoIle AS -> SELECT Imie, Nazwisko, KtoBazy.C AS Bazy, KtoMetnum.C AS Metnum, -> KtoSzeregi.C AS Szeregi -> FROM Studenci -> LEFT JOIN KtoBazy USING (Nr) -> LEFT JOIN KtoMetnum USING (Nr) -> LEFT JOIN KtoSzeregi USING (Nr) -> ORDER BY Nazwisko; Copyright c 2009-17 P. F. Góra 18

mysql> SELECT * FROM KtoIle LIMIT 6; +-----------+------------+------+--------+---------+ Imie Nazwisko Bazy Metnum Szeregi +-----------+------------+------+--------+---------+ Karol Adamczyk 2 NULL 2 Mateusz Armatys 1 NULL NULL Katarzyna Bąk NULL 4 NULL Rafał Baranowski NULL 4 NULL Paweł Buczkowski NULL NULL NULL Kamila Czaplicka NULL 4 NULL +-----------+------------+------+--------+---------+ 6 rows in set (0.00 sec) Copyright c 2009-17 P. F. Góra 19

Usuwanie wierszy z widoków Niekiedy z widoków modyfikowalnych można usuwać wiersze mianowicie wtedy, gdy SQL potrafi przetłumaczyć zapytanie usuwajace wiersze z widoku na zapytanie (zapytania) usuwajace wiersze z underlying table(s). mysql> DELETE FROM v2 WHERE napis="pięć"; Query OK, 1 row affected (1.24 sec) mysql> SELECT * FROM arabic; +---+--------+------+ i b x +---+--------+------+ 1 jeden X 2 dwa X 3 trzy X 4 cztery X 6 six X +---+--------+------+ 5 rows in set (0.00 sec) Copyright c 2009-17 P. F. Góra 20

Ale... mysql> SELECT * FROM lewy; +---+--------+------+ i b r +---+--------+------+ 1 jeden I 2 dwa II 3 trzy III 4 cztery IV 6 six +---+--------+------+ 5 rows in set (1.10 sec) mysql> DELETE FROM LEWY WHERE r= I ; ERROR 1395 (HY000): Can not delete from join view widoki.lewy Copyright c 2009-17 P. F. Góra 21

Więz CHECK w widokach CREATE VIEW nazwa AS SELECT treść zapytania select WHERE warunek [WITH [CASCADED LOCAL] CHECK OPTION]; Jeśli w zapytaniu tworzacym widok jest klauzula WHERE, więz CHECK uniemożliwi takie dodanie/zmodyfikowanie danych do widoku, które naruszałoby tę klauzulę. CASCADED i LOCAL maja znaczenie jeśli widok tworzony jest na podstawie innych widoków. Jeżeli wybierzemy CASCADED, klauzule WHERE podwidoków też sa sprawdzane, nawet jeśli nie nałożono na nie jawnie więzu CHECK. Copyright c 2009-17 P. F. Góra 22

Przykład mysql> CREATE VIEW v3 -> AS SELECT i, b FROM arabic -> WHERE i < 6; Query OK, 0 rows affected (1.13 sec) mysql> SELECT * FROM v3; +---+--------+ i b +---+--------+ 1 jeden 2 dwa 3 trzy 4 cztery +---+--------+ 4 rows in set (0.00 sec) mysql> CREATE VIEW v4 -> AS SELECT i, b FROM arabic -> WHERE i < 6 -> WITH CHECK OPTION; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM v4; +---+--------+ i b +---+--------+ 1 jeden 2 dwa 3 trzy 4 cztery +---+--------+ 4 rows in set (0.00 sec) Na tym etapie nie ma różnicy klauzula WHERE wybrała odpowiednie wiersze. Copyright c 2009-17 P. F. Góra 23

mysql> INSERT INTO v3 VALUES (7, siedem ); Query OK, 1 row affected (1.10 sec) mysql> SELECT * FROM v3; +---+--------+ i b +---+--------+ 1 jeden 2 dwa 3 trzy 4 cztery +---+--------+ 4 rows in set (0.01 sec) mysql> INSERT INTO v4 VALUES (8, osiem ); ERROR 1369 (HY000): CHECK OPTION failed widoki.v4 Zawartość widoku v3 nie zmieniła się, ale pozwolił on na modyfikację underlying table, co możnaby sprawdzić wykonujac zapytanie SELECT * FROM arabic. Widok v4, z klauzula CHECK, na to nie pozwolił. Copyright c 2009-17 P. F. Góra 24

Widoki dyndajace Jeżeli usuniemy tabelę, nie usuniemy zaś opartych na niej widoków, lub też tak zmodyfikujemy tabelę, że definicja widoku straci sens, dostaniemy widoki dyndajace (dangling views). Widoki sa wypisywane na liście SHOW TABLES; mysql> SHOW TABLES; +------------------+ Tables_in_widoki +------------------+ arabic ceny dostawy ksiegowosc lewy produkcja roman v1 v2 v3 v4 +------------------+ 11 rows in set (1.12 sec) Copyright c 2009-17 P. F. Góra 25

Aby dowiedzieć się czy dana tabela lub widok nie sa uszkodzone, dajemy polecenie mysql> CHECK TABLE roman; +--------------+-------+----------+----------+ Table Op Msg_type Msg_text +--------------+-------+----------+----------+ widoki.roman check status OK +--------------+-------+----------+----------+ 1 row in set (1.23 sec) mysql> CHECK TABLE lewy; +-------------+-------+----------+----------+ Table Op Msg_type Msg_text +-------------+-------+----------+----------+ widoki.lewy check status OK +-------------+-------+----------+----------+ 1 row in set (0.16 sec) W tym momencie wszystko jest w porzadku. Copyright c 2009-17 P. F. Góra 26

Ale... mysql> ALTER TABLE roman DROP COLUMN r; Query OK, 4 rows affected (1.88 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> CHECK TABLE lewy; +-------------+-------+----------+---------------------------------------------+ Table Op Msg_type Msg_text +-------------+-------+----------+---------------------------------------------+ widoki.lewy check error View widoki.lewy references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +-------------+-------+----------+---------------------------------------------+ 1 row in set (0.02 sec) mysql> DROP VIEW lewy; Query OK, 0 rows affected (0.01 sec) Copyright c 2009-17 P. F. Góra 27

Widoki zmaterializowane Widoki sa wirtualnymi tabelami, zawierajacymi rezultaty zapytań same nie przechowuja żadnych danych. Zdarzaja się jednak sytuacje, w których przydatne może być fizyczne przechowywanie danych z widoku. Takie widoki nazywamy widokami zmatrializowanymi (ang.materialized views). W ten sposób możemy tworzyć lokalna kopię danych, będacych wynikiem zapytania zadanego tabeli (tabelom) zlokalizowanej na odległym serwerze lub, jeszcze częściej, w systemach rozproszonych, w których różne części danych przechowywane sa na różnych serwerach. Przy powtórnym odwołaniu się do takiego widoku, korzystamy z kopii lokalnej, bez konieczności realizowania kosztownej i czasochłonnej komunikacji przez sieć. Od czasu do czasu widok taki odświeżamy aby zapewnić aktualność danych. Może się zdarzyć, że dane na odległym serwerze zostana zmienione zanim przeprowadzimy odświeżenie widoku, ale per saldo może i tak Copyright c 2009-17 P. F. Góra 28

to być opłacalne, zwłaszcza jeśli komunikacja jest powolna, a procent nieaktualnych danych niewielki. Korzystanie z widoków zmaterializowanych zmniejsza konieczność korzystania z sieci w systemach rozległych za cenę ryzyka, iż jakaś część danych nie będzie aktualna. Widoki zmaterializowane (chwilowo) moga łamać wymóg spójności danych. Systemy z zaimplementowanymi widokami zmaterializowanymi formalnie należałoby zaliczyć do baz danych typu NoSQL. MySQL nie implementuje widoków zmaterializowanych, ale można to obejść za pomoca wyzwalaczy i procedur składowanych patrz na przykład http:// www.fromdual.com/mysql-materialized-views. Copyright c 2009-17 P. F. Góra 29

Wyzwalacze (triggers) Wyzwalacze sa procedurami wykonywanymi automatycznie po zmianie zawartości wskazanej tabeli. Wyzwalacze zostały wprowadzone do standardu SQL dość późno. W rezultacie składnia wyzwalaczy wyraźnie różni się dla różnych implementacji. W MySQL składnia ma postać: CREATE TRIGGER nazwa wyzwalacza {BEFORE AFTER } {INSERT UPDATE DELETE } ON nazwa tabeli FOR EACH ROW wywoływane wyrażenie SQL; Copyright c 2009-17 P. F. Góra 30

mysql> DELIMITER // mysql> CREATE TRIGGER tabela_trig -> BEFORE UPDATE ON tabela -> FOR EACH ROW -> BEGIN -> SET @s = OLD.w; -> SET @n = NEW.w; -> END // Query OK, 0 rows affected (1.41 sec) mysql> DELIMITER ; mysql> UPDATE tabela SET W = W + 8 -> WHERE K = 1; Query OK, 1 row affected (1.40 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT @s, @n; +------+------+ @s @n +------+------+ 5 13 +------+------+ 1 row in set (0.06 sec) Kwalifikatory OLD, NEW odnosza się do zawartości tabeli przed zmiana i po zmianie. Przy INSERT legalny jest tylko NEW, przy DELETE tylko OLD, przy UPDATE oba. Uwaga: Polecenie DELIMITER przedefiniowuje średnik : ponieważ w ciele wyzwalacza wystepuja znaki kończace zapytania, trzeba je odróżnić od znacznika końca zapytania DDL definiujacego sam wyzwalacz. Copyright c 2009-17 P. F. Góra 31

Wyzwalacze moga odwoływać się tylko do trwałych tabel podstawowych (nie do widoków ani tabel tymczasowych). Każda tabela może mieć co najwyżej jeden wyzwalacz z określona kombinacja BEFORE AFTER + INSERT UPDATE DELETE, ale może mieć wyzwalacze każdego z tych rodzajów (zatem łacznie maksimum sześć wyzwalaczy). Wyzwalacz INSERT jest uruchamiany także przez LOAD DATA. Wyzwalacze UPDATE, DELETE nie sa uruchamiane przez zapytania usuwajace tabele lub modyfikujace jej schemat. Wyzwalacze nie sa uruchamiane przez zdarzenia kaskadowe wywoływane przez klucze obce. Wyzwalacz nie może ani rozpoczać, ani zakończyć (COMMIT), ani odwołać (ROLLBACK) transakcji. Każdy bład spowodowany działaniem wyzwalacza powoduje automatyczne odwołanie transkacji, w obrębie której nastapiło zdarzenie, które spowodowało uruchomienie tego wyzwalacza. Copyright c 2009-17 P. F. Góra 32

Co moga robić wyzwalacze? 1. Wyzwalacze moga powodować zapisanie w jakimś logu danych dotycza- cych zmiany, takich jak identyfikator użytkownika, który dokonał zmiany, czasu zmiany, poprzednich wartości itp. Może to służyć do monitorowania (audytu) zmian, a także do wycofania błędnych, niepotrzebnych zmian, jeśli zajdzie taka potrzeba. Jest to chyba najczęstsze zastosowanie wyzwalaczy. 2. Za pomoca wyzwalaczy można uruchamiać kaskadę zdarzeń typu DELETE lub UPDATE: Jeśli usuniemy (zmodyfikujemy) jakiś wiersz, usuwamy (modyfikujemy) odpowiadajace mu wiersze w innych tabelach. Uwaga! Jeśli decydujemy się realizować operacje kaskadowe za pomoca wyzwalaczy, nie ma sensu definiować ich jednocześnie za pomoca kluczy obcych! Copyright c 2009-17 P. F. Góra 33

3. Za pomoca wyzwalaczy możemy zautomatyzować pewne operacje, które powinny być wykonane po zmianie wiersza w jakiejś tabeli. Na przykład, jeśli wprowadzamy nowy wiersz do tabeli Pracownicy, czyli gdy informujemy system o zatrudnieniu nowego pracownika, powinniśmy automatycznie wstawić odpowiedni wiersz do tabeli Wynagrodzenia. 4. Wyzwalacze moga aktualizować w innych tabelach wielkości, które zależa od wartości zapisanych w tabeli, dla której zdefiniowano wyzwalacz. Gdy więc do tej tabeli wprowadzimy nowy wiersz lub gdy usuniemy lub zmodyfikujemy wiersz istniejacy, wyzwalacz może zmienić pewne zapisane wielkości, tak, aby odpowiadały one aktualnej zawartości zmienianej tabeli. Copyright c 2009-17 P. F. Góra 34

Przykład Pewna organizacja przechowuje informacje o transakcjach ze swoimi klientami. Organizacja chce też mieć podsumowane wielkości obrotów dla poszczególnych klientów. Aby nie musieć ich obliczać za każdym razem, gdy okaże się to potrzebne, tabela zawierajaca podsumowane obroty jest aktualizowana przez wyzwalacz. Tabela Sprzedaz zawiera informacje o poszczególnych transakcjach (w znaczeniu biznesowym, nie SQLowym), natomiast tabela Totals zawiera podsumowane obroty. Szczegółowa struktura tych tabel ma postać Copyright c 2009-17 P. F. Góra 35

mysql> DESCRIBE Sprzedaz; +--------+------------------+------+-----+---------+-------+ Field Type Null Key Default Extra +--------+------------------+------+-----+---------+-------+ CustId int(10) unsigned NO PRI NULL Data datetime NO PRI NULL Kwota float NO NULL +--------+------------------+------+-----+---------+-------+ 3 rows in set (0.11 sec) mysql> DESCRIBE Totals; +--------+------------------+------+-----+---------+-------+ Field Type Null Key Default Extra +--------+------------------+------+-----+---------+-------+ CustId int(10) unsigned NO PRI NULL Total float NO NULL +--------+------------------+------+-----+---------+-------+ 2 rows in set (0.02 sec) Copyright c 2009-17 P. F. Góra 36

Dla tabeli Sprzedaz zdefiniowano nastepujacy wyzwalacz: mysql> DELIMITER // mysql> CREATE TRIGGER UpdateTotals -> AFTER INSERT ON Sprzedaz FOR EACH ROW -> BEGIN -> UPDATE Totals -> SET Total=Total + NEW.Kwota -> WHERE CustId=NEW.CustId; -> END // Query OK, 0 rows affected (0.86 sec) mysql> DELIMITER ; Copyright c 2009-17 P. F. Góra 37

Aktualna zawartościa tabeli Totals jest mysql> SELECT * FROM Totals WHERE CustId=58; +--------+-------+ CustId Total +--------+-------+ 58 3.5 +--------+-------+ 1 row in set (0.00 sec) Wstawiamy teraz nowe wiersze do tabeli Sprzedaz mysql> INSERT INTO Sprzedaz VALUES -> (58, 2017-11-26 20:22:20,7.20), -> (58, 2017-11-26 20:22:28,4.40); Query OK, 2 rows affected (0.14 sec) Records: 2 Duplicates: 0 Warnings: 0 Copyright c 2009-17 P. F. Góra 38

... i zaraz potem sprawdzamy zawartość tabeli Totals: mysql> SELECT * FROM Totals WHERE CustId=58; +--------+-------+ CustId Total +--------+-------+ 58 15.1 +--------+-------+ 1 row in set (0.00 sec) 15.1 = 3.5+7.20+4.40. Wyzwalacz zadziałał po każdym wstawieniu nowego wiersza. Oczywiście dla kompletu należałoby także zdefiniować analogiczne wyzwalacze odpowiadajace zdarzeniom DELETE i UPDATE w tabeli Sprzedaz. Copyright c 2009-17 P. F. Góra 39

Wyzwalacze co może pójść źle? Błędy spowodowane działaniem wyzwalaczy moga być bardzo trudne do wytropienia. Użytkownicy nieświadomi istnienia wyzwalaczy moga być zaskoczeni zmianami, które same dokonały się w bazie danych. Zdarza się, że wyzwalacz modyfikuje jakaś inna tabelę, dla której zdefiniowano wyzwalacz modyfikujacy kolejna tabelę, dla której... itd. Może to spowodować prawdziwa nawałnicę wyzwalaczy (ang. trigger storm), mogac a znacznie spowolnić pracę systemu. Nie można nawet wykluczyć sytuacji, w której wyzwalacz dla tabeli T1 modyfikuje tabelę T2, dla której zdefiniowano wyzwalacz modyfikujacy tabelę T1, co, rzecz jasna, powoduje kolejne uruchomienie zdefiniowanego dla niej wyzwalacza, w wyniku czego... etc system wpada w nieskończona pętlę. Z tych powodów wiele osób odradza używania wyzwalaczy. Copyright c 2009-17 P. F. Góra 40

Wyzwalacze podsumowanie Dobrze zaprojektowane wyzwalacze moga znacznie usprawnić działanie bazy. Co prawda wszystkie zadania obsługiwane przez wyzwalacze można powierzyć aplikacji bazodanowej korzystajacej z danej bazy danych, ale tego rozwiazania nie polecam, bo prędzej lub później okaże sie, że projektant-programista aplikacji zapomni o jakiejś akcji, która powinna być wykonana w bazie po zmienie zawartości pewnej tabeli. Jest to zgodne z zaleceniem, że baza danych jak najwięcej rzeczy powinna robić sama, nie polegajac na komunikujacych się z nia aplikacjach. Alternatywnie, zamiast wyzwalaczy można używać procedur składowanych (patrz następny wykład). Dla czytelności i spójności kodu projektant bazy powinien się zdecydować, czy posługuje się wyzwalaczami, czy w ich miejsce stosuje procedury składowane. Copyright c 2009-17 P. F. Góra 41

Błędem jest posługiwanie się wyzwalaczami i kluczami obcymi do inicjowania zdarzeń kaskadowych na tych samych tabelach. Używanie wyzwalaczy i kluczy obcych do inicjowania zdarzeń kaskadowych na różnych tabelach świadczy o chaotycznym stylu programowania. Aby odnosić korzyści z wyzwalaczy, ich struktura musi być dobrze przemyślana, one same zaś dobrze udokumentowane. Copyright c 2009-17 P. F. Góra 42

Klauzula FOR EACH ROW Klauzula FOR EACH ROW oznacza, że wyzwalacz działa dla każdego wiersza, który uległ zmianie. Sa to wyzwalacze row level. Zgodnie ze standardem SQL, możliwe jest definiowanie wyzwalaczy bez klauzuli FOR EACH ROW taki wyzwalacz wywoływany jest raz w wyniku każdego zapytania wstawiajacym/modyfikuj acym/usuwaj acym dane, nie zaś dla każdego wstawianego/modyfikowanego/usuwanego wiersza. Sa to wyzwalacze statement level. Ta cecha nie jest zaimplementowana w MySQL. Uwaga! Wyzwalacz row level nie zadziała, jeśli żadne wiersze nie zostana zmienione. Wyzwalacz statement level zadziała dokładnie raz niezależnie od tego, czy jakieś wiersze zostana zmienione i ile zostanie zmienionych. Copyright c 2009-17 P. F. Góra 43

Przykład Przypuśćmy, że na tabeli Foobar założono wyzwalacz w jednej z dwu wersji (i że jest to możliwe): CREATE TRIGGER StatementPopolupo CREATE TRIGGER RowPopolupo AFTER UPDATE ON Foobar AFTER UPDATE ON Foobar...; FOR EACH ROW...; i wykonano zapytanie UPDATE Foobar SET Foobar.X = 5 WHERE Foobar.Foo = Bar ; Jeżeli warunek w klauzuli WHERE nie będzie spełniony dla żadnego wiersza, wyzwalacz RowPopolupo nie zadziała ani razu, natomiast wyzwalaczstatementpopolupo zadziała dokładnie raz. Jeżeli warunek w klauzuli Copyright c 2009-17 P. F. Góra 44

WHERE będzie spełniony dla 15 wierszy, wyzwalacz RowPopolupo zadziała 15 razy, po jednym razie dla każdego modyfikowanego wiersza, natomiast wyzwalacz StatementPopolupo zadziała także dokładnie raz. Copyright c 2009-17 P. F. Góra 45

Wyzwalacze INSTEAD OF W niektórych systemach na przykład w Microsoft SQL Server (MS SQL) możliwe jest definiowane wyzwalaczy nie tylko z klauzula BEFORE lub AFTER, ale także z klauzula INSTEAD OF. Jest to przydatne na przykład dla wyzwalaczy na widokach (co jest niezgodne ze standardem!) opartych na kilku tabelach bazowych: Wyzwalacz typu INSTEAD OF może wówczas odpowiednio zmodyfikować wiersze wszystkich potrzebnych tabel bazowych. Bez wyzwalacza tego typu taki widok byłby niemodyfikowalny. Więcej na ten temat można znaleźć w dokumentacji odpowiednich systemów. Copyright c 2009-17 P. F. Góra 46