Blog JSystems - uwalniamy wiedzę!

Szukaj

Wyzwalacz, w skrócie

Trigger po wstawieniu wiersza:

CREATE TRIGGER trgAudyt ON Klienci
AFTER INSERT AS
BEGIN
  INSERT INTO Audyt(Info)
  SELECT 'Nowy klient' FROM inserted;
END;

Wyzwalacze reagują w odpowiedzi na zdarzenia generowane przez obiekty bazodanowe, bazę danych i serwer. Możemy je podzielić na trzy grupy:

-na klasyczne wyzwalacze DML, które reagują na polecenia takie jak INSERT, UPDATE, DELETE lub MERGE na tabelach

-na wyzwalacze DDL, które uruchamiane są przy wyrażeniach takich jak CREATE, ALTER i DROP

-na wyzwalacze logowania, które reagują na zdarzenia typu LOGON.

Wyzwalacze (triggery) w SQL: ilustracja poglądowa

Sprawdźmy czy jakikolwiek UPDATE na tej tabeli bo uruchomi wyzwalacz:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (2)

Wyzwalacz "InfoNaKonsole" uruchomił się pomimo tego że w tabeli "Employees" nic tak naprawdę się nie zmieniło. Raz, że nowej pensji została przypisana stara pensja, dwa, że uwaględniony został pracownik o numerze pierwszym, a nikogo takiego w tej tabeli nie ma.

Za pomocą np. Konstrukcji IF...ELSE i zmiennej systemowej @@ROWCOUNT możemy się zabezpieczyć aby w przypadku jeśli dana instrukcja UPDATE nie zmodyfikuje ani jednego wiersza, to aby wyzwalacz nie wykonywał danego kodu.

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (3)

Sprawdzamy czy dołożenie instrukcji warunkowej spełniło swoją rolę:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (4)

Jak widać, z wyzwalacza nie otrzymujemy żadnego komunikatu.

Zakładając wyzwalacz na tabeli, jesteśmy w stanie wyciągnąć informację która (lub które) kolumna były modyfikowane, wystarczy użyć funkcji UPDATE:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (5)

Sprawdźmy, najpierw modyfikacja w kolumnie Salary:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (6)

A teraz modyfikacja innej kolumny - LastName:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (7)

W wyzwalaczach istnieje możliwość korzystania z wirtualnych tabel INSERTED i DELETED, dzięki którym możemy się dowiedzieć co zostało wstawione, zmodyfikowane lub usunięte.

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (8)

Zmodyfikujemy teraz tabele "Employees", damy podwyżkę o 100 dwóm pracownikom:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (9)

Po wykonaniu instrukcji UPDATE, wyzwalacz zwraca nam wirtualną tabelę "Inserted", która zawiera zmodyfikowane rekordy.

W przypadku kiedy gdybyśmy chcieli móc porównać co się zmieniło, to idąc po najmniejszej lini oporu należało by wyswielić również dane z wirtualnej tabeli "Deleted":

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (10)

Wykonujemy UPDATE i sprawdzamy wyniki:

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (11)

Wirtualną tabelę "Inserted" otrzymujemy w wyniku instrukcji INSERT oraz UPDATE, natomiast tabelę "Deleted" w wyniku DELETE oraz UPDATE.

Wyzwalacze, poza tym, że możemy je oczywiście usunąć, to możemy je również deaktywować.

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (12)

Aktywujemy je w analogiczny sposób zastępując słowo DISABLE słowem ENABLE.

Możemy również na raz aktywować lub deaktywować wszystkie wyzwalacze, które są załóżone na daną tabelę.

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (13)

Stan wyzwalaczy możemy sprawdzić w słowniku SYS.TRIGGERS.

Wyzwalacze (triggery) w SQL: ilustracja poglądowa (14)

Wyzwalacze DML - INSTEAD OF

Wyzwalacze typu INSTEAD OF mają zadziałać zamiast instrukcji na jaką zostały założone. Np jeśli założymy taki wyzwalacz na instrukcję UPDATE na tabeli Employees, to UPDATE na tej tabeli nie dojdzie do skutku, natomiast wydarzy się to co zamiast tego zrobi wyzwalacz.

Wyzwalacze DML - INSTEAD OF: Wyzwalacze (triggery) w SQL

Spróbujmy teraz pracownikom z działu o numerze 90 przypisać nowe imie – 'Janusz'.

Wyzwalacze DML - INSTEAD OF: Wyzwalacze (triggery) w SQL (2)

Jak widać dostajemy stosowny komunikat z wyzwalacz – "AKTUALIZACJA 3 WIERSZA/Y NIE POWIODŁA SIĘ" a pod spodem jeszcze informacja ilu wierszy by ten UPDATE rzeczywiście dotyczył.

Wyzwalacze DDL

Chcąc śledzić na bazie danych instrukcje z grupy DDL wystarczy załozyć odpowiedni wyzwalacz i skorzystać w nim z funkcji EVENTDATA().

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL

Teraz stworzymy przykładową tabelę:

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (2)

Funkcja EVENTDATA() zwraca w formie XML informacje co się wydarzyło na bazie danych.

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (3)

Wystarczy odpowiednio zmodyfikować zwracany wynik, i możemy w formie wierszy w tabeli śledzić poczynania użytkowników na bazie danych.

Najpierw przygotujemy odpowiednią tabelę na nasze śledzenie, gdzie będziemy gromadzili informacje m.in. o tym kto, kiedy i jakim poleceniem tworzył tabele:

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (4)

Teraz zmodyfikujemy wyzwalacz AudytDDL, w którym skorzystamy z przedstawionej już funkcji EVENTDATA() i z wyniku zwróconego przez nią pobierzemy odpowiednie informacje, ktore to potem umieścimy w odpowiednich kolumnach w tabeli "LogiDDL"

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (5)

Standardowe rozwiązanie, jeśli tabela "Tabelka" istnieje to ma zostać usunięta, po czym leci instrukcja tworząca od podstaw taką tabelę.

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (6)

W tabeli "LogiDDL" mamy pełen wpis o tym co się właśnie wydarzyło na bazie danych:

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (7)

Aby usunąć taki wyzwalacz należy skorzystać ze specjalnego polecenia:

"DROP TRIGGER AuditDDL ON ALL SERVER".

Wyzwalacze DDL: Wyzwalacze (triggery) w SQL (8)

Wyzwalacze LOGON

Wyzwalaczami typu LOGON powinni się zajmować wyłącznie doświadczeni administratorzy, ponieważ najmniejszy błąd i może się okazać że są problemy z podłączeniem się do serwera.

Przykładowy kod tworzący taki wyzwalacz wraz z tabelą w której będą gromadzone wpisy o logowaniach.

Wyzwalacze LOGON: Wyzwalacze (triggery) w SQL

Wyzwalacze LOGON: Wyzwalacze (triggery) w SQL (2)

I efekty po zalogowaniu sie do serwera:

Wyzwalacze LOGON: Wyzwalacze (triggery) w SQL (3)

Aby usunąć taki wyzwalacz należy skorzystać ze specjalnego polecenia:

"DROP TRIGGER AuditLogon ON ALL SERVER".

 

 

Baner szkolenia Kompleksowe SQL w Microsoft SQL Server w JSystems, terminy gwarantowane

Szkolenie Kompleksowe SQL w Microsoft SQL Server →

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Na jakie zdarzenia mogą reagować wyzwalacze w T-SQL?
Wyzwalacze dzielimy na trzy grupy. Wyzwalacze DML reagują na INSERT, UPDATE, DELETE lub MERGE na tabelach. Wyzwalacze DDL uruchamiają się przy poleceniach CREATE, ALTER i DROP. Wyzwalacze logowania reagują na zdarzenia typu LOGON.
Do czego służą wirtualne tabele inserted i deleted?
W wyzwalaczu masz dostęp do wirtualnych tabel inserted i deleted, które pokazują, co zostało wstawione, zmienione lub usunięte. Tabelę inserted daje INSERT i UPDATE, tabelę deleted daje DELETE i UPDATE. Zestawiając obie, porównasz stan przed zmianą i po niej.
Jak zapobiec działaniu wyzwalacza, gdy UPDATE nie zmienił żadnego wiersza?
Wyzwalacz uruchamia się nawet wtedy, gdy polecenie nie zmieniło danych. Aby tego uniknąć, w kodzie wyzwalacza użyj instrukcji warunkowej IF i zmiennej systemowej @@ROWCOUNT, która mówi, ile wierszy zostało zmodyfikowanych, i pomiń logikę przy zerze.
Czym różni się wyzwalacz INSTEAD OF od AFTER?
Wyzwalacz INSTEAD OF działa zamiast instrukcji, na którą został założony. Jeśli założysz go na UPDATE, sam UPDATE nie dojdzie do skutku, a wykona się to, co zdefiniowano w wyzwalaczu. Wyzwalacz AFTER działa po wykonaniu instrukcji.
Jak śledzić operacje DDL na bazie danych?
Załóż wyzwalacz DDL i skorzystaj w nim z funkcji EVENTDATA, która zwraca w formacie XML informacje o tym, co się wydarzyło. Z tego wyniku wyciągasz między innymi kto, kiedy i jakim poleceniem działał, i zapisujesz to do własnej tabeli audytu.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...