T-SQL SQL Server Wyzwalacze (ang. Triggers)

T-SQL SQL Server Wyzwalacze (ang. Triggers)

28 stycznia, 2023 Wyłączono przez admin

Wyzwalacze (ang. Triggers) są specjalnymi rodzajami procedur składowanych, które uruchamiają się automatycznie w wyniku zaistnienia jakiegoś zdarzenia na serwerze bazy danych. Wyzwalacze mogą służyć do różnych rzeczy np. obsługi błędów, sprawdzania poprawności danych, modyfikacji widoków itp.

W SQL Server rozróżniamy kilka typów wyzwalaczy w zależności od zdarzenia.

  • Wyzwalacze DML (od Data Manipulating Language) – chodzi tutaj o polecenia dzięki którym „manipulujemy”/zarządzamy danymi INSERTUPDATE i DELETE. Wyzwalacze tego typu możemy zastosować na tabeli lub na widoku.
  • Wyzwalacze DDL (od Data Definiton Language) – tutaj chodzi o polecenia które służą do definiowania struktury danych CREATEALTERDROP.
  • Wyzwalacze Logon – (istnieją na pewno od wersji SQL Server 2012) tutaj mamy do czynienia ze zdarzeniami Logon, kiedy użytkownik nawiązuje połączenie (sesje) z bazą danych.

Wyzwalacze rozróżniamy także w zależności od typu. W niniejszym wpisie skupimu się na Before After:

  • Befor – trigger zostanie uruchomiony przed zdarzeniem
  • After – trigger zostanie uruchomiony po zdarzeniu

Przykład definicji prostego Triggera

CREATE TRIGGER [nazwa_Triggera]
ON [źródło_danych_np_nazwa_tabeli]
[Typ_wyzwalacza] [polecenia_zdarzenia] 
AS
[Treść_Triggera_np_jakiś_komunikat]

Do czego służą wyzwalacze

Triggery możemy wykorzystać do bardzo wielu rzeczy, oto kilka z ich zastosowań:

  • wyzwalacze bardzo często wykorzystujemy do definiowania warunków integralności danych w tabelach
  • do kaskadowego wykonania pewnych operacji
  • są również wykorzystywane do kontroli danych
  • mogą służyć także do implementacji złożonych reguł biznesowych
  • możemy je także wykorzystać od generowania określonych wartości w tabelach
  • itp.

Przykład zastosowania Triggera na bazie AdventureWorks2008R2

Stwórzmy najprostszy Trigger jaki chyba tylko można stworzyć. Przy próbie modyfikacji danych w tabeli Person.Person za pomocą poleceń INSERT, UPDATE, DELETE ma się uruchomić trigger o nazwie TriggerInfo który wyświetli tylko komunikat „Brawo Twój pierwszy Trigger zadziałał”.

 Zgodnie z przykładową strukturą Triggera powyżej utworzyłem kod który utworzy nasz Trigger na tabeli Person.Person.

CREATE TRIGGER 
	TriggerInfo
ON 
	Person.Person
AFTER INSERT, UPDATE, DELETE
AS
print 'Brawo Twój pierwszy Trigger zadziałał'

Teraz uruchamiamy nasz kod klawiszem F5 lub klikamy na przycisk „EXECUTE” !!! PAMIĘTAJ !!! że musisz być ustawiony w odpowiednim kontekście, czyli w bazie AdventureWorks2008R2. Jeżeli wszystko przebiegnie poprawnie powinniśmy uzyskać komunikat „Command(s) completed successfully”. Już w tym momencie w gałęzi Databases -> AdventureWorks2008R2 -> Tables  -> Person.Person  -> Triggers , powinien pojawić się nowy Trigger o nazwie TriggerInfo. Jeżeli go nie ma musimy kliknąć prawym przyciskiem myszy na gałęzi Triggers i z menu kontekstowego wybrać opcję Refresh.

trigger.1

Teraz sprawdzimy czy nasz trigger działa. W tym celu zmodyfikujemy jeden rekord w tabeli Person.Person i zobaczymy czy nasz trigger się uruchomi. Pamiętasz, że nasz trigger powiniem się uruchomić w przypadku zastosowania na tabeli Person.Person którejś z instrukcji INSERT, UPDATE, DELETE. My zastosujemy instrukcję UPDATE i zmodyfikujemy wiersz z osobą Ken Sanchez.

Poniżej zrzut tabeli sprzed modyfikacji.

trigger.2

Poniżej instrukcja UPDATE którą zmodyfikujemy imię z Ken na KEN, czyli zmienimy tylko rozmiar liter.

UPDATE Person.Person SET FirstName = 'KEN' WHERE BusinessEntityID = 1

Wykonyjemy nasz kod F5 i jeżeli wszystko poszło poprawnie powinniśmy otrzymać dwa komunikaty. Jeden o tym, że zmodyfikowaliśmy jeden wiersz

(1 row(s) affected)

A drugi komunikat z naszego Triggera.

Brawo Twój pierwszy Trigger zadzialal

Co obrazuje poniższy zrzut.

trigger.3

Mamy więc pewność, że nasz Trigger działa poprawnie.