Triggery
Gwidon Jóźwiak, 171864
Co to i do czego nam triggery?
• Procedury wyzwalane automatycznie
w reakcji na zdarzenia w tabeli lub
bazie danych
• W standardzie SQL od wersji 99
(1999r.)
2
Kiedy są wywoływane?
Wywoływane dla INSERT, UPDATE lub DELETE
Wyzwalacze metadanych (Oracle), DDL
(MsSQL)
Wywołanie BEFORE (przed), AFTER (po),
INSTEAD OF (zamiast)
Wywoływanie dla tabel, widoków, schematów
(kont użytkowników), całej bazy
Wywołanie dla całej tabeli, poszczególnych
wierszy lub kolumn
Multitriggery (Oracle)
3
Wyzwalacze metadanych i DDL
• Zdarzenia bazodanowe:
SERVERERROR, LOGON, LOGOFF,
STARTUP lub SHUTDOWN
• Zdarzenia DDL: CREATE, ALTER,
DROP, GRANT, REVOKE
4
Multitriggery
create or replace trigger xyz_validator
after delete or update or insert on xyz
for each row
begin
if deleting then
-- ...
end if;
if updating then
-- ...
end if;
if inserting then
-- ...
end if;
EXCEPTION ... end;
5
Główne cechy
• Nie mogą mieć parametrów
• Nie mogą zatwierdzać (COMMIT) ani
wycofywać (ROLLBACK) transakcji
• Mogą generować dodatkowe błędy
(jeśli są źle napisane)
6
Składnia
CREATE [OR REPLACE] TRIGGER
nazwa_wyzwalacza
[BEFORE|AFTER|INSTEAD OF]
[zdarzenie_bazodanowe|zdarzenie_DDL]
ON [DATABASE|SCHEMA]
7
Składnia - przykład
CREATE TRIGGER Log_errors AFTER
SERVERERROR ON DATABASE
BEGIN
IF (IS_SERVERERROR (1017)) THEN
<wykonaj specjalną obsługę w tym
przypadku>
ELSE
<zapisz w dzienniku informację o
błędzie>
END IF;
END;
8
Old i new
• Old – po zmianie
• New – przed zmianą
• W Oracle poprzedzone :
• W MSSQL poprzedzone @
• W MySQL REFERENCING NEW ROW
AS n, OLD ROW AS o
9
Tabele INSERTED i DELETED
• Mają taką samą strukturę jak tabela
modyfikowana
• Istnieją tylko podczas działania
wyzwalacza
• DELETED przy DELETE i UPDATE
• INSERTED przy INSERT i UPDATE
10
INSERTED i DELETED przykład
CREATE TRIGGER modyfikacja
ON pracownicy
AFTER INSERT, UPDATE, DELETE
AS
print 'liczba zmodyfikowanych
wierszy: ' + str(@@rowcount)
print 'Wiersze usuniete:'
select * from deleted
print 'Wiersze dodane:'
select * from inserted
11
Przykład MySQL
CREATE TRIGGER pensja_trigger
BEFORE UPDATE ON
pracownicy_table
REFERENCING NEW ROW AS n,
OLD ROW AS o FOR EACH ROW IF
n.pensja <> o.pensja THEN --wykonaj
odpowiednie działania; END IF;
12
Włączanie i wyłączanie
ALTER TRIGGER wyzwalacz {ENABLE|
DISABLE};
DROP TRIGGER wyzwalacz;
13
Czego nie wolno
• „Grzebać” w tabeli, dla której trigger
jest wywoływany
• Wywoływać UPDATE
• Nie mogą zatwierdzać (COMMIT) ani
wycofywać (ROLLBACK) transakcji
14
Główne zastosowania
• Ochrona przed zmianami
• Rejestracja zmian
• Egzekwowanie reguł biznesowych
• Zwiększenia wydajności
15
KONIEC
Pytania?