Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Utwórz wyzwalacz DML w SQL Server

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.

<>CREATE TABLE t1 ( id int IDENTITY(1,1) NOT NULL, c1 int DEFAULT 0, c2 int DEFAULT 0, c3 int DEFAULT 0);UTWÓRZ WYZWALANIE trg_t1ON t1PO WSTAWIENIU, AKTUALIZUJ AKTUALIZACJĘ t1SET c3 =c3 + 1GDZIE id IN (wstawiono SELECT DISTINCT id FROM);

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przeszukać bazę danych SQL Server w poszukiwaniu ciągu?

  2. Sprawdź, czy tabela ma DEFAULT ograniczenie w SQL Server za pomocą OBJECTPROPERTY()

  3. Jak przenieść lub wyeksportować dane SQL Server 2005 do Excela?

  4. haszować wiersz SQL?

  5. Jak zwrócić tylko Date z typu danych DateTime serwera SQL?