Wyzwalacz () – 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 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 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 Jest to opisane na w witrynie MSDN na stronie Using Inserted and Deleted tables..

Wyzwalacze w PostgreSQL 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 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 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

Linki zewnętrzne Microsoft SQL Server CREATE TRIGGER Microsoft SQL Server DROP TRIGGER MySQL Database triggers DB2 CREATE TRIGGER statement Oracle CREATE TRIGGER PostgreSQL CREATE TRIGGER PostgreSQL Trigger Procedures Firebird CREATE TRIGGER Firebird DROP TRIGGER

Kategoria:Bazy danych