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

Utwórz wyzwalacz „zamiast” w SQL Server

Kiedy tworzysz wyzwalacz w SQL Server, masz możliwość uruchomienia go w połączeniu z instrukcją wyzwalającą (tj. instrukcją SQL, która uruchomiła wyzwalacz) lub odpalenia go zamiast tego oświadczenia.

Aby uruchomić spust zamiast instrukcji wyzwalającej, użyj INSTEAD OF argument.

Jest to w przeciwieństwie do używania FOR lub AFTER argumenty. Gdy używasz tych argumentów, wyzwalacz jest uruchamiany tylko wtedy, gdy wszystkie operacje określone w wyzwalającej instrukcji SQL zostały pomyślnie uruchomione.

Przykład

Utwórz przykładową tabelę:

CREATE TABLE t1 (
    id int IDENTITY(1,1) NOT NULL,
    c1 int DEFAULT 0,
    c2 int DEFAULT 0,
    c3 int DEFAULT 0
);

Utwórz wyzwalacz:

CREATE TRIGGER trg_t1
ON t1
INSTEAD OF UPDATE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted);

Wstaw przykładowy wiersz:

INSERT INTO t1 (c1, c2, c3) 
VALUES (1, 1, 1);

SELECT * FROM t1;

Oto, co mamy do tej pory:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 1    | 1    |
+------+------+------+------+

Teraz uruchommy UPDATE oświadczenie przy stole (to uruchomi wyzwalacz).

UPDATE t1 
SET c1 = c1 + 1
WHERE id = 1;

SELECT * FROM t1;

Wynik:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 1    | 2    |
+------+------+------+------+

Zgodnie z oczekiwaniami UPDATE instrukcja w instrukcji wyzwalającej została zastąpiona instrukcją w wyzwalaczu.

Mój wyzwalacz określił, że za każdym razem, gdy nastąpi próba aktualizacji tabeli, zaktualizuj c3 zamiast tego kolumna.

Uruchom tylko po zaktualizowaniu określonej kolumny

Możesz także użyć UPDATE() funkcja do określenia kodu do uruchomienia tylko wtedy, gdy określona kolumna zostanie zaktualizowana.

Na przykład możemy zmienić nasz wyzwalacz w następujący sposób:

ALTER TRIGGER trg_t1
ON t1
INSTEAD OF UPDATE
AS
IF ( UPDATE(c1) )
BEGIN
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM inserted)
END;

Teraz uruchom poprzednią UPDATE oświadczenie ponownie:

UPDATE t1 
SET c1 = c1 + 1
WHERE id = 1;

SELECT * FROM t1;

Wynik:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 1    | 3    |
+------+------+------+------+

Ponownie, c3 kolumna jest zwiększana.

Ale teraz spróbujmy zaktualizować c2 kolumna:

UPDATE t1 
SET c2 = c2 + 1
WHERE id = 1;

SELECT * FROM t1;

Wynik:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 1    | 3    |
+------+------+------+------+

Nic się nie zmienia. c3 kolumna pozostaje taka sama.

Nawet c2 kolumna jest aktualizowana. Dzieje się tak, ponieważ wyzwalacz nadal działa zamiast instrukcji wyzwalającej.

Uruchom wyzwalacz zamiast DELETE

Możemy zmodyfikować wyzwalacz, aby działał zamiast DELETE oświadczenia.

ALTER TRIGGER trg_t1
ON t1
INSTEAD OF DELETE
AS
UPDATE t1
SET c3 = c3 + 1
WHERE id IN (SELECT DISTINCT id FROM deleted);

Teraz spróbujmy usunąć wszystkie wiersze, a następnie wybierz wszystkie wiersze z tabeli.

DELETE FROM t1;

SELECT * FROM t1;

Wynik:

+------+------+------+------+
| id   | c1   | c2   | c3   |
|------+------+------+------|
| 1    | 1    | 1    | 4    |
+------+------+------+------+

Zauważ, że aby ten wyzwalacz działał poprawnie, musiałem wysłać zapytanie do deleted tabeli w moim wyzwalaczu (w przeciwieństwie do inserted tabeli w poprzednich przykładach).

Te dwie tabele są tworzone i zarządzane przez SQL Server.

deleted tabela przechowuje kopie dotkniętych wierszy podczas DELETE i UPDATE sprawozdania. Podczas wykonywania DELETE lub UPDATE oświadczenie, wiersze są usuwane z tabeli wyzwalającej i przenoszone do usuniętej tabeli.

inserted tabela przechowuje kopie dotkniętych wierszy podczas INSERT i UPDATE sprawozdania. Podczas transakcji wstawiania lub aktualizacji nowe wiersze są dodawane zarówno do wstawionej tabeli, jak i do tabeli wyzwalacza. Wiersze we wstawionej tabeli są kopiami nowych wierszy w tabeli wyzwalającej.

Niektóre ograniczenia, o których należy pamiętać

Możesz zdefiniować maksymalnie jeden INSTEAD OF wyzwalacz na INSERT , UPDATE lub DELETE oświadczenie na stole lub widoku.

Nie możesz zdefiniować INSTEAD OF wyzwala w aktualizowalnych widokach, które używają WITH CHECK OPTION .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolejkowanie w komunikatach OneWay WCF przy użyciu usługi Windows i programu SQL Server

  2. 11 najlepszych praktyk dotyczących indeksowania SQL Server w celu poprawy wydajności dostrajania

  3. Jak działa funkcja STRING_ESCAPE() w SQL Server (T-SQL)

  4. Co robi sp_reset_connection?

  5. Jak utworzyć klucz obcy w SQL Server (przykłady T-SQL)