T-SQL SQL Server Wyzwalacze (ang. Triggers)
28 stycznia, 2023Wyzwalacze (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 INSERT, UPDATE 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 CREATE, ALTER, DROP.
- 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 i 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.
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.
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.
Mamy więc pewność, że nasz Trigger działa poprawnie.