Wyzwalacz
Wyzwalacz (ang. trigger) – procedura wykonywana automatycznie jako reakcja na pewne zdarzenia w tabeli bazy danych. Wyzwalacze mogą ograniczać dostęp do pewnych danych, rejestrować zmiany danych lub nadzorować modyfikacje danych.
Systemy baz danych posiadające wyzwalacze: Microsoft SQL Server, PostgreSQL, Sybase, Oracle, Firebird, SQLite, InterBase SQL, MySQL (od wersji 5.0.2), Progress.
Standard języka SQL zdefiniował wyzwalacze dość późno, bo dopiero od wersji 99. Z tego powodu różne systemy bazodanowe opracowały własną składnię tworzenia wyzwalaczy. Dość blisko standardu jest Oracle oraz Firebird, natomiast system bazodanowy Microsoftu używa składni w wielu miejscach różniącej się od wytycznych.
Istnieje kilka typów wyzwalaczy. Wyzwalacze BEFORE - wykonywane przed instrukcją generującą zdarzenie. Wyzwalacze AFTER są wykonane po instrukcji generującej zdarzenie. W niektórych bazach danych są również wyzwalacze INSTEAD OF - są one wykonywane zamiast instrukcji generującej zdarzenie.
Istnieją trzy typowe zdarzenia powodujące wykonanie wyzwalaczy:
- dopisanie nowego rekordu do bazy danych w wyniku wykonania instrukcji INSERT,
- zmiana zawartości rekordu w wyniku wykonania instrukcji UPDATE oraz
- usunięcie rekordu w wyniku wykonania instrukcji DELETE.
Główne cechy wyzwalaczy to:
- nie mogą mieć parametrów (ale mogą zapisywać dane w tabelach tymczasowych)
- nie mogą zatwierdzać transakcji (COMMIT) ani ich wycofywać (ROLLBACK), ponieważ działają w kontekście instrukcji SQL, która spowodowała ich uruchomienie
- mogą generować dodatkowe błędy, jeżeli są źle napisane.
Wyzwalacze w Oracle
[edytuj | edytuj kod]Oprócz wyzwalaczy wykonywanych gdy dane są modyfikowane, Oracle 9i udostępnia wyzwalacze wykonywane gdy struktura bazy (struktura tabeli) jest modyfikowana oraz gdy użytkownik łączy się lub rozłącza z bazą danych. Ten typ wyzwalaczy nazywany jest "wyzwalaczami metadanych" (ang. schema-level triggers).
Wyzwalacze metadanych
- After Creation
- Before Alter
- After Alter
- Before Drop
- After Drop
- Before Logoff
- After Logon
Wyzwalacze w Microsoft SQL Server
[edytuj | edytuj kod]Microsoft SQL Server udostępnia wyzwalacze wykonywane zarówno po, jak i zamiast instrukcji INSERT, UPDATE lub DELETE.
Microsoft SQL Server udostępnia wyzwalacze dla tabel oraz widoków, z tym, że w przypadku widoków można stosować tylko przez wyzwalacz INSTEAD OF.
W Microsoft SQL Server 2005 wprowadzono wyzwalacze DDL, które są wykonywane w reakcji na bardzo szeroki zakres zdarzeń, takich jak:
- DROP TABLE,
- CREATE TABLE,
- ALTER TABLE,
- łączenie bądź rozłączanie się użytkownika z bazą danych.
W witrynie MSDN dostępna jest pełna lista tych zdarzeń.
Wyzwalacze wykonują swoje działania korzystając z dostępu do tymczasowych tabel Inserted i Deleted.[a]
Wyzwalacze w PostgreSQL
[edytuj | edytuj kod]W PostgreSQL wyzwalacze są dostępne od 1997 roku i pozwalają wywoływać funkcje gdy wykonywane są instrukcje SQL zmieniające dane: INSERT, UPDATE, DELETE oraz TRUNCATE (niestandardowe).
Następujące cechy SQL:2003 nie są zaimplementowane w PostgreSQL:
- Standard pozwala na wykonanie przez wyzwalacz instrukcji SQL innych niż SELECT, INSERT, UPDATE - takich jak CREATE TABLE.
- SQL pozwala wykonywać wyzwalacze w wyniku aktualizowania wskazanych kolumn; ta cecha jest obecna w PostgreSQL od wersji 9.0.
Składnia (dla wersji 9.2):
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { zdarzenie [ OR ... ] }
ON tabela
[ FROM referenced_table_name ]
{ NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( warunek ) ]
EXECUTE PROCEDURE nazwafunkcji ( argumenty )
gdzie „zdarzenie” może przyjmować wartości:
INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE
Wyzwalacze w MySQL
[edytuj | edytuj kod]Obsługa wyzwalaczy została wprowadzona w MySQL 5.0. Obsługiwane są wyzwalacze dla instrukcji INSERT, UPDATE i DELETE.
Standard SQL:2003 umożliwia w wyzwalaczach dostęp do zmiennych rekordowych przy użyciu składni takiej jak REFERENCING NEW AS n. Na przykład jeżeli wyzwalacz monitoruje zmiany w kolumnie pensja to odpowiedni wyzwalacz może zostać zapisany następująco:
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;
Wyzwalacze w Firebird
[edytuj | edytuj kod]Firebird obsługuje wszystkie podstawowe typy wyzwalaczy: BEFORE INSERT, AFTER INSERT, BEFORE UPDATE, AFTER UPDATE, BEFORE DELETE, AFTER DELETE.
W Firebird 1.5 wprowadzone zostały wyzwalacze wieloakcyjne (ang. multi-action triggers). Pozwalają one wykonać ten sam wyzwalacz w wyniku zajścia jednego z kilku zdarzeń.
Przykład wyzwalacza:
CREATE TRIGGER ZmianaStanu
FOR TABLE StanyTowarow
AFTER INSERT OR UPDATE OR DELETE
AS
BEGIN
/* działania wyzwalacza */
END
W Firebird 2.1 wyzwalacze mogą być również wykonywane w wyniku jednego z następujących zdarzeń:
- CONNECT - użytkownik połączył się z bazą danych,
- DISCONNECT - użytkownik rozłączył się z bazą danych,
- TRANSACTION START - transakcja została rozpoczęta,
- TRANSACTION COMMIT - transakcja została zatwierdzona,
- TRANSACTION ROLLBACK - transakcja została wycofana.
Uwagi
[edytuj | edytuj kod]- ↑ Jest to opisane na w witrynie MSDN na stronie Using Inserted and Deleted tables.