Wyzwalacz bazy danych
Wyzwalacz bazy danych to kod proceduralny , który jest automatycznie wykonywany w odpowiedzi na określone zdarzenia w określonej tabeli lub widoku w bazie danych . Wyzwalacz jest najczęściej używany do zachowania integralności informacji w bazie danych. Np. w przypadku dodania nowego rekordu (reprezentującego nowego pracownika) do tabeli pracowników, nowe rekordy powinny zostać utworzone również w tabelach podatków, urlopów i wynagrodzeń. Wyzwalacze mogą być również wykorzystywane do rejestrowania danych historycznych, na przykład do śledzenia poprzednich wynagrodzeń pracowników.
Wyzwalacze w DBMS
Poniżej znajduje się seria opisów wyzwalaczy obsługi niektórych popularnych systemów DBMS .
Wyrocznia
Oprócz wyzwalaczy, które uruchamiają (i wykonują kod PL/SQL ) podczas modyfikowania danych, Oracle 10g obsługuje wyzwalacze, które są uruchamiane, gdy obiekty na poziomie schematu (tj. tabele) są modyfikowane oraz gdy występują zdarzenia logowania lub wylogowania użytkownika.
Wyzwalacze na poziomie schematu
- Po Stworzeniu
- Przed Alterem
- Po Alterze
- Przed upadkiem
- Po upuszczeniu
- Przed wstawieniem
Cztery główne typy wyzwalaczy to:
- Wyzwalacz na poziomie wiersza: jest wykonywany przed lub po zmianie dowolnej wartości kolumny w wierszu
- Wyzwalacz na poziomie kolumny: jest wykonywany przed lub po zmianie określonej kolumny
- Dla każdego typu wiersza: Ten wyzwalacz jest wykonywany raz dla każdego wiersza zestawu wyników, na który ma wpływ wstawienie/aktualizacja/usunięcie
- Dla każdego typu instrukcji: ten wyzwalacz jest wykonywany tylko raz dla całego zestawu wyników, ale uruchamia się również za każdym razem, gdy wykonywana jest instrukcja.
Wyzwalacze na poziomie systemu
Od wersji Oracle 8i zdarzenia w bazie danych — logowanie, wylogowanie, uruchamianie — mogą uruchamiać wyzwalacze Oracle.
Serwer Microsoft SQL
Lista wszystkich dostępnych zdarzeń wyzwalania w programie Microsoft SQL Server dla wyzwalaczy DDL jest dostępna w witrynie Microsoft Docs .
Wykonywanie akcji warunkowych w wyzwalaczach (lub testowanie danych po modyfikacji) odbywa się poprzez dostęp do tymczasowych tabel Wstawione i Usunięte .
PostgreSQL
Wprowadzono obsługę wyzwalaczy w 1997 r. Następująca funkcjonalność w SQL:2003 nie była wcześniej zaimplementowana w PostgreSQL:
- SQL pozwala uruchamiać wyzwalacze w przypadku aktualizacji określonych kolumn; Od wersji 9.0 PostgreSQL ta funkcja jest również zaimplementowana w PostgreSQL.
- Standard pozwala na wykonanie wielu instrukcji SQL innych niż SELECT , INSERT , UPDATE , takich jak CREATE TABLE jako akcja wyzwalająca. Można to zrobić, tworząc procedurę składowaną lub funkcję wywołującą CREATE TABLE.
Streszczenie:
UTWÓRZ nazwę WYZWALACZA { PRZED | PO } { zdarzenie [ LUB ... ] } NA TABELI [ DLA [ KAŻDEGO ] { WIERSZ | INSTRUKCJA } ] WYKONANIE PROCEDURY nazwa funkcji ( argumenty )
ognisty Ptak
Firebird obsługuje wiele wyzwalaczy na poziomie wiersza, PRZED lub PO, INSERT, UPDATE, DELETE (lub dowolną ich kombinację) na tabelę, przy czym są one zawsze „oprócz” domyślnych zmian w tabeli, a kolejność wyzwalaczy względem każdego other można określić tam, gdzie w przeciwnym razie byłoby to niejednoznaczne (klauzula POSITION). Wyzwalacze mogą również istnieć w widokach, gdzie zawsze są wyzwalaczami „zamiast”, zastępując domyślną aktualizowalną logikę widoku. (Przed wersją 2.1 wyzwalacze w widokach uznanych za możliwe do aktualizacji byłyby uruchamiane oprócz domyślnej logiki).
Firebird nie zgłasza mutujących wyjątków tabel (jak Oracle), a wyzwalacze będą domyślnie zarówno zagnieżdżać, jak i rekursować zgodnie z wymaganiami (SQL Server domyślnie zezwala na zagnieżdżanie, ale nie na rekursję). ,) i udostępnij flagi AKTUALIZACJA, WSTAWIANIE i USUWANIE, aby wskazać bieżące użycie wyzwalacza.
{ UTWÓRZ | ODTWORZ | CREATE OR ALTER } TRIGGER nazwa DLA { nazwa tabeli | nazwa widoku } [ AKTYWNE | NIEAKTYWNE ] { PRZED | PO } { WSTAW [ LUB AKTUALIZUJ ] [ LUB USUŃ ] | AKTUALIZUJ [ LUB WSTAW ] [ LUB USUŃ ] | USUŃ [ LUB AKTUALIZUJ ] [ LUB WSTAW ] } [ POZYCJA n ] AS BEGIN .... END
Od wersji 2.1 Firebird dodatkowo obsługuje następujące wyzwalacze na poziomie bazy danych:
- CONNECT (zgłoszone tutaj wyjątki uniemożliwiają nawiązanie połączenia)
- ROZŁĄCZYĆ SIĘ
- ROZPOCZĘCIE TRANSAKCJI
- ZATWIERDZENIE TRANSAKCJI (podane tutaj wyjątki uniemożliwiają zatwierdzenie transakcji lub przygotowanie, jeśli zaangażowane jest zatwierdzenie dwufazowe)
- WYCOFANIE TRANSAKCJI
Wyzwalacze na poziomie bazy danych mogą pomóc w egzekwowaniu ograniczeń dotyczących wielu tabel lub emulowaniu zmaterializowanych widoków . Jeśli w wyzwalaczu TRANSACTION COMMIT zostanie zgłoszony wyjątek, zmiany dokonane do tej pory przez wyzwalacz są wycofywane i aplikacja kliencka jest powiadamiana, ale transakcja pozostaje aktywna, tak jakby nigdy nie zażądano COMMIT; aplikacja kliencka może kontynuować wprowadzanie zmian i ponownie żądać polecenia COMMIT.
Składnia wyzwalaczy bazy danych:
{ UTWÓRZ | ODTWORZ | CREATE OR ALTER } TRIGGER name [ ACTIVE | NIEAKTYWNE ] NA { POŁĄCZ | ODŁĄCZ | ROZPOCZĘCIE TRANSAKCJI | ZATWIERDZENIE TRANSAKCJI | WYCOFANIE TRANSAKCJI } [ POZYCJA n ] JAK POCZĄTEK ..... KONIEC
MySQL/MariaDB
Ograniczona obsługa wyzwalaczy w MySQL/MariaDB DBMS została dodana w wersji 5.0 MySQL, uruchomionej w 2005 roku.
Od wersji 8.0 pozwalają na wyzwalacze DDL (język definicji danych) i wyzwalacze DML (język manipulacji danymi). Pozwalają również na użycie dowolnego typu wyzwalacza DDL (PO lub PRZED) do definiowania wyzwalaczy. Są one tworzone przy użyciu klauzuli CREATE TRIGGER i usuwane przy użyciu klauzuli DROP TRIGGER . Instrukcja wywoływana po wystąpieniu zdarzenia jest zdefiniowana po klauzuli FOR EACH ROW , po której następuje słowo kluczowe ( SET lub BEGIN ), które wskazuje, czy następuje odpowiednio wyrażenie, czy instrukcja.
IBM DB2 LUW
IBM DB2 dla systemów rozproszonych znany jako DB2 for LUW (LUW oznacza Linux , Unix , Windows ) obsługuje trzy typy wyzwalaczy: Przed wyzwalaczem, Po wyzwalaczu i Zamiast wyzwalacza. Obsługiwane są zarówno wyzwalacze na poziomie instrukcji, jak i na poziomie wiersza. Jeśli w tabeli jest więcej wyzwalaczy dla tej samej operacji, kolejność wyzwalania jest określana na podstawie danych tworzenia wyzwalacza. Od wersji 9.7 IBM DB2 obsługuje transakcje autonomiczne.
Przed wyzwalaniem służy do sprawdzania danych i podejmowania decyzji, czy operacja powinna być dozwolona. Jeśli wyjątek zostanie zgłoszony przed wyzwalaczem, operacja zostanie przerwana i żadne dane nie zostaną zmienione. W DB2 przed wyzwalaczami są tylko do odczytu — nie można modyfikować danych w przed wyzwalaczami. Po zaprojektowaniu wyzwalaczy do przetwarzania końcowego po wykonaniu żądanej zmiany. Po wyzwalaczach można zapisywać dane w tabelach iw przeciwieństwie do niektórych [ które? ] innych baz danych, które możesz zapisać w dowolnej tabeli, w tym w tabeli, na której działa wyzwalacz. Zamiast wyzwalaczy służą do tworzenia widoków z możliwością zapisu.
Wyzwalacze są najczęściej programowane w języku SQL PL .
SQLite
UTWÓRZ [ TEMP | TYMCZASOWY ] WYZWALACZ [ JEŚLI NIE ISTNIEJE ] [ nazwa_bazy_danych .] nazwa_wyzwalacza [ PRZED | PO | ZAMIAST ] { USUŃ | _ WSTAW | UPDATE [ OF nazwa_kolumny [, nazwa_kolumny ]...] } ON { nazwa_tabeli | view_name } [ DLA KAŻDEGO WIERSZA ] [ GDY warunek jest obowiązkowy ] BEGIN ... END
SQLite obsługuje tylko wyzwalacze na poziomie wiersza, a nie wyzwalacze na poziomie instrukcji.
Widoki z możliwością aktualizacji, które nie są obsługiwane w oprogramowaniu SQLite, można emulować za pomocą wyzwalaczy INSTEAD OF.
Bazy danych XML
Przykładem implementacji wyzwalaczy w nierelacyjnej bazie danych może być Sedna , która zapewnia obsługę wyzwalaczy opartych na XQuery . Wyzwalacze w Sednie zostały zaprojektowane tak, aby były analogiczne do SQL: 2003 , ale natywnie bazują na językach zapytań i aktualizacji XML ( XPath , XQuery i język aktualizacji XML).
Wyzwalacz w Sednie jest ustawiany na dowolne węzły dokumentu XML przechowywanego w bazie danych. Kiedy te węzły są aktualizowane, wyzwalacz automatycznie wykonuje zapytania XQuery i aktualizuje określone w jego treści. Na przykład następujący wyzwalacz anuluje usunięcie węzła osoby, jeśli istnieją jakieś otwarte aukcje, do których odwołuje się ta osoba:
UTWÓRZ WYZWALANIE "trigger3" PRZED USUNIĘCIEM NA doc( "auction" )/ site // person DLA KAŻDEGO WĘZŁA DO { if ( istnieje ( $ WHERE // open_auction / bidder / personref / @person = $ OLD / @id )) then ( ) inny $ STARY ; }
Wyzwalacze na poziomie wierszy i instrukcji
Aby zrozumieć, jak działa zachowanie wyzwalacza, musisz znać dwa główne typy wyzwalaczy; są to wyzwalacze na poziomie wierszy i instrukcji. Różnica między nimi polega na tym, ile razy kod w wyzwalaczu jest wykonywany iw jakim czasie.
Załóżmy, że masz wyzwalacz, który ma być wywoływany w AKTUALIZACJI do określonej tabeli. Wyzwalacze na poziomie wiersza byłyby wykonywane raz dla każdego wiersza, na który ma wpływ AKTUALIZACJA. Należy pamiętać, że jeśli polecenie UPDATE nie wpłynie na żadne wiersze, wyzwalacz nie wykona żadnego kodu w wyzwalaczu. Wyzwalacze na poziomie instrukcji będą wywoływane raz, niezależnie od tego, ile wierszy dotyczy AKTUALIZACJA. W tym miejscu należy zauważyć, że nawet jeśli polecenie UPDATE nie wpłynęło na żadne wiersze, kod w wyzwalaczu zostanie wykonany raz.
Za pomocą opcji PRZED i PO określ, kiedy wyzwalacz zostanie wywołany. Załóżmy, że masz wyzwalacz, który jest wywoływany na INSERT do określonej tabeli. Jeśli twój wyzwalacz używa opcji PRZED, kod w wyzwalaczu zostanie wykonany przed wystąpieniem INSERT w tabeli. Typowym zastosowaniem wyzwalacza PRZED jest weryfikacja wartości wejściowych INSERT lub odpowiednia modyfikacja wartości. Teraz powiedzmy, że mamy wyzwalacz, który zamiast tego używa AFTER. Kod w wyzwalaczu jest wykonywany po wystąpieniu INSERT w tabeli. Przykładowym zastosowaniem tego wyzwalacza jest tworzenie historii audytu tego, kto dokonał wpisów do bazy danych, śledzenie wprowadzonych zmian. Korzystając z tych opcji, należy pamiętać o kilku rzeczach. Opcja PRZED nie pozwala na modyfikację tabel, dlatego walidacja danych wejściowych jest praktycznym zastosowaniem. Korzystanie z wyzwalaczy AFTER umożliwia modyfikowanie tabel, na przykład wstawianie ich do tabeli historii audytu.
Podczas tworzenia wyzwalacza w celu określenia, czy jest to instrukcja, czy wiersz, po prostu dołącz klauzulę FOR EACH ROW dla poziomu wiersza lub pomiń klauzulę dla poziomu instrukcji. Zachowaj ostrożność podczas używania dodatkowych INSERT / UPDATE / DELETE w wyzwalaczu, ponieważ rekurencja wyzwalacza jest możliwa i powoduje niepożądane zachowanie. W poniższych przykładach każdy wyzwalacz modyfikuje inną tabelę, patrząc na to, co jest modyfikowane, można zobaczyć kilka typowych zastosowań, gdy używane są różne typy wyzwalaczy.
Poniżej znajduje się przykład składni Oracle wyzwalacza na poziomie wiersza, który jest wywoływany PO aktualizacji DLA KAŻDEGO WIERSZA, którego to dotyczy. Ten wyzwalacz jest wywoływany przy aktualizacji bazy danych książki telefonicznej. Po wywołaniu wyzwalacza dodaje on wpis do oddzielnej tabeli o nazwie phone_book_audit. Zwróć również uwagę na wyzwalacze, które mogą korzystać z obiektów schematu, takich jak sekwencje. W tym przykładzie audit_id_sequence.nexVal służy do generowania unikalnych kluczy podstawowych w tabeli phone_book_audit.
UTWÓRZ LUB ZAMIEŃ WYZWALACZ phone_book_audit PO UPDATE ON phone_book DLA KAŻDEGO WIERSZA ROZPOCZNIJ WSTAWIANIE DO phone_book_audit ( audit_id , audit_change , audit_l_name , audit_f_name , audit_old_phone_number , audit_new_phone_number , audit_date ) WARTOŚCI ( Audit_id_sequence . nextVal , ' Update ' , : OLD .nazwisko , : OLD .imię , : STARY numer_telefonu ,: NOWY numer_telefonu , SYSDATE ) ; _ _ KONIEC ;
Teraz dzwonię na AKTUALIZACJĘ w tabeli phone_book dla osób o nazwisku „Jones”.
UPDATE phone_book SET phone_number = '111-111-1111' WHERE last_name = 'Jones' ;
Audit_ID | Audit_Change | F_Nazwa | L_Nazwa | Nowy_numer_telefonu | Stary_numer_telefonu | Data_audytu |
---|---|---|---|---|---|---|
1 | Aktualizacja | Jordania | Jonesa | 111-111-1111 | 098-765-4321 | 02-MAJ-14 |
2 | Aktualizacja | Megan | Jonesa | 111-111-1111 | 111-222-3456 | 02-MAJ-14 |
Zauważ, że tabela phone_number_audit jest teraz wypełniona dwoma wpisami. Wynika to z faktu, że w bazie danych znajdują się dwa wpisy o nazwisku „Jones”. Ponieważ aktualizacja zmodyfikowała dwie oddzielne wartości wierszy, utworzony wyzwalacz został wywołany dwukrotnie; raz po każdej modyfikacji.
Po — wyzwalacz na poziomie instrukcji
Wyzwalacz instrukcji składni Oracle, który jest wywoływany po UPDATE w tabeli phone_book. Gdy wyzwalacz zostanie wywołany, wstawia się do tabeli phone_book_edit_history
UTWÓRZ LUB ZAMIEŃ WYZWALACZ phone_book_history PO UPDATE ON phone_book ROZPOCZNIJ WSTAWIANIE DO phone_book_edit_history ( identyfikator_historii_audytu , nazwa_użytkownika , modyfikacja , data_edycji ) WARTOŚCI ( sekwencja_id_historii audytu . następna wartość , USER , 'Update' , SYSDATE ); KONIEC ;
Teraz wykonuje dokładnie tę samą aktualizację, co w powyższym przykładzie, jednak tym razem z wyzwalaczem na poziomie instrukcji.
UPDATE phone_book SET phone_number = '111-111-1111' WHERE last_name = 'Jones' ;
Audit_History_ID | Nazwa użytkownika | Modyfikacja | Data edycji |
---|---|---|---|
1 | HAUSCHBC | Aktualizacja | 02-MAJ-14 |
Wynik pokazuje, że wyzwalacz został wywołany tylko raz, mimo że aktualizacja zmieniła dwa wiersze.
Przed każdym — wyzwalacz na poziomie wiersza
Ten przykład ilustruje wyzwalacz PRZED KAŻDYM ROWEM, który modyfikuje INSERT przy użyciu warunku WHEN. Jeśli nazwisko jest dłuższe niż 10 liter, za pomocą funkcji SUBSTR zmieniamy wartość kolumny last_name na skrót.
0
UTWÓRZ LUB ZAMIEŃ WYZWALACZ phone_book_insert PRZED WSTAWIENIEM NA phone_book DLA KAŻDEGO WIERSZA GDY ( DŁUGOŚĆ ( nowe.nazwisko ) > 10 ) POCZĄTEK : nowy . _ _ nazwisko_nazwisko : = SUBSTR (: nowy . nazwisko_nazwisko , , 1 ); KONIEC ;
Teraz wykonuję INSERT osoby o dużym nazwisku.
WSTAW DO WARTOŚCI książki_telefonicznej ( 6 , 'VeryVeryLongLastName' , 'Erin' , 'Minneapolis' , 'MN' , '989 University Drive' , '123-222-4456' , 55408 , TO_DATE ( '11/21/1991' , ' MM/DD/RRRR' ));
Identyfikator_osoby | Nazwisko | Imię | Miasto | Skrót_stanu | Adres | Numer telefonu | Kod pocztowy | Data urodzenia |
---|---|---|---|---|---|---|---|---|
6 | V | Erin | Minneapolis | MN | 989 Napęd Uniwersytecki | 123-222-4456 | 55408 | 21-listopad-91 |
Wyzwalacz działał zgodnie z powyższym wynikiem, modyfikując wartość INSERT przed jego wykonaniem.
Przed — wyzwalacz na poziomie instrukcji
Użycie wyzwalacza instrukcji BEFORE jest szczególnie przydatne podczas wymuszania ograniczeń bazy danych. Ten przykład pokazuje, jak wymusić ograniczenie na osobie o imieniu „SOMEUSER” w tabeli phone_book.
UTWÓRZ LUB WYMIEŃ TRIGGER hauschbc PRZED WSTAWIENIEM NA NIEKTÓREGO UŻYTKOWNIKA . phone_book BEGIN RAISE_APPLICATION_ERROR ( num => - 20050 , msg => 'Tutaj trafia komunikat o błędzie.' ); KONIEC ;
Teraz, gdy „SOMEUSER” jest zalogowany po próbie WSTAWIENIA, ten komunikat o błędzie wyświetli:
Błąd SQL: ORA-20050: Tutaj pojawia się komunikat o błędzie.
Niestandardowe błędy, takie jak ten, mają ograniczenia co do tego, jak można zdefiniować zmienną num. Ze względu na liczne inne predefiniowane błędy, zmienna ta musi mieścić się w zakresie od -20000 do -20999.
Linki zewnętrzne
- WYZWALACZ UPADKU Microsoft SQL Server
- Wyzwalacze bazy danych MySQL
- MySQL DB Utwórz wyzwalacze
- Instrukcja DB2 CREATE TRIGGER
- Oracle UTWÓRZ WYZWALACZ
- PostgreSQL TWORZENIE WYZWALACZA
- Oracle Mutating Table Problems with DELETE CASCADE
- Język zapytań SQLite: CREATE TRIGGER
- Dokumentacja Oracle dotycząca wyzwalaczy