• Nie Znaleziono Wyników

automatycznie wywoływanie przez MySQL

N/A
N/A
Protected

Academic year: 2021

Share "automatycznie wywoływanie przez MySQL"

Copied!
33
0
0

Pełen tekst

(1)

Autor: J. Karwowska

(2)

Oprócz tabel i widoków w bazach danych

możemy tworzyć własne funkcje, procedury i specjalny typ procedur, które będą

automatycznie wywoływanie przez MySQL w memencie wstawiania, usuwania lub

modyfikowania określonych danych, czyli wyzwalacze.

(3)

Jedną z możliwości MySQL-a jest możliwość tworzenia przez użytkowników własnych

funkcji.

Funkcjom, tak jak procedurom, można przekazać pewną liczbę parametrów, ale

funkcja nie tylko wykonuje pewne operacje, ale także zwraca obliczony na podstawie

przekazanych parametrów wynik.

Funkcje w MySQL, różnią się od procedur tym, że nie muszą być wskazywane parametry

wejścia i wyjścia ponadto funkcja zwraca jakiś typ danych z dostępnych w MySQL.

(4)

CREATE FUNCTION

nazwa_funkcji

ciało funkcji;

Trzeba zdefiniować nagłówek (nazwę, listę argumentów i typ zwracanej wartości) i ciało funkcji.

Ostatnią instrukcją ciała funkcji powinna być instrukcja RETURN. Funkcja zwróci wartości wymienione po prawej stronie tej instrukcji.

(5)

LANGUAGE SQL - wymagane ze względu na kompatybilność.

NOT DETERMINISTIC - bo przy takich samych parametrach może dać różne wyniki.

DETERMINISTIC - jeśli parametry wywołania jednoznacznie determinują wynik.

SQL SECURITY INVOKER - przy wywołaniu sprawdzaj przywileje wywołującego.

SQL SECURITY DEFINER - przy wywołaniu sprawdzaj przywileje użytkownika, który stworzył procedurę.

(6)

Ponieważ w ciele funkcji poszczególne

instrukcje oddziela znak średnika, na czas jej tworzenia należy zmienić znak końca

instrukcji — inaczej zostanie on natychmiast zinterpretowany, a nie zapisany jako

fragment ciała funkcji.

np. DELIMITER //

(7)

Zdefiniuj przykładową funkcję fn_powitanie, która wyświetli napis Witaj!

(8)

Wywołaj funkcję poleceniem:

SELECT fn_powitanie();

(9)

Zdefiniuj funkcję fn_powitanie2, która oprócz słowa Witaj! Wyświetli jeszcze imię klienta.

(10)

Wykonanie instrukcji DROP FUNCTION spowoduje usunięcie wybranych funkcji użytkownika.

DROP FUNCTION

nazwa_funkcji

; lub

DROP FUNCTION IF EXISTS

nazwa_funkcji

;

Administrator albo osoba mająca nadane odpowiednie uprawnienia może usuwać funkcje użytkownika z bazy:

(11)

Celem wyświetlenia kodu funkcji lub procedury należy użyć polecenia:

SHOW CREATE FUNCTION

nazwa_funkcji

;

(12)

Procedury składowane są zbiorami instrukcji języka SQL zapisanymi pod wspólną nazwą i wywoływanymi jak pojedyncza instrukcja.

Procedury składowane umożliwiają:

Przekazywanie parametrów wywołania.

Wykonywanie prawie wszystkich instrukcji języka SQL, w tym wywoływania innych

procedur składowanych.

Zwracanie dowolnej liczby wyników do programu, który wywołał procedurę.

Zwracanie informacji o udanej lub niewykonanej procedurze.

(13)

Procedury składowane są powszechnie wykorzystywane w celu:

implementowania reguł logiki biznesowej,

zabezpieczenia obiektów bazy danych przed bezpośrednim dostępem użytkowników,

chronienia bazy danych przed atakami polegającymi na iniekcji kodu SQL,

poprawienia wydajności często wykonywanych instrukcji,

zminimalizowania obciążenia sieci (zamiast wysyłać całe instrukcje języka SQL użytkownik

wywołuje jedynie procedurę, wysyłając jej nazwę i przekazując parametry jej wywołania).

(14)

Wykonanie instrukcji CREATE PROCEDURE spowoduje dodanie nowej procedury

składowanej.

W tym przypadku ciało procedury składa się z pojedynczej instrukcji, a więc nie trzeba było umieszczać jej w bloku BEGIN … END.

Przykładowa procedura oczekuje na jeden parametr wywołania i nie zwraca żadnych informacji.

(15)

Utwórz procedurę przecena, która spowoduje obniżkę cen wybranego towaru o 10%.

DELIMITER ;

(zmiana znaku końca instrukcji na ;)

CREATE PROCEDURE

przecena

(IN towar VARCHAR(64))

(IN – wejście)

UPDATE towary SET cena=cena*0.9

WHERE nazwa=towar;

(16)

Wybierzmy do przeceny jeden z towarów o

nazwie zaczynającej się na literę p np. Panele.

(17)

Uruchamiamy funkcję poleceniem:

CALL

nazwa_funkcji(argument);

np. CALL

przecena

(‘Panele’);

i sprawdzamy czy zmieniła się cena towaru Panele.

(18)

Nieużywane procedury składowane możemy usunąć.

Usuwamy procedurę składowaną:

DROP PROCEDURE

nazwa_procedury

; lub

DROP PROCEDURE IF EXISTS

nazwa_procedury

;

(19)

Celem wyświetlenia kodu procedury należy użyć polecenia:

SHOW CREATE PROCEDURE

nazwa_procedury

;

(20)

Wyzwalacze są specjalnym typem procedur składowanych powiązanych z wybranymi

tabelami i wywoływanych wykonaniem instrukcji języka SQL: INSERT, UPDATE albo DELETE.

Niemożliwe jest bezpośrednie wywołanie wyzwalacza za pomocą dyrektywy CALL.

Instrukcje wykonane w ramach ciała wyzwalacza traktowane są jako fragment transakcji jawnie lub niejawnie rozpoczętej przez użytkownika, który odwołał się do danych przechowywanych w powiązanej z wyzwalaczem tabeli. Wynika z

tego, że wyzwalacz może zatwierdzić (wykonując instrukcję COMMIT TRANSACTION) lub wycofać (instrukcją ROLLBACK TRANSACTION) zmiany wprowadzone przez użytkownika.

(21)

Podstawowym zastosowaniem wyzwalaczy jest

wymuszenie integralności danych, zwłaszcza ich zgodności z regułami logiki biznesowej.

Wyzwalacze umożliwiają m.in.:

Kaskadowe aktualizowanie danych w powiązanych tabelach.

Sprawdzanie poprawności danych na podstawie wartości przechowywanych w dowolnych

tabelach (w przeciwieństwie do zawężenia

CHECK, za pomocą którego możemy odwołać się jedynie do bieżącej tabeli).

Jednoczesne sprawdzanie danych

zmodyfikowanych w dowolnej liczbie wierszy tabeli.

(22)

Wywoływanie predefiniowanych lub zdefiniowanych przez użytkownika komunikatów błędu.

Monitorowanie aktywności użytkowników.

Modyfikacje danych w bazach

niespełniających wymogów trzeciej postaci normalnej. W bazach tego typu

prawdopodobnie przechowywane są informacje nadmiarowe (redundantne)

i modyfikacja np. numeru telefonu w jednej tabeli może wiązać się z koniecznością

zmiany tego numeru w innych tabelach.

(23)

Obiekty obu tych typów w pewnym podstawowym zakresie mogą pełnić tę samą funkcję — wymuszenia integralności

przechowywanych danych. Jednak zakres i typ przeprowadzanych przez nie akcji są różne:

Wyzwalacze w przeciwieństwie do ograniczeń wywoływane są w odpowiedzi na akcje użytkownika. Wynika z tego, że dopiero po wykonaniu instrukcji wyzwalany jest wyzwalacz, natomiast warunki ograniczeń sprawdzane są przed wykonaniem

instrukcji języka SQL.

Konsekwencją poprzedniego punktu jest kolejność, w jakiej wywoływane są wyzwalacze i ograniczenia — najpierw

sprawdzane są warunki zdefiniowane w ograniczeniach, a po ich pomyślnym sprawdzeniu wywoływany jest wyzwalacz.

(24)

Wyłącznie właściciel tabeli może utworzyć powiązany z nią wyzwalacz. Uprawnienie do tworzenia wyzwalaczy nie może zostać

nikomu nadane czy przekazane.

Wyzwalacze nie mogą zostać powiązane z widokami oraz tabelami tymczasowymi.

Wyzwalacze mogą przetwarzać

jednocześnie wiele wierszy tabeli. Możliwe jest również warunkowe przetwarzanie

poszczególnych wierszy.

(25)

Tak jak możliwe jest zdefiniowanie dla tabeli dowolnej liczby zawężeń (wyjątkiem jest

ograniczenie PRIMARY KEY), możliwe jest również utworzenie dowolnej liczby

powiązanych z nią wyzwalaczy.

Natomiast tym, co odróżnia wyzwalacze od procedur składowanych (oprócz sposobu ich wywoływania) jest fakt, że wyzwalacze z reguły nie zwracają żadnych danych.

(26)

Aby utworzyć wyzwalacz, należy wykonać instrukcję CREATE TRIGGER.

W tym punkcie przyjrzymy się wykorzystaniu wyzwalaczy do monitorowania zmian nazw produktów.

W pierwszej kolejności utworzymy tabelę, w której będziemy przechowywać historię nazw produktów.

(27)

Tworzymy tabelę pomocniczą, w której

wyzwalacz automatycznie będzie zapisywał interesujące nas dane:

CREATE TABLE

dziennik

(

id INT AUTO_INCREMENT PRIMARY KEY, komunikat VARCHAR(255)

);

(28)

Następnie tworzymy wyzwalacz

uruchamiany instrukcją UPDATE wykonaną dla tabeli towary , w ramach którego:

Sprawdzamy, czy została zmieniona nazwa produktu.

Sprawdzamy, czy nowa albo stara nazwa

produktu nie jest nieokreślona.

(29)

Jeżeli któryś z tych warunków jest

spełniony, wstawiamy do tabeli dziennik wiersz z oryginalną i zmienioną nazwą produktu.

Ponieważ w ciele wyzwalacza poszczególne instrukcje oddziela znak średnika, na czas jego tworzenia należy zmienić znak końca instrukcji — inaczej zostanie on

natychmiast zinterpretowany, a nie

zapisany jako fragment ciała wyzwalacza.

(30)

Utwórz wyzwalacz zapisujący historię zmian nazw produktów.

DELIMITER //

CREATE TRIGGER tgr_nazwy

BEFORE UPDATE ON towary (przed aktualizacją w tabeli towary) FOR EACH ROW (dla każdego wiersza)

BEGIN

IF new.nazwa != old.nazwa (nowa nazwa jest różna od starej nazwy)

OR new.nazwa IS NULL AND old.nazwa IS NOT NULL (lub nowa nazwa jest NULL a stara nazwa nie jest NULL)

OR old.nazwa IS NULL And new.nazwa IS NOT NULL THEN (lub stara nazwa jest NULL a nowa nazwa nie jest NULL)

INSERT INTO dziennik(komunikat) (wstaw do tabeli dziennik pole komunikat)

VALUES (CONCAT('nazwa: ', COALESCE(old.nazwa, 'NULL'), ' -> ', COALESCE(new.nazwa, 'NULL'))

); END IF;

END;//

(31)

Jak wynika z analizy kodu wyzwalacza, w specjalnej tabeli systemowej OLD

przechowywane są oryginalne wartości, a w tabeli NEW — wartości zmienione przez użytkownika. Przetestujmy nasze

rozwiązanie. Jakakolwiek zmiana nazwy produktu zostanie odnotowana w tabeli dziennik.

UPDATE towary

SET nazwa = 'Srubki' WHERE id=1;

Przeprowadź kilka zmian nazw towarów i wyświetl zawartość tabeli dziennik.

SELECT * FROM

dziennik

;

(32)

Aby usunąć wyzwalacz, należy wykonać instrukcję DROP TRIGGER.

DROP TRIGGER

nazwa_wyzwalacza

;

(33)

Cytaty

Powiązane dokumenty

In the second set of compared hybrid lines, differenti- ated with regard to gliadins controlled by the locus Gli B1 on the chromosome 1B lack of individual, weakly stained

Roboty ogólnobudowlane związane z budową autostrad, dróg, ulic i innych dróg dla pojazdów i pieszych oraz budową pasów startowych 101 42.12.20.0. Roboty ogólnobudowlane

zamawiającemu, że realizując zamówienie, będzie dysponował niezbędnymi zasobami tych podmiotów, w szczególności przedstawiając zobowiązanie tych podmiotów do oddania mu do

IV.6.4) Przewiduje się unieważnienie postępowania o udzielenie zamówienia, w przypadku nieprzyznania środków, które miały być przeznaczone na sfinansowanie całości lub

The collection of all sets of measure zero for a finitely additive, group- valued measure is studied and characterised from a combinatorial viewpoint.. Let X be a non-empty set and

Wykonawcy, który wycofał ofertę przed upływem terminu składania ofert. Zamawiający zażąda ponownego wniesienia wadium przez Wykonawcę, któremu zwrócono wadium zgodnie z

uwiarygodniających te materiały lub urządzenia. Zamawiający zastrzega sobie prawo wystąpienia do autora dokumentacji o opinię na temat oferowanych materiałów lub urządzeń.

Definition. Fur- ther on, we will show another characterization of everywhere meagre and everywhere null sets and prove their several interesting properties. We will also