W SQL Server możesz użyć CREATE TRIGGER
oświadczenie, aby utworzyć wyzwalacz.
Wyzwalacz to specjalny rodzaj procedury składowanej, która jest uruchamiana automatycznie, gdy na serwerze bazy danych wystąpi zdarzenie.
Możesz utworzyć wyzwalacz DML, wyzwalacz DDL lub wyzwalacz logowania.
Ten artykuł zawiera przykład tworzenia wyzwalacza DML.
Co to jest wyzwalacz DML?
Wyzwalacz DML to wyzwalacz, który uruchamia się, gdy użytkownik próbuje zmodyfikować dane za pomocą zdarzenia języka manipulacji danymi (DML).
Zdarzenia DML obejmują INSERT
, AKTUALIZUJ
lub USUŃ
sprawozdania. Wyzwalacze DML mogą być używane do egzekwowania reguł biznesowych i integralności danych, wysyłania zapytań do innych tabel i dołączania złożonych instrukcji T-SQL.
Wyzwalacz i instrukcja, która go uruchamia, są traktowane jako pojedyncza transakcja, którą można wycofać z poziomu wyzwalacza.
Przykład
Oto przykład pokazujący, jak działają wyzwalacze DML.
W tym przykładzie tworzę tabelę, a także wyzwalacz, który będzie uruchamiany za każdym razem, gdy wiersz zostanie wstawiony lub zaktualizowany w tej tabeli.
W takim przypadku wyzwalacz dodaje 1 do c3
kolumna za każdym razem, gdy dane są wstawiane lub aktualizowane.
Wywołałem wyzwalacz trg_t1
. Śledziłem tę część z ON t1
, co oznacza, że wyzwalacz zostanie uruchomiony na tabeli o nazwie t1
.
Możesz alternatywnie określić widok, w którym ma być uruchomiony wyzwalacz, chociaż możesz odwoływać się do widoku tylko przez ZAMIAST
wyzwalacz (w tym przypadku zastąp PO
z ZAMIAST
). Ponadto nie można zdefiniować wyzwalaczy DML w lokalnych lub globalnych tabelach tymczasowych.
PO
określa, że wyzwalacz DML jest uruchamiany tylko wtedy, gdy wszystkie operacje określone w wyzwalającej instrukcji SQL zostały pomyślnie uruchomione. Możesz alternatywnie określić DLA
tutaj.
Inną alternatywą jest użycie ZAMIAST
, który uruchomi wyzwalacz zamiast wyzwalającej instrukcji SQL. W związku z tym zastępuje działania instrukcji wyzwalających.
Co to jest wstawione
Tabela?
W moim wyzwalaczu mogę dowiedzieć się, który wiersz został zaktualizowany, wysyłając zapytanie do wstawione
tabela.
SQL Server tworzy i zarządza tabelą o nazwie inserted
, która jest tymczasową tabelą rezydującą w pamięci, która przechowuje kopie dotkniętych wierszy podczas INSERT
i AKTUALIZUJ
sprawozdania. Podczas transakcji wstawiania lub aktualizacji nowe wiersze są dodawane do obu elementów wstawiony
stół i stół wyzwalający. Wiersze we wstawionej tabeli są kopiami nowych wierszy w tabeli wyzwalającej.
SQL Server również tworzy i utrzymuje podobną tabelę o nazwie usunięte, która przechowuje kopie wierszy, których dotyczy problem podczas DELETE
i AKTUALIZUJ
sprawozdania. Podczas wykonywania DELETE
lub AKTUALIZUJ
oświadczenie, wiersze są usuwane z tabeli wyzwalającej i przenoszone do usuniętej tabeli.
Uruchom wyzwalacz
Teraz, gdy tabela i jej wyzwalacz zostały utworzone, uruchommy kilka instrukcji SQL, które ją wyzwolą.
WSTAW W WARTOŚCI t1 (c1) (1); WYBIERZ * Z t1;
Wynik:
+------+------+------+------+| identyfikator | c1 | c2 | c3 ||------+------+------+------|| 1 | 1 | 0 | 1 |+------+------+------+------+
Widzimy więc, że wyzwalacz działał zgodnie z oczekiwaniami. Po wstawieniu wiersza określiłem tylko wartość dla c1
kolumna, ale wyzwalacz zapewnił, że c3
zaktualizowano również kolumnę.
Zwróć uwagę, że domyślna wartość dla wszystkich kolumn to 0
(jak określono podczas tworzenia tabeli), a wyzwalacz dodał do tego 1.
Wykonajmy AKTUALIZACJĘ
operacja na tej samej kolumnie.
AKTUALIZUJ t1 SET c1 =c1 + 1WHERE id =1;WYBIERZ * Z t1;
Wynik:
+------+------+------+------+| identyfikator | c1 | c2 | c3 ||------+------+------+------|| 1 | 2 | 0 | 2 |+------+------+------+------+
Po raz kolejny c3
kolumna została również zaktualizowana przez wyzwalacz.
Teraz zaktualizujmy c2
kolumna.
UPDATE t1 SET c2 =c2 + 1WHERE id =1;WYBIERZ * Z t1;
Wynik:
+------+------+------+------+| identyfikator | c1 | c2 | c3 ||------+------+------+------|| 1 | 2 | 1 | 3 |+------+------+------+------+
Więc jeszcze raz c3
kolumna jest aktualizowana przez wyzwalacz.
Ten konkretny wyzwalacz jest uruchamiany za każdym razem, gdy aktualizowana jest jakakolwiek inna kolumna w tym samym wierszu.
Możesz także użyć IF UPDATE(nazwa_kolumny)
aby sprawdzić aktualizację pojedynczej kolumny lub COLUMNS_UPDATED()
aby sprawdzić aktualizacje w wielu kolumnach.