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

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.[a]

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

  1. Jest to opisane na w witrynie MSDN na stronie Using Inserted and Deleted tables.

Linki zewnętrzne